Imports
/-
Copyright (c) 2025 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Nikolai Kashcheev, Joseph Tooby-Smith
-/
module
public import Physlib.Relativity.Tensors.ComplexTensor.BasicComplex Lorentz tensors from real Lorentz tensors
i. Overview
In this module we describe how to pass from real Lorentz tensors to complex Lorentz tensors in a functorial way. Specifically, we construct a canonical equivariant semilinear map
toComplex : ℝT(3, c) →ₛₗ[Complex.ofRealHom] ℂT(colorToComplex ∘ c)
which is compatible with the natural operations on tensors (permutations of indices, tensor products, contractions and evaluations).
ii. Key results
The main definitions and statements are:
colorToComplex upgrades the colour of a real Lorentz tensor to the
corresponding complex Lorentz colour.
TensorSpecies.Tensor.ComponentIdx.complexify transports component indices
along colorToComplex.
toComplex is the basic semilinear map from real to complex Lorentz tensors.
toComplex_basis and toComplex_pure_basisVector show that toComplex
sends basis tensors to basis tensors.
toComplex_eq_zero_iff and toComplex_injective show that toComplex is
injective.
toComplex_equivariant states that toComplex is equivariant for the action
of the complexified Lorentz group.
permT_toComplex, prodT_toComplex, contrT_toComplex and evalT_toComplex
express that toComplex commutes with the basic tensor operations.
iii. Table of contents
A. Colours and component indices
B. The semilinear map toComplex
B.1. Expression in the tensor basis
B.2. Behaviour on basis vectors and injectivity
B.3. Equivariance under the Lorentz action
C. Compatibility with permutations: permT
D. Compatibility with tensor products: prodT
E. Compatibility with contraction: contrT
F. Compatibility with evaluation: evalT
iv. References
The general formalism of Lorentz tensors and their operations is developed in other parts of the library; here we only specialise to the passage from real to complex Lorentz tensors.
@[expose] public sectionA. Colours and component indices
We first explain how the Lorentz colour data and component indices for real tensors are transported to the complex setting.
The map from colors of real Lorentz tensors to complex Lorentz tensors.
def colorToComplex (c : realLorentzTensor.Color) : complexLorentzTensor.Color :=
match c with
| .up => .up
| .down => .downlemma repDim_colorToComplex {c : realLorentzTensor.Color} :
complexLorentzTensor.repDim (colorToComplex c) = 4 := c:Color⊢ repDim (colorToComplex c) = 4
⊢ repDim (colorToComplex Color.up) = 4⊢ repDim (colorToComplex Color.down) = 4 ⊢ repDim (colorToComplex Color.up) = 4⊢ repDim (colorToComplex Color.down) = 4 All goals completed! 🐙
simp helper: reduce match c j after a case split on c j
(avoids dependent rw / Pi.smul_apply).
All goals completed! 🐙
lemma colorToComplex_match_down {n} {c : Fin n → realLorentzTensor.Color} {j}
(hc : c j = realLorentzTensor.Color.down) :
(match c j with
| .up => complexLorentzTensor.Color.up
| .down => complexLorentzTensor.Color.down)
= complexLorentzTensor.Color.down := by n:ℕc:Fin n → Colorj:Fin nhc:c j = Color.down⊢ (match c j with
| Color.up => complexLorentzTensor.Color.up
| Color.down => complexLorentzTensor.Color.down) =
complexLorentzTensor.Color.down
rw [hc n:ℕc:Fin n → Colorj:Fin nhc:c j = Color.down⊢ (match Color.down with
| Color.up => complexLorentzTensor.Color.up
| Color.down => complexLorentzTensor.Color.down) =
complexLorentzTensor.Color.down All goals completed! 🐙] All goals completed! 🐙lemma colorToComplex_comp_eq_match {n} (c : Fin n → realLorentzTensor.Color) (j : Fin n) :
(colorToComplex ∘ c) j =
(match c j with
| .up => complexLorentzTensor.Color.up
| .down => complexLorentzTensor.Color.down) := by n:ℕc:Fin n → Colorj:Fin n⊢ (colorToComplex ∘ c) j =
match c j with
| Color.up => complexLorentzTensor.Color.up
| Color.down => complexLorentzTensor.Color.down
cases hc : c j up n:ℕc:Fin n → Colorj:Fin nhc:c j = Color.up⊢ (colorToComplex ∘ c) j =
match Color.up with
| Color.up => complexLorentzTensor.Color.up
| Color.down => complexLorentzTensor.Color.downdown n:ℕc:Fin n → Colorj:Fin nhc:c j = Color.down⊢ (colorToComplex ∘ c) j =
match Color.down with
| Color.up => complexLorentzTensor.Color.up
| Color.down => complexLorentzTensor.Color.down <;> up n:ℕc:Fin n → Colorj:Fin nhc:c j = Color.up⊢ (colorToComplex ∘ c) j =
match Color.up with
| Color.up => complexLorentzTensor.Color.up
| Color.down => complexLorentzTensor.Color.downdown n:ℕc:Fin n → Colorj:Fin nhc:c j = Color.down⊢ (colorToComplex ∘ c) j =
match Color.down with
| Color.up => complexLorentzTensor.Color.up
| Color.down => complexLorentzTensor.Color.down simp [colorToComplex, hc] All goals completed! 🐙@[simp]
lemma ComponentIdx.complexify_apply {n} {c : Fin n → realLorentzTensor.Color}
(f : ComponentIdx (S := realLorentzTensor) c) (j : Fin n) :
(ComponentIdx.complexify f) j = Fin.cast repDim_colorToComplex.symm (finSumFinEquiv (f j)) :=
rfl@[simp]
lemma ComponentIdx.complexify_toFun_apply {n} {c : Fin n → realLorentzTensor.Color}
(f : ComponentIdx (S := realLorentzTensor) c) (j : Fin n) :
(ComponentIdx.complexify.toFun f) j = (ComponentIdx.complexify f) j :=
rfl
B. The semilinear map toComplex
We now define the basic semilinear map from real Lorentz tensors to complex Lorentz tensors. It is characterised by sending the standard tensor basis on the real side to the corresponding basis on the complex side, and is therefore determined by the behaviour on components.
lemma toComplex_eq_sum_basis {n} (c : Fin n → realLorentzTensor.Color) (v : ℝT(3, c)) :
toComplex v = ∑ i, (Tensor.basis (S := realLorentzTensor) c).repr v
(ComponentIdx.complexify.symm i) •
Tensor.basis (S := complexLorentzTensor) (colorToComplex ∘ c) i := by n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ toComplex v = ∑ i, ((Tensor.basis c).repr v) (ComponentIdx.complexify.symm i) • (Tensor.basis (colorToComplex ∘ c)) i
rw [← Equiv.sum_comp ComponentIdx.complexify n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ toComplex v =
∑ i,
((Tensor.basis c).repr v) (ComponentIdx.complexify.symm (ComponentIdx.complexify i)) •
(Tensor.basis (colorToComplex ∘ c)) (ComponentIdx.complexify i) n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ toComplex v =
∑ i,
((Tensor.basis c).repr v) (ComponentIdx.complexify.symm (ComponentIdx.complexify i)) •
(Tensor.basis (colorToComplex ∘ c)) (ComponentIdx.complexify i)] n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ toComplex v =
∑ i,
((Tensor.basis c).repr v) (ComponentIdx.complexify.symm (ComponentIdx.complexify i)) •
(Tensor.basis (colorToComplex ∘ c)) (ComponentIdx.complexify i)
exact Finset.sum_congr rfl fun i _ => by n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ci:ComponentIdx cx✝:i ∈ Finset.univ⊢ ((Tensor.basis c).repr v) i • (Tensor.basis (colorToComplex ∘ c)) (ComponentIdx.complexify i) =
((Tensor.basis c).repr v) (ComponentIdx.complexify.symm (ComponentIdx.complexify i)) •
(Tensor.basis (colorToComplex ∘ c)) (ComponentIdx.complexify i) simp All goals completed! 🐙
The representation of toComplex v in the complexified basis equals
the real representation coerced to complex.
lemma toComplex_repr {n} {c : Fin n → realLorentzTensor.Color}
(v : ℝT(3, c)) (i : ComponentIdx (S := realLorentzTensor) c) :
(Tensor.basis (S := complexLorentzTensor) (colorToComplex ∘ c)).repr
(toComplex v) i.complexify =
↑((Tensor.basis (S := realLorentzTensor) c).repr v i) := by n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ci:ComponentIdx c⊢ ((Tensor.basis (colorToComplex ∘ c)).repr (toComplex v)) (ComponentIdx.complexify i) = ↑(((Tensor.basis c).repr v) i)
rw [toComplex_eq_sum_basis, n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ci:ComponentIdx c⊢ ((Tensor.basis (colorToComplex ∘ c)).repr
(∑ i, ((Tensor.basis c).repr v) (ComponentIdx.complexify.symm i) • (Tensor.basis (colorToComplex ∘ c)) i))
(ComponentIdx.complexify i) =
↑(((Tensor.basis c).repr v) i) n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ci:ComponentIdx c⊢ (∑ x,
(Tensor.basis (colorToComplex ∘ c)).repr
(((Tensor.basis c).repr v) (ComponentIdx.complexify.symm x) • (Tensor.basis (colorToComplex ∘ c)) x))
(ComponentIdx.complexify i) =
↑(((Tensor.basis c).repr v) i) map_sum n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ci:ComponentIdx c⊢ (∑ x,
(Tensor.basis (colorToComplex ∘ c)).repr
(((Tensor.basis c).repr v) (ComponentIdx.complexify.symm x) • (Tensor.basis (colorToComplex ∘ c)) x))
(ComponentIdx.complexify i) =
↑(((Tensor.basis c).repr v) i) n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ci:ComponentIdx c⊢ (∑ x,
(Tensor.basis (colorToComplex ∘ c)).repr
(((Tensor.basis c).repr v) (ComponentIdx.complexify.symm x) • (Tensor.basis (colorToComplex ∘ c)) x))
(ComponentIdx.complexify i) =
↑(((Tensor.basis c).repr v) i)] n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ci:ComponentIdx c⊢ (∑ x,
(Tensor.basis (colorToComplex ∘ c)).repr
(((Tensor.basis c).repr v) (ComponentIdx.complexify.symm x) • (Tensor.basis (colorToComplex ∘ c)) x))
(ComponentIdx.complexify i) =
↑(((Tensor.basis c).repr v) i)
simp only [← Complex.coe_smul, map_smul, Finsupp.coe_finsetSum, Finset.sum_apply,
Finsupp.smul_apply, Basis.repr_self, Finsupp.single_apply, smul_eq_mul, mul_ite, mul_one,
mul_zero, Finset.sum_ite_eq', Finset.mem_univ, if_true, Equiv.symm_apply_apply] All goals completed! 🐙
toComplex sends basis elements to basis elements.
@[simp]
lemma toComplex_basis {n} {c : Fin n → realLorentzTensor.Color}
(i : ComponentIdx (S := realLorentzTensor) c) :
toComplex (c := c) ((Tensor.basis (S := realLorentzTensor) c) i) =
(Tensor.basis (S := complexLorentzTensor) (colorToComplex ∘ c)) i.complexify := by n:ℕc:Fin n → Colori:ComponentIdx c⊢ toComplex ((Tensor.basis c) i) = (Tensor.basis (colorToComplex ∘ c)) (ComponentIdx.complexify i)
simp only [toComplex, LinearMap.coe_mk, AddHom.coe_mk] n:ℕc:Fin n → Colori:ComponentIdx c⊢ ∑ i_1,
((Tensor.basis c).repr ((Tensor.basis c) i)) i_1 •
(Tensor.basis (colorToComplex ∘ c)) (ComponentIdx.complexify i_1) =
(Tensor.basis (colorToComplex ∘ c)) (ComponentIdx.complexify i)
simp [Finsupp.single_apply, ite_smul] All goals completed! 🐙
toComplex on a pure basis vector.
@[simp]
lemma toComplex_pure_basisVector {n} {c : Fin n → realLorentzTensor.Color}
(b : ComponentIdx (S := realLorentzTensor) c) :
toComplex (c := c) (Pure.basisVector c b |>.toTensor)
=
(Pure.basisVector (colorToComplex ∘ c) b.complexify).toTensor := by n:ℕc:Fin n → Colorb:ComponentIdx c⊢ toComplex (Pure.basisVector c b).toTensor = (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)).toTensor
simp [← Tensor.basis_apply] All goals completed! 🐙lemma toComplex_map_smul {n} (c : Fin n → realLorentzTensor.Color) (r : ℝ) (t : ℝT(3, c)) :
toComplex (c := c) (r • t) = (Complex.ofReal r) • toComplex (c := c) t :=
(toComplex (c := c)).map_smulₛₗ r t@[simp]
lemma toComplex_eq_zero_iff {n} (c : Fin n → realLorentzTensor.Color) (v : ℝT(3, c)) :
toComplex v = 0 ↔ v = 0 := by n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ toComplex v = 0 ↔ v = 0
constructor mp n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ toComplex v = 0 → v = 0mpr n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ v = 0 → toComplex v = 0
· mp n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ toComplex v = 0 → v = 0 intro h mp n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ch:toComplex v = 0⊢ v = 0
apply (Tensor.basis (S := realLorentzTensor) c).repr.injective mp n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ch:toComplex v = 0⊢ (Tensor.basis c).repr v = (Tensor.basis c).repr 0
ext i mp n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor ch:toComplex v = 0i:ComponentIdx c⊢ ((Tensor.basis c).repr v) i = ((Tensor.basis c).repr 0) i
simpa [h] using (toComplex_repr v i).symm All goals completed! 🐙
· mpr n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor c⊢ v = 0 → toComplex v = 0 rintro rfl mpr n:ℕc:Fin n → Color⊢ toComplex 0 = 0
simp All goals completed! 🐙
The map toComplex is injective.
lemma toComplex_injective {n} (c : Fin n → realLorentzTensor.Color) :
Function.Injective (toComplex (c := c)) :=
(injective_iff_map_eq_zero' toComplex).mpr (toComplex_eq_zero_iff c)pure
lemma toComplexVector_up_eq_inclCongrRealLorentz (v : Lorentz.ContrMod 3) :
toComplexVector Color.up v = Lorentz.inclCongrRealLorentz v := by v:Lorentz.ContrMod 3⊢ (toComplexVector Color.up) v = Lorentz.inclCongrRealLorentz v
trans ∑ i, v.toFin1dℝ i • Lorentz.complexContrBasis i v:Lorentz.ContrMod 3⊢ (toComplexVector Color.up) v = ∑ i, v.toFin1dℝ i • Lorentz.complexContrBasis iv:Lorentz.ContrMod 3⊢ ∑ i, v.toFin1dℝ i • Lorentz.complexContrBasis i = Lorentz.inclCongrRealLorentz v
· v:Lorentz.ContrMod 3⊢ (toComplexVector Color.up) v = ∑ i, v.toFin1dℝ i • Lorentz.complexContrBasis i simp [toComplexVector, Lorentz.contrBasis_repr_apply,
Lorentz.complexContrBasisFin4, Lorentz.ContrMod.toFin1dℝ_eq_val] All goals completed! 🐙
· v:Lorentz.ContrMod 3⊢ ∑ i, v.toFin1dℝ i • Lorentz.complexContrBasis i = Lorentz.inclCongrRealLorentz v conv_rhs => rw [Lorentz.ContrMod.stdBasis_decomp v] v:Lorentz.ContrMod 3| Lorentz.inclCongrRealLorentz (∑ i, v.toFin1dℝ i • Lorentz.ContrMod.stdBasis i)
simp only [map_sum, LinearMap.map_smulₛₗ, Complex.ofRealHom_eq_coe, Complex.coe_smul,
Lorentz.complexContrBasis_of_real] v:Lorentz.ContrMod 3⊢ ∑ x, v.toFin1dℝ x • Lorentz.inclCongrRealLorentz (Lorentz.ContrMod.stdBasis x) =
∑ x, v.toFin1dℝ x • Lorentz.inclCongrRealLorentz (Lorentz.ContrMod.stdBasis x)
rfl All goals completed! 🐙lemma toComplexVector_down_eq_inclCoRealLorentz (v : Lorentz.CoMod 3) :
toComplexVector Color.down v = Lorentz.inclCoRealLorentz v := by v:Lorentz.CoMod 3⊢ (toComplexVector Color.down) v = Lorentz.inclCoRealLorentz v
trans ∑ i, v.toFin1dℝ i • Lorentz.complexCoBasis i v:Lorentz.CoMod 3⊢ (toComplexVector Color.down) v = ∑ i, v.toFin1dℝ i • Lorentz.complexCoBasis iv:Lorentz.CoMod 3⊢ ∑ i, v.toFin1dℝ i • Lorentz.complexCoBasis i = Lorentz.inclCoRealLorentz v
· v:Lorentz.CoMod 3⊢ (toComplexVector Color.down) v = ∑ i, v.toFin1dℝ i • Lorentz.complexCoBasis i simp [toComplexVector, Lorentz.coBasis_repr_apply, Lorentz.complexCoBasisFin4] v:Lorentz.CoMod 3⊢ v.val (Sum.inl 0) • Lorentz.complexCoBasis (Sum.inl 0) +
∑ a₂, v.val (Sum.inr a₂) • Lorentz.complexCoBasis (Sum.inr a₂) =
v.toFin1dℝ (Sum.inl 0) • Lorentz.complexCoBasis (Sum.inl 0) +
∑ a₂, v.toFin1dℝ (Sum.inr a₂) • Lorentz.complexCoBasis (Sum.inr a₂)
rfl All goals completed! 🐙
· v:Lorentz.CoMod 3⊢ ∑ i, v.toFin1dℝ i • Lorentz.complexCoBasis i = Lorentz.inclCoRealLorentz v conv_rhs => rw [Lorentz.CoMod.stdBasis_decomp v] v:Lorentz.CoMod 3| Lorentz.inclCoRealLorentz (∑ i, v.toFin1dℝ i • Lorentz.CoMod.stdBasis i)
simp only [map_sum, LinearMap.map_smulₛₗ, Complex.ofRealHom_eq_coe, Complex.coe_smul,
Lorentz.complexCoBasis_of_real] v:Lorentz.CoMod 3⊢ ∑ x, v.toFin1dℝ x • Lorentz.inclCoRealLorentz (Lorentz.CoMod.stdBasis x) =
∑ x, v.toFin1dℝ x • Lorentz.inclCoRealLorentz (Lorentz.CoMod.stdBasis x)
rfl All goals completed! 🐙
lemma toComplexPure_component {c : Fin n → Color} (p : Pure realLorentzTensor c)
(φ : ComponentIdx c) : (toComplexPure p).component (ComponentIdx.complexify φ) =
p.component φ := by n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cφ:ComponentIdx c⊢ (toComplexPure p).component (ComponentIdx.complexify φ) = ↑(p.component φ)
simp [Pure.component, toComplexPure] n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cφ:ComponentIdx c⊢ ∏ x,
((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) (p x)))
(Fin.cast ⋯ (finSumFinEquiv (φ x))) =
∏ i,
↑(((match c i with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
(p i))
(φ i))
congr e_f n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cφ:ComponentIdx c⊢ (fun x =>
((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) (p x)))
(Fin.cast ⋯ (finSumFinEquiv (φ x)))) =
fun i =>
↑(((match c i with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
(p i))
(φ i))
funext x e_f n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cφ:ComponentIdx cx:Fin n⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) (p x)))
(Fin.cast ⋯ (finSumFinEquiv (φ x))) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
(p x))
(φ x))
generalize φ x = φx at * e_f n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cφ:ComponentIdx cx:Fin nφx:Fin 1 ⊕ Fin 3⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) (p x)))
(Fin.cast ⋯ (finSumFinEquiv φx)) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
(p x))
φx)
generalize p x = px at * e_f n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cφ:ComponentIdx cx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) px))
(Fin.cast ⋯ (finSumFinEquiv φx)) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
px)
φx)
clear φ p e_f n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) px))
(Fin.cast ⋯ (finSumFinEquiv φx)) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
px)
φx)
generalize_proofs h1 h2 h3 e_f n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h2:4 = repDim (colorToComplex (c x))h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) px))
(Fin.cast h2 (finSumFinEquiv φx)) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
px)
φx)
let b (c : Color) : Basis (Fin (complexLorentzTensor.repDim (colorToComplex c))) ℂ
(complexLorentzTensor.modules (colorToComplex c)) :=
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4 e_f n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h2:4 = repDim (colorToComplex (c x))h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) px))
(Fin.cast h2 (finSumFinEquiv φx)) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
px)
φx)
let b' (c : Color) : Basis (Fin 1 ⊕ Fin 3) ℝ (realLorentzTensor.modules 3 c) :=
(match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis : Basis (Fin 1 ⊕ Fin 3) ℝ (realLorentzTensor.modules 3 c)) e_f n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h2:4 = repDim (colorToComplex (c x))h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) px))
(Fin.cast h2 (finSumFinEquiv φx)) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
px)
φx)
let P (c : Color) (px : realLorentzTensor.modules 3 c) (φx : Fin 1 ⊕ Fin 3)
(h2 : 4 = repDim (colorToComplex c)) : Prop :=
((b c).repr
(toComplexVector c px))
(Fin.cast h2 (finSumFinEquiv φx)) =
↑(((b' c).repr
px)
φx) e_f n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h2:4 = repDim (colorToComplex (c x))h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) px))
(Fin.cast h2 (finSumFinEquiv φx)) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
px)
φx)
suffices h : P (c x) px φx h2 by n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h2:4 = repDim (colorToComplex (c x))h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)h:P (c x) px φx h2⊢ ((match colorToComplex (c x) with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4).repr
((toComplexVector (c x)) px))
(Fin.cast h2 (finSumFinEquiv φx)) =
↑(((match c x with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasis).repr
px)
φx) e_f n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h2:4 = repDim (colorToComplex (c x))h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)⊢ P (c x) px φx h2 exact h e_f n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h2:4 = repDim (colorToComplex (c x))h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)⊢ P (c x) px φx h2e_f n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3px:match c x with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h2:4 = repDim (colorToComplex (c x))h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)⊢ P (c x) px φx h2
generalize c x = c at * e_f n:ℕc✝:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)c:Colorpx:match c with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex c)⊢ P c px φx h2
fin_cases c e_f.«0» n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ P Color.up px φx h2e_f.«1» n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ P Color.down px φx h2
· e_f.«0» n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ P Color.up px φx h2 simp only [colorToComplex, toComplexVector, Nat.reduceAdd, Fin.cast_eq_self, P, b, b'] e_f.«0» n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ (Lorentz.complexContrBasisFin4.repr
({ toFun := fun v => ∑ x, (Lorentz.contrBasis.repr v) x • Lorentz.complexContrBasisFin4 (finSumFinEquiv x),
map_add' := ⋯, map_smul' := ⋯ }
px))
(finSumFinEquiv φx) =
↑((Lorentz.contrBasis.repr px) φx)
trans (∑ x, (Lorentz.complexContrBasisFin4.repr ((Lorentz.contrBasis.repr px) x •
Lorentz.complexContrBasisFin4 (finSumFinEquiv x))))
(finSumFinEquiv φx) n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ (Lorentz.complexContrBasisFin4.repr
({ toFun := fun v => ∑ x, (Lorentz.contrBasis.repr v) x • Lorentz.complexContrBasisFin4 (finSumFinEquiv x),
map_add' := ⋯, map_smul' := ⋯ }
px))
(finSumFinEquiv φx) =
(∑ x,
Lorentz.complexContrBasisFin4.repr
((Lorentz.contrBasis.repr px) x • Lorentz.complexContrBasisFin4 (finSumFinEquiv x)))
(finSumFinEquiv φx)n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ (∑ x,
Lorentz.complexContrBasisFin4.repr
((Lorentz.contrBasis.repr px) x • Lorentz.complexContrBasisFin4 (finSumFinEquiv x)))
(finSumFinEquiv φx) =
↑((Lorentz.contrBasis.repr px) φx)
· n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ (Lorentz.complexContrBasisFin4.repr
({ toFun := fun v => ∑ x, (Lorentz.contrBasis.repr v) x • Lorentz.complexContrBasisFin4 (finSumFinEquiv x),
map_add' := ⋯, map_smul' := ⋯ }
px))
(finSumFinEquiv φx) =
(∑ x,
Lorentz.complexContrBasisFin4.repr
((Lorentz.contrBasis.repr px) x • Lorentz.complexContrBasisFin4 (finSumFinEquiv x)))
(finSumFinEquiv φx) simp only [Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero, Fin.isValue,
Finset.sum_singleton, Nat.reduceAdd, Finsupp.coe_add, Finsupp.coe_finsetSum, Pi.add_apply,
Finset.sum_apply] n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ (Lorentz.complexContrBasisFin4.repr
({
toFun := fun v =>
(Lorentz.contrBasis.repr v) (Sum.inl 0) • Lorentz.complexContrBasisFin4 (finSumFinEquiv (Sum.inl 0)) +
∑ a₂,
(Lorentz.contrBasis.repr v) (Sum.inr a₂) • Lorentz.complexContrBasisFin4 (finSumFinEquiv (Sum.inr a₂)),
map_add' := ⋯, map_smul' := ⋯ }
px))
(finSumFinEquiv φx) =
(Lorentz.complexContrBasisFin4.repr
((Lorentz.contrBasis.repr px) (Sum.inl 0) • Lorentz.complexContrBasisFin4 (finSumFinEquiv (Sum.inl 0))))
(finSumFinEquiv φx) +
∑ c,
(Lorentz.complexContrBasisFin4.repr
((Lorentz.contrBasis.repr px) (Sum.inr c) • Lorentz.complexContrBasisFin4 (finSumFinEquiv (Sum.inr c))))
(finSumFinEquiv φx)
rfl All goals completed! 🐙
simp [- Fintype.sum_sum_type, Lorentz.complexContrBasisFin4] n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ ∑ x, (Lorentz.complexContrBasis.repr ((Lorentz.contrBasis.repr px) x • Lorentz.complexContrBasis x)) φx =
↑((Lorentz.contrBasis.repr px) φx)
trans ∑ x, (((Lorentz.contrBasis.repr px) x • Lorentz.complexContrBasis.repr
(Lorentz.complexContrBasis x) φx)) n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ ∑ x, (Lorentz.complexContrBasis.repr ((Lorentz.contrBasis.repr px) x • Lorentz.complexContrBasis x)) φx =
∑ x, (Lorentz.contrBasis.repr px) x • (Lorentz.complexContrBasis.repr (Lorentz.complexContrBasis x)) φxn:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ ∑ x, (Lorentz.contrBasis.repr px) x • (Lorentz.complexContrBasis.repr (Lorentz.complexContrBasis x)) φx =
↑((Lorentz.contrBasis.repr px) φx)
· n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ ∑ x, (Lorentz.complexContrBasis.repr ((Lorentz.contrBasis.repr px) x • Lorentz.complexContrBasis x)) φx =
∑ x, (Lorentz.contrBasis.repr px) x • (Lorentz.complexContrBasis.repr (Lorentz.complexContrBasis x)) φx simp [Basis.repr_self, Complex.real_smul] n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.up)⊢ (Lorentz.complexContrBasis.repr ((Lorentz.contrBasis.repr px) (Sum.inl 0) • Lorentz.complexContrBasis (Sum.inl 0))) φx +
∑ a₂,
(Lorentz.complexContrBasis.repr
((Lorentz.contrBasis.repr px) (Sum.inr a₂) • Lorentz.complexContrBasis (Sum.inr a₂)))
φx =
↑((Lorentz.contrBasis.repr px) (Sum.inl 0)) * (Finsupp.single (Sum.inl 0) 1) φx +
∑ a₂, ↑((Lorentz.contrBasis.repr px) (Sum.inr a₂)) * (Finsupp.single (Sum.inr a₂) 1) φx
rfl All goals completed! 🐙
simp [- Fintype.sum_sum_type, Finsupp.single_apply] All goals completed! 🐙
· e_f.«1» n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ P Color.down px φx h2 simp only [colorToComplex, toComplexVector, Nat.reduceAdd, Fin.cast_eq_self, P, b, b'] e_f.«1» n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ (Lorentz.complexCoBasisFin4.repr
({ toFun := fun v => ∑ x, (Lorentz.coBasis.repr v) x • Lorentz.complexCoBasisFin4 (finSumFinEquiv x),
map_add' := ⋯, map_smul' := ⋯ }
px))
(finSumFinEquiv φx) =
↑((Lorentz.coBasis.repr px) φx)
trans (∑ x, (Lorentz.complexCoBasisFin4.repr ((Lorentz.coBasis.repr px) x •
Lorentz.complexCoBasisFin4 (finSumFinEquiv x))))
(finSumFinEquiv φx) n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ (Lorentz.complexCoBasisFin4.repr
({ toFun := fun v => ∑ x, (Lorentz.coBasis.repr v) x • Lorentz.complexCoBasisFin4 (finSumFinEquiv x),
map_add' := ⋯, map_smul' := ⋯ }
px))
(finSumFinEquiv φx) =
(∑ x, Lorentz.complexCoBasisFin4.repr ((Lorentz.coBasis.repr px) x • Lorentz.complexCoBasisFin4 (finSumFinEquiv x)))
(finSumFinEquiv φx)n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ (∑ x, Lorentz.complexCoBasisFin4.repr ((Lorentz.coBasis.repr px) x • Lorentz.complexCoBasisFin4 (finSumFinEquiv x)))
(finSumFinEquiv φx) =
↑((Lorentz.coBasis.repr px) φx)
· n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ (Lorentz.complexCoBasisFin4.repr
({ toFun := fun v => ∑ x, (Lorentz.coBasis.repr v) x • Lorentz.complexCoBasisFin4 (finSumFinEquiv x),
map_add' := ⋯, map_smul' := ⋯ }
px))
(finSumFinEquiv φx) =
(∑ x, Lorentz.complexCoBasisFin4.repr ((Lorentz.coBasis.repr px) x • Lorentz.complexCoBasisFin4 (finSumFinEquiv x)))
(finSumFinEquiv φx) simp only [Fintype.sum_sum_type, Finset.univ_unique, Fin.default_eq_zero, Fin.isValue,
Finset.sum_singleton, Nat.reduceAdd, Finsupp.coe_add, Finsupp.coe_finsetSum, Pi.add_apply,
Finset.sum_apply] n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ (Lorentz.complexCoBasisFin4.repr
({
toFun := fun v =>
(Lorentz.coBasis.repr v) (Sum.inl 0) • Lorentz.complexCoBasisFin4 (finSumFinEquiv (Sum.inl 0)) +
∑ a₂, (Lorentz.coBasis.repr v) (Sum.inr a₂) • Lorentz.complexCoBasisFin4 (finSumFinEquiv (Sum.inr a₂)),
map_add' := ⋯, map_smul' := ⋯ }
px))
(finSumFinEquiv φx) =
(Lorentz.complexCoBasisFin4.repr
((Lorentz.coBasis.repr px) (Sum.inl 0) • Lorentz.complexCoBasisFin4 (finSumFinEquiv (Sum.inl 0))))
(finSumFinEquiv φx) +
∑ c,
(Lorentz.complexCoBasisFin4.repr
((Lorentz.coBasis.repr px) (Sum.inr c) • Lorentz.complexCoBasisFin4 (finSumFinEquiv (Sum.inr c))))
(finSumFinEquiv φx)
rfl All goals completed! 🐙
simp [- Fintype.sum_sum_type, Lorentz.complexCoBasisFin4] n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ ∑ x, (Lorentz.complexCoBasis.repr ((Lorentz.coBasis.repr px) x • Lorentz.complexCoBasis x)) φx =
↑((Lorentz.coBasis.repr px) φx)
trans ∑ x, (((Lorentz.coBasis.repr px) x •
Lorentz.complexCoBasis.repr (Lorentz.complexCoBasis x) φx)) n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ ∑ x, (Lorentz.complexCoBasis.repr ((Lorentz.coBasis.repr px) x • Lorentz.complexCoBasis x)) φx =
∑ x, (Lorentz.coBasis.repr px) x • (Lorentz.complexCoBasis.repr (Lorentz.complexCoBasis x)) φxn:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ ∑ x, (Lorentz.coBasis.repr px) x • (Lorentz.complexCoBasis.repr (Lorentz.complexCoBasis x)) φx =
↑((Lorentz.coBasis.repr px) φx)
· n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ ∑ x, (Lorentz.complexCoBasis.repr ((Lorentz.coBasis.repr px) x • Lorentz.complexCoBasis x)) φx =
∑ x, (Lorentz.coBasis.repr px) x • (Lorentz.complexCoBasis.repr (Lorentz.complexCoBasis x)) φx simp [Basis.repr_self, Complex.real_smul] n:ℕc:Fin n → Colorx:Fin nφx:Fin 1 ⊕ Fin 3h1:RingHomInvPair (RingHom.id ℂ) (RingHom.id ℂ)h3:RingHomInvPair (RingHom.id ℝ) (RingHom.id ℝ)b:(c : Color) → Basis (Fin (repDim (colorToComplex c))) ℂ (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.basis
| Color.downL => Fermion.DualLeftHandedWeyl.basis
| Color.upR => Fermion.RightHandedWeyl.basis
| Color.downR => Fermion.DualRightHandedWeyl.basis
| complexLorentzTensor.Color.up => Lorentz.complexContrBasisFin4
| complexLorentzTensor.Color.down => Lorentz.complexCoBasisFin4b':(c : Color) → Basis (Fin 1 ⊕ Fin 3) ℝ (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.contrBasis
| Color.down => Lorentz.coBasisP:(c : Color) → modules 3 c → Fin 1 ⊕ Fin 3 → 4 = repDim (colorToComplex c) → Prop := fun c px φx h2 => ((b c).repr ((toComplexVector c) px)) (Fin.cast h2 (finSumFinEquiv φx)) = ↑(((b' c).repr px) φx)px:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3h2:4 = repDim (colorToComplex Color.down)⊢ (Lorentz.complexCoBasis.repr ((Lorentz.coBasis.repr px) (Sum.inl 0) • Lorentz.complexCoBasis (Sum.inl 0))) φx +
∑ a₂,
(Lorentz.complexCoBasis.repr ((Lorentz.coBasis.repr px) (Sum.inr a₂) • Lorentz.complexCoBasis (Sum.inr a₂))) φx =
↑((Lorentz.coBasis.repr px) (Sum.inl 0)) * (Finsupp.single (Sum.inl 0) 1) φx +
∑ a₂, ↑((Lorentz.coBasis.repr px) (Sum.inr a₂)) * (Finsupp.single (Sum.inr a₂) 1) φx
rfl All goals completed! 🐙
simp [- Fintype.sum_sum_type, Finsupp.single_apply] All goals completed! 🐙lemma actionP_toComplexPure {n : ℕ} (c : Fin n → Color) (p : Pure realLorentzTensor c)
(Λ : SL(2, ℂ)) :
Λ • toComplexPure p = toComplexPure (toLorentzGroup Λ • p) := by n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)⊢ Λ • toComplexPure p = toComplexPure (toLorentzGroup Λ • p)
ext i n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin n⊢ (Λ • toComplexPure p) i = toComplexPure (toLorentzGroup Λ • p) i
simp [Pure.actionP_eq, toComplexPure] n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin n⊢ ((match colorToComplex (c i) with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRep)
Λ)
((toComplexVector (c i)) (p i)) =
(toComplexVector (c i))
(((match c i with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.rep)
(toLorentzGroup Λ))
(p i))
let b (c : Color) : Representation ℂ _ (complexLorentzTensor.modules (colorToComplex c)) :=
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRep n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRep⊢ ((match colorToComplex (c i) with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRep)
Λ)
((toComplexVector (c i)) (p i)) =
(toComplexVector (c i))
(((match c i with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.rep)
(toLorentzGroup Λ))
(p i))
let b' (c : Color) : Representation ℝ _ (realLorentzTensor.modules 3 c) :=
(match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.rep) n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.rep⊢ ((match colorToComplex (c i) with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRep)
Λ)
((toComplexVector (c i)) (p i)) =
(toComplexVector (c i))
(((match c i with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.rep)
(toLorentzGroup Λ))
(p i))
let P (c : Color) (px : realLorentzTensor.modules 3 c) : Prop :=
b c Λ (toComplexVector c px) = toComplexVector c (b' c (toLorentzGroup Λ) px) n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)⊢ ((match colorToComplex (c i) with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRep)
Λ)
((toComplexVector (c i)) (p i)) =
(toComplexVector (c i))
(((match c i with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.rep)
(toLorentzGroup Λ))
(p i))
change P (c i) (p i) n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)⊢ P (c i) (p i)
generalize p i = p at * n:ℕc:Fin n → Colorp✝:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)p:match c i with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ P (c i) p
generalize c i = c at * n:ℕc✝:Fin n → Colorp✝:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)c:Colorp:match c with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ P c p
fin_cases c «0» n:ℕc:Fin n → Colorp✝:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)p:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ P Color.up p«1» n:ℕc:Fin n → Colorp✝:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)p:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ P Color.down p
· «0» n:ℕc:Fin n → Colorp✝:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)p:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ P Color.up p simp_all [P, b, b', colorToComplex] «0» n:ℕc:Fin n → Colorp✝:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)p:match Color.up with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ (Lorentz.ContrℂModule.SL2CRep Λ) ((toComplexVector Color.up) p) =
(toComplexVector Color.up) ((Lorentz.ContrMod.rep (toLorentzGroup Λ)) p)
exact ((congrArg (Lorentz.ContrℂModule.SL2CRep Λ)
(toComplexVector_up_eq_inclCongrRealLorentz p)).trans
(Lorentz.inclCongrRealLorentz_ρ Λ p)).trans
(toComplexVector_up_eq_inclCongrRealLorentz _).symm All goals completed! 🐙
· «1» n:ℕc:Fin n → Colorp✝:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)p:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ P Color.down p simp_all [P, b, b', colorToComplex] «1» n:ℕc:Fin n → Colorp✝:Tensor.Pure realLorentzTensor cΛ:SL(2, ℂ)i:Fin nb:(c : Color) → Representation ℂ SL(2, ℂ) (complexLorentzTensor.modules (colorToComplex c)) :=
fun c =>
match colorToComplex c with
| Color.upL => Fermion.LeftHandedWeyl.rep
| Color.downL => Fermion.DualLeftHandedWeyl.rep
| Color.upR => Fermion.RightHandedWeyl.rep
| Color.downR => Fermion.DualRightHandedWeyl.rep
| complexLorentzTensor.Color.up => Lorentz.ContrℂModule.SL2CRep
| complexLorentzTensor.Color.down => Lorentz.CoℂModule.SL2CRepb':(c : Color) → Representation ℝ (↑(LorentzGroup 3)) (modules 3 c) :=
fun c =>
match c with
| Color.up => Lorentz.ContrMod.rep
| Color.down => Lorentz.CoMod.repP:(c : Color) → modules 3 c → Prop := fun c px => ((b c) Λ) ((toComplexVector c) px) = (toComplexVector c) (((b' c) (toLorentzGroup Λ)) px)p:match Color.down with
| Color.up => Lorentz.ContrMod 3
| Color.down => Lorentz.CoMod 3⊢ (Lorentz.CoℂModule.SL2CRep Λ) ((toComplexVector Color.down) p) =
(toComplexVector Color.down) ((Lorentz.CoMod.rep (toLorentzGroup Λ)) p)
exact ((congrArg (Lorentz.CoℂModule.SL2CRep Λ)
(toComplexVector_down_eq_inclCoRealLorentz p)).trans
(Lorentz.inclCoRealLorentz_ρ Λ p)).trans
(toComplexVector_down_eq_inclCoRealLorentz _).symm All goals completed! 🐙lemma toComplex_pure {n : ℕ} (c : Fin n → Color) (p : Pure realLorentzTensor c) :
toComplex p.toTensor = (toComplexPure p).toTensor := by n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor c⊢ toComplex p.toTensor = (toComplexPure p).toTensor
apply (Tensor.basis _).repr.injective n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor c⊢ (Tensor.basis (colorToComplex ∘ c)).repr (toComplex p.toTensor) =
(Tensor.basis (colorToComplex ∘ c)).repr (toComplexPure p).toTensor
ext φ n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cφ:ComponentIdx (colorToComplex ∘ c)⊢ ((Tensor.basis (colorToComplex ∘ c)).repr (toComplex p.toTensor)) φ =
((Tensor.basis (colorToComplex ∘ c)).repr (toComplexPure p).toTensor) φ
obtain ⟨φ, rfl⟩ := TensorSpecies.Tensor.ComponentIdx.complexify.surjective φ n:ℕc:Fin n → Colorp:Tensor.Pure realLorentzTensor cφ:ComponentIdx c⊢ ((Tensor.basis (colorToComplex ∘ c)).repr (toComplex p.toTensor)) (ComponentIdx.complexify φ) =
((Tensor.basis (colorToComplex ∘ c)).repr (toComplexPure p).toTensor) (ComponentIdx.complexify φ)
simp [toComplex_repr, toComplexPure_component] All goals completed! 🐙B.3. Equivariance under the Lorentz action
Finally we record that toComplex is equivariant for the natural action of
SL(2, ℂ) (and hence the induced Lorentz action) on tensors.
The map toComplex is equivariant.
set_option backward.isDefEq.respectTransparency false in
lemma toComplex_equivariant {n} {c : Fin n → realLorentzTensor.Color}
(v : ℝT(3, c)) (Λ : SL(2, ℂ)) :
Λ • (toComplex v) = toComplex (Lorentz.SL2C.toLorentzGroup Λ • v) := by n:ℕc:Fin n → Colorv:realLorentzTensor.Tensor cΛ:SL(2, ℂ)⊢ Λ • toComplex v = toComplex (toLorentzGroup Λ • v)
induction' v using induction_on_pure with p r t h t1 t2 h n:ℕc:Fin n → ColorΛ:SL(2, ℂ)p:Tensor.Pure realLorentzTensor c⊢ Λ • toComplex p.toTensor = toComplex (toLorentzGroup Λ • p.toTensor)hsmul n:ℕc:Fin n → ColorΛ:SL(2, ℂ)r:ℝt:realLorentzTensor.Tensor ch:Λ • toComplex t = toComplex (toLorentzGroup Λ • t)⊢ Λ • toComplex (r • t) = toComplex (toLorentzGroup Λ • r • t)hadd n:ℕc:Fin n → ColorΛ:SL(2, ℂ)t1:realLorentzTensor.Tensor ct2:realLorentzTensor.Tensor ca✝¹:Λ • toComplex t1 = toComplex (toLorentzGroup Λ • t1)a✝:Λ • toComplex t2 = toComplex (toLorentzGroup Λ • t2)⊢ Λ • toComplex (t1 + t2) = toComplex (toLorentzGroup Λ • (t1 + t2))
· h n:ℕc:Fin n → ColorΛ:SL(2, ℂ)p:Tensor.Pure realLorentzTensor c⊢ Λ • toComplex p.toTensor = toComplex (toLorentzGroup Λ • p.toTensor) rw [actionT_pure, h n:ℕc:Fin n → ColorΛ:SL(2, ℂ)p:Tensor.Pure realLorentzTensor c⊢ Λ • toComplex p.toTensor = toComplex (toLorentzGroup Λ • p).toTensor All goals completed! 🐙 toComplex_pure, h n:ℕc:Fin n → ColorΛ:SL(2, ℂ)p:Tensor.Pure realLorentzTensor c⊢ Λ • (toComplexPure p).toTensor = toComplex (toLorentzGroup Λ • p).toTensor All goals completed! 🐙 actionT_pure, h n:ℕc:Fin n → ColorΛ:SL(2, ℂ)p:Tensor.Pure realLorentzTensor c⊢ (Λ • toComplexPure p).toTensor = toComplex (toLorentzGroup Λ • p).toTensor All goals completed! 🐙 actionP_toComplexPure, h n:ℕc:Fin n → ColorΛ:SL(2, ℂ)p:Tensor.Pure realLorentzTensor c⊢ (toComplexPure (toLorentzGroup Λ • p)).toTensor = toComplex (toLorentzGroup Λ • p).toTensor All goals completed! 🐙 toComplex_pure h n:ℕc:Fin n → ColorΛ:SL(2, ℂ)p:Tensor.Pure realLorentzTensor c⊢ (toComplexPure (toLorentzGroup Λ • p)).toTensor = (toComplexPure (toLorentzGroup Λ • p)).toTensor All goals completed! 🐙] All goals completed! 🐙
· hsmul n:ℕc:Fin n → ColorΛ:SL(2, ℂ)r:ℝt:realLorentzTensor.Tensor ch:Λ • toComplex t = toComplex (toLorentzGroup Λ • t)⊢ Λ • toComplex (r • t) = toComplex (toLorentzGroup Λ • r • t) simpa [← h] using actionT_smul (g := Λ) (r := (r : ℂ)) (t := toComplex t) All goals completed! 🐙
· hadd n:ℕc:Fin n → ColorΛ:SL(2, ℂ)t1:realLorentzTensor.Tensor ct2:realLorentzTensor.Tensor ca✝¹:Λ • toComplex t1 = toComplex (toLorentzGroup Λ • t1)a✝:Λ • toComplex t2 = toComplex (toLorentzGroup Λ • t2)⊢ Λ • toComplex (t1 + t2) = toComplex (toLorentzGroup Λ • (t1 + t2)) simp_all All goals completed! 🐙
C. Compatibility with permutations: permT
We first show that complexification is compatible with permutation of tensor
slots. On colours this is encoded in the IsReindexing predicate, and on tensors
by the operator permT.
The IsReindexing condition is preserved under colorToComplex.
@[simp] lemma isReindexing_colorToComplex {n m : ℕ}
{c : Fin n → realLorentzTensor.Color} {c1 : Fin m → realLorentzTensor.Color}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) :
IsReindexing (colorToComplex ∘ c) (colorToComplex ∘ c1) σ :=
⟨h.1, fun i => congrArg colorToComplex (h.2 i)⟩
permT sends basis vectors to basis vectors.
@[simp] lemma permT_basis_real {n m : ℕ}
{c : Fin n → realLorentzTensor.Color} {c1 : Fin m → realLorentzTensor.Color}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ)
(b : ComponentIdx (S := realLorentzTensor) c) :
permT (S := realLorentzTensor) σ h ((Tensor.basis (S := realLorentzTensor) c) b)
= (Tensor.basis (S := realLorentzTensor) c1)
(fun j => b (σ j)) := by n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σb:ComponentIdx c⊢ (permT σ h) ((Tensor.basis c) b) = (Tensor.basis c1) fun j => b (σ j)
simp [Tensor.basis_apply, permT_pure, Pure.permP_basisVector] All goals completed! 🐙@[simp] lemma permT_basis_complex {n m : ℕ}
{c : Fin n → complexLorentzTensor.Color} {c1 : Fin m → complexLorentzTensor.Color}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ)
(b : ComponentIdx (S := complexLorentzTensor) c) :
permT (S := complexLorentzTensor) σ h ((Tensor.basis (S := complexLorentzTensor) c) b)
=
(Tensor.basis (S := complexLorentzTensor) c1)
(fun j => Fin.cast
(by n:ℕm:ℕc:Fin n → complexLorentzTensor.Colorc1:Fin m → complexLorentzTensor.Colorσ:Fin m → Fin nh:IsReindexing c c1 σb:ComponentIdx cj:Fin m⊢ repDim (c (σ j)) = repDim (c1 j)
-- from the color agreement we get the repDim agreement
-- if one has `h.2 j : c1 j = c (σ j)`, then replace it with `(h.2 j).symm`
simpa using congrArg (fun col => complexLorentzTensor.repDim col) (h.2 j) All goals completed! 🐙)
(b (σ j))) := by n:ℕm:ℕc:Fin n → complexLorentzTensor.Colorc1:Fin m → complexLorentzTensor.Colorσ:Fin m → Fin nh:IsReindexing c c1 σb:ComponentIdx c⊢ (permT σ h) ((Tensor.basis c) b) = (Tensor.basis c1) fun j => Fin.cast ⋯ (b (σ j))
simp [Tensor.basis_apply, permT_pure, Pure.permP_basisVector, basisIdxCongr_eq_cast] All goals completed! 🐙
The map toComplex commutes with permT.
lemma permT_toComplex {n m : ℕ}
{c : Fin n → realLorentzTensor.Color}
{c1 : Fin m → realLorentzTensor.Color}
{σ : Fin m → Fin n} (h : IsReindexing c c1 σ) (t : ℝT(3, c)) :
toComplex (permT (S := realLorentzTensor) σ h t)
=
permT (S := complexLorentzTensor) σ (isReindexing_colorToComplex (c := c) (c1 := c1) h)
(toComplex (c := c) t) := by n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σt:realLorentzTensor.Tensor c⊢ toComplex ((permT σ h) t) = (permT σ ⋯) (toComplex t)
induction t using induction_on_basis with
| h b => h n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σb:ComponentIdx c⊢ toComplex ((permT σ h) ((Tensor.basis c) b)) = (permT σ ⋯) (toComplex ((Tensor.basis c) b))
simp only [permT_basis_real, toComplex_basis, permT_basis_complex] h n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σb:ComponentIdx c⊢ (Tensor.basis (colorToComplex ∘ c1)) (ComponentIdx.complexify fun j => b (σ j)) =
(Tensor.basis (colorToComplex ∘ c1)) fun j => Fin.cast ⋯ (ComponentIdx.complexify b (σ j))
apply congrArg (Tensor.basis (S := complexLorentzTensor) (colorToComplex ∘ c1)) h n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σb:ComponentIdx c⊢ (ComponentIdx.complexify fun j => b (σ j)) = fun j => Fin.cast ⋯ (ComponentIdx.complexify b (σ j))
funext j h n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σb:ComponentIdx cj:Fin m⊢ ComponentIdx.complexify (fun j => b (σ j)) j = Fin.cast ⋯ (ComponentIdx.complexify b (σ j))
simp [TensorSpecies.Tensor.ComponentIdx.complexify, colorToComplex, Function.comp_apply] All goals completed! 🐙
| hzero => hzero n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σ⊢ toComplex ((permT σ h) 0) = (permT σ ⋯) (toComplex 0) simp All goals completed! 🐙
| hsmul r t ht => hsmul n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σr:ℝt:realLorentzTensor.Tensor cht:toComplex ((permT σ h) t) = (permT σ ⋯) (toComplex t)⊢ toComplex ((permT σ h) (r • t)) = (permT σ ⋯) (toComplex (r • t)) simp [map_smul, ht] All goals completed! 🐙
| hadd t1 t2 h1 h2 => hadd n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorσ:Fin m → Fin nh:IsReindexing c c1 σt1:realLorentzTensor.Tensor ct2:realLorentzTensor.Tensor ch1:toComplex ((permT σ h) t1) = (permT σ ⋯) (toComplex t1)h2:toComplex ((permT σ h) t2) = (permT σ ⋯) (toComplex t2)⊢ toComplex ((permT σ h) (t1 + t2)) = (permT σ ⋯) (toComplex (t1 + t2)) simp [map_add, h1, h2] All goals completed! 🐙
D. Compatibility with tensor products: prodT
colorToComplex commutes with Fin.append (as functions).
@[simp]
lemma colorToComplex_append {n m : ℕ}
(c : Fin n → realLorentzTensor.Color) (c1 : Fin m → realLorentzTensor.Color) :
(colorToComplex ∘ Fin.append c c1) = Fin.append (colorToComplex ∘ c) (colorToComplex ∘ c1) := by n:ℕm:ℕc:Fin n → Colorc1:Fin m → Color⊢ colorToComplex ∘ Fin.append c c1 = Fin.append (colorToComplex ∘ c) (colorToComplex ∘ c1)
funext x n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorx:Fin (n + m)⊢ (colorToComplex ∘ Fin.append c c1) x = Fin.append (colorToComplex ∘ c) (colorToComplex ∘ c1) x
refine Fin.addCases (fun i => ?_) (fun j => ?_) x refine_1 n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorx:Fin (n + m)i:Fin n⊢ (colorToComplex ∘ Fin.append c c1) (Fin.castAdd m i) =
Fin.append (colorToComplex ∘ c) (colorToComplex ∘ c1) (Fin.castAdd m i)refine_2 n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorx:Fin (n + m)j:Fin m⊢ (colorToComplex ∘ Fin.append c c1) (Fin.natAdd n j) =
Fin.append (colorToComplex ∘ c) (colorToComplex ∘ c1) (Fin.natAdd n j) <;> refine_1 n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorx:Fin (n + m)i:Fin n⊢ (colorToComplex ∘ Fin.append c c1) (Fin.castAdd m i) =
Fin.append (colorToComplex ∘ c) (colorToComplex ∘ c1) (Fin.castAdd m i)refine_2 n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorx:Fin (n + m)j:Fin m⊢ (colorToComplex ∘ Fin.append c c1) (Fin.natAdd n j) =
Fin.append (colorToComplex ∘ c) (colorToComplex ∘ c1) (Fin.natAdd n j) simp [Fin.append] All goals completed! 🐙lemma isReindexing_prodTColorToComplex {n m : ℕ}
{c : Fin n → realLorentzTensor.Color} {c1 : Fin m → realLorentzTensor.Color} :
IsReindexing (Fin.append (colorToComplex ∘ c) (colorToComplex ∘ c1))
(colorToComplex ∘ Fin.append c c1)
(id : Fin (n + m) → Fin (n + m)) :=
⟨Function.bijective_id, fun i => (congrFun (colorToComplex_append c c1) i).symm⟩private lemma cast_componentIdx_apply {n : ℕ} {c c' : Fin n → complexLorentzTensor.Color}
(h : c' = c) (f : ComponentIdx (S := complexLorentzTensor) c') (x : Fin n) :
(cast (congr_arg ComponentIdx h) f) x =
Fin.cast (congr_arg (fun c => complexLorentzTensor.repDim (c x)) h) (f x) := by n:ℕc:Fin n → complexLorentzTensor.Colorc':Fin n → complexLorentzTensor.Colorh:c' = cf:ComponentIdx c'x:Fin n⊢ cast ⋯ f x = Fin.cast ⋯ (f x)
subst h n:ℕc':Fin n → complexLorentzTensor.Colorf:ComponentIdx c'x:Fin n⊢ cast ⋯ f x = Fin.cast ⋯ (f x)
rfl All goals completed! 🐙@[simp]
private lemma cast_componentIdx_eq_fun {n : ℕ}
{c c' : Fin n → complexLorentzTensor.Color}
(h : c' = c) (f : ComponentIdx (S := complexLorentzTensor) c') :
cast (congr_arg ComponentIdx h) f =
(fun x =>
Fin.cast (congr_arg (fun col => complexLorentzTensor.repDim (col x)) h) (f x)) :=
funext fun x => cast_componentIdx_apply h f x
complexify commutes with prod of component indices.
@[simp]
lemma complexify_prod {n m : ℕ}
{c : Fin n → realLorentzTensor.Color} {c1 : Fin m → realLorentzTensor.Color}
(b : ComponentIdx (S := realLorentzTensor) c)
(b1 : ComponentIdx (S := realLorentzTensor) c1) :
ComponentIdx.complexify (c := Fin.append c c1) (ComponentIdx.prod.symm (b, b1))
=
cast (congr_arg ComponentIdx (colorToComplex_append c c1).symm)
(ComponentIdx.prod.symm (ComponentIdx.complexify (c := c) b,
ComponentIdx.complexify (c := c1) b1)) := by n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1⊢ ComponentIdx.complexify (ComponentIdx.prod.symm (b, b1)) =
cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1))
ext x n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1x:Fin (n + m)⊢ ↑(ComponentIdx.complexify (ComponentIdx.prod.symm (b, b1)) x) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1)) x)
obtain ⟨i, rfl⟩ := finSumFinEquiv.surjective x n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1i:Fin n ⊕ Fin m⊢ ↑(ComponentIdx.complexify (ComponentIdx.prod.symm (b, b1)) (finSumFinEquiv i)) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1)) (finSumFinEquiv i))
cases i inl n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin n⊢ ↑(ComponentIdx.complexify (ComponentIdx.prod.symm (b, b1)) (finSumFinEquiv (Sum.inl val✝))) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1))
(finSumFinEquiv (Sum.inl val✝)))inr n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin m⊢ ↑(ComponentIdx.complexify (ComponentIdx.prod.symm (b, b1)) (finSumFinEquiv (Sum.inr val✝))) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1))
(finSumFinEquiv (Sum.inr val✝)))
all_goals
rw [ComponentIdx.complexify_apply inl n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin n⊢ ↑(Fin.cast ⋯ (finSumFinEquiv (ComponentIdx.prod.symm (b, b1) (finSumFinEquiv (Sum.inl val✝))))) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1))
(finSumFinEquiv (Sum.inl val✝))) inr n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin m⊢ ↑(Fin.cast ⋯ (finSumFinEquiv (ComponentIdx.prod.symm (b, b1) (finSumFinEquiv (Sum.inr val✝))))) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1))
(finSumFinEquiv (Sum.inr val✝)))] inl n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin n⊢ ↑(Fin.cast ⋯ (finSumFinEquiv (ComponentIdx.prod.symm (b, b1) (finSumFinEquiv (Sum.inl val✝))))) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1))
(finSumFinEquiv (Sum.inl val✝))) inr n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin m⊢ ↑(Fin.cast ⋯ (finSumFinEquiv (ComponentIdx.prod.symm (b, b1) (finSumFinEquiv (Sum.inr val✝))))) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1))
(finSumFinEquiv (Sum.inr val✝)))inr n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin m⊢ ↑(Fin.cast ⋯ (finSumFinEquiv (ComponentIdx.prod.symm (b, b1) (finSumFinEquiv (Sum.inr val✝))))) =
↑(cast ⋯ (ComponentIdx.prod.symm (ComponentIdx.complexify b, ComponentIdx.complexify b1))
(finSumFinEquiv (Sum.inr val✝)))
simp [ComponentIdx.prod] inr n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin m⊢ ↑(finSumFinEquiv (b1 val✝)) = ↑((basisIdxCongr ⋯) (Fin.cast ⋯ (finSumFinEquiv (b1 val✝))))
erw [basisIdxCongr_eq_cast inl n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin n⊢ ↑(finSumFinEquiv (b val✝)) = ↑(Fin.cast ⋯ (Fin.cast ⋯ (finSumFinEquiv (b val✝))))] inr n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1val✝:Fin m⊢ ↑(finSumFinEquiv (b1 val✝)) = ↑(Fin.cast ⋯ (Fin.cast ⋯ (finSumFinEquiv (b1 val✝))))
simp All goals completed! 🐙
The map toComplex commutes with prodT.
set_option backward.isDefEq.respectTransparency false inlemma prodT_toComplex {n m : ℕ}
{c : Fin n → realLorentzTensor.Color}
{c1 : Fin m → realLorentzTensor.Color}
(t : ℝT(3, c)) (t1 : ℝT(3, c1)) :
toComplex (c := Fin.append c c1) (prodT (S := realLorentzTensor) t t1)
=
prodTColorToComplex (c := c) (c1 := c1)
(toComplex (c := c) t) (toComplex (c := c1) t1) := by n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colort:realLorentzTensor.Tensor ct1:realLorentzTensor.Tensor c1⊢ toComplex ((prodT t) t1) = prodTColorToComplex (toComplex t) (toComplex t1)
-- Double induction on the tensor basis: first over `t`, then over `t1`. The zero, scalar and
-- additive cases follow from linearity of `prodT`, `toComplex` and `prodTColorToComplex`.
induction t using induction_on_basis with
| h b => h n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colort1:realLorentzTensor.Tensor c1b:ComponentIdx c⊢ toComplex ((prodT ((Tensor.basis c) b)) t1) = prodTColorToComplex (toComplex ((Tensor.basis c) b)) (toComplex t1)
induction t1 using induction_on_basis with
| h b1 => h.h n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cb1:ComponentIdx c1⊢ toComplex ((prodT ((Tensor.basis c) b)) ((Tensor.basis c1) b1)) =
prodTColorToComplex (toComplex ((Tensor.basis c) b)) (toComplex ((Tensor.basis c1) b1))
simp [prodTColorToComplex, prodT_pure, permT_pure, Pure.prodP_basisVector,
Pure.permP_basisVector, Tensor.basis_apply, toComplex_pure_basisVector,
colorToComplex_append, basisIdxCongr_eq_cast] All goals completed! 🐙
| hzero => h.hzero n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx c⊢ toComplex ((prodT ((Tensor.basis c) b)) 0) = prodTColorToComplex (toComplex ((Tensor.basis c) b)) (toComplex 0) simp [prodTColorToComplex] All goals completed! 🐙
| hsmul r ta hta => h.hsmul n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cr:ℝta:realLorentzTensor.Tensor c1hta:toComplex ((prodT ((Tensor.basis c) b)) ta) = prodTColorToComplex (toComplex ((Tensor.basis c) b)) (toComplex ta)⊢ toComplex ((prodT ((Tensor.basis c) b)) (r • ta)) =
prodTColorToComplex (toComplex ((Tensor.basis c) b)) (toComplex (r • ta)) simp [map_smul, hta, prodTColorToComplex] All goals completed! 🐙
| hadd ta tb hta htb => h.hadd n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colorb:ComponentIdx cta:realLorentzTensor.Tensor c1tb:realLorentzTensor.Tensor c1hta:toComplex ((prodT ((Tensor.basis c) b)) ta) = prodTColorToComplex (toComplex ((Tensor.basis c) b)) (toComplex ta)htb:toComplex ((prodT ((Tensor.basis c) b)) tb) = prodTColorToComplex (toComplex ((Tensor.basis c) b)) (toComplex tb)⊢ toComplex ((prodT ((Tensor.basis c) b)) (ta + tb)) =
prodTColorToComplex (toComplex ((Tensor.basis c) b)) (toComplex (ta + tb)) simp [map_add, hta, htb, prodTColorToComplex] All goals completed! 🐙
| hzero => hzero n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colort1:realLorentzTensor.Tensor c1⊢ toComplex ((prodT 0) t1) = prodTColorToComplex (toComplex 0) (toComplex t1) simp [prodTColorToComplex] All goals completed! 🐙
| hsmul r ta hta => hsmul n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colort1:realLorentzTensor.Tensor c1r:ℝta:realLorentzTensor.Tensor chta:toComplex ((prodT ta) t1) = prodTColorToComplex (toComplex ta) (toComplex t1)⊢ toComplex ((prodT (r • ta)) t1) = prodTColorToComplex (toComplex (r • ta)) (toComplex t1) simp [map_smul, hta, prodTColorToComplex] All goals completed! 🐙
| hadd ta tb hta htb => hadd n:ℕm:ℕc:Fin n → Colorc1:Fin m → Colort1:realLorentzTensor.Tensor c1ta:realLorentzTensor.Tensor ctb:realLorentzTensor.Tensor chta:toComplex ((prodT ta) t1) = prodTColorToComplex (toComplex ta) (toComplex t1)htb:toComplex ((prodT tb) t1) = prodTColorToComplex (toComplex tb) (toComplex t1)⊢ toComplex ((prodT (ta + tb)) t1) = prodTColorToComplex (toComplex (ta + tb)) (toComplex t1) simp [map_add, hta, htb, prodTColorToComplex] All goals completed! 🐙
E. Compatibility with contraction: contrT
τ commutes with colorToComplex on the Lorentz up/down colors.
@[simp]
lemma tau_colorToComplex (x : realLorentzTensor.Color) :
(complexLorentzTensor).τ (colorToComplex x) = colorToComplex ((realLorentzTensor).τ x) := by x:Color⊢ complexLorentzTensor.τ (colorToComplex x) = colorToComplex (realLorentzTensor.τ x)
cases x up ⊢ complexLorentzTensor.τ (colorToComplex Color.up) = colorToComplex (realLorentzTensor.τ Color.up)down ⊢ complexLorentzTensor.τ (colorToComplex Color.down) = colorToComplex (realLorentzTensor.τ Color.down) <;> up ⊢ complexLorentzTensor.τ (colorToComplex Color.up) = colorToComplex (realLorentzTensor.τ Color.up)down ⊢ complexLorentzTensor.τ (colorToComplex Color.down) = colorToComplex (realLorentzTensor.τ Color.down) rfl All goals completed! 🐙
complexify commutes with precomposition by succSuccAbove.
We use fun k => b (Fin.succSuccAbove i j k) and direct application
(ComponentIdx.complexify b) (Fin.succSuccAbove i j m) rather than composition so that
dependent ComponentIdx types unify correctly (avoiding Function.comp type mismatch).
@[simp]
lemma ComponentIdx.complexify_comp_succSuccAbove
{n : ℕ} {c : Fin (n + 1 + 1) → realLorentzTensor.Color}
{i j : Fin (n + 1 + 1)} (b : ComponentIdx (S := realLorentzTensor) c) (m : Fin n) :
(ComponentIdx.complexify (c := c ∘ Fin.succSuccAbove i j)
(fun k => b (Fin.succSuccAbove i j k))) m =
(ComponentIdx.complexify (c := c) b) (Fin.succSuccAbove i j m) := by n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)b:ComponentIdx cm:Fin n⊢ ComponentIdx.complexify (fun k => b (i.succSuccAbove j k)) m = ComponentIdx.complexify b (i.succSuccAbove j m)
simp only [ComponentIdx.complexify_apply, Function.comp_apply] All goals completed! 🐙
For a real basis vector, toComplex(contrP(basisVector c b)) equals
contrP(basisVector (colorToComplex ∘ c) (complexify b)) (complex species).
lemma toComplex_contrP_basisVector {n : ℕ} {c : Fin (n + 1 + 1) → realLorentzTensor.Color}
{i j : Fin (n + 1 + 1)} (h : i ≠ j ∧ (realLorentzTensor).τ (c i) = c j)
(b : ComponentIdx (S := realLorentzTensor) c) :
toComplex (c := c ∘ Fin.succSuccAbove i j)
(Pure.contrP (S := realLorentzTensor) i j h (Pure.basisVector c b))
=
Pure.contrP (S := complexLorentzTensor) i j
(by n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ i ≠ j ∧ complexLorentzTensor.τ ((colorToComplex ∘ c) i) = (colorToComplex ∘ c) j
simpa [Function.comp_apply] using And.intro h.1
(by n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ colorToComplex (realLorentzTensor.τ (c i)) = colorToComplex (c j) simpa [tau_colorToComplex] using congrArg colorToComplex h.2 All goals completed! 🐙))
(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) := by n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
Pure.contrP i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))
let c' := c ∘ Fin.succSuccAbove i j n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
Pure.contrP i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))
simp only [Pure.contrP] n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ toComplex (Pure.contrPCoeff i j h (Pure.basisVector c b) • (Pure.dropPair i j ⋯ (Pure.basisVector c b)).toTensor) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor
rw [toComplex_map_smul c' (Pure.contrPCoeff i j h (Pure.basisVector c b))
((Pure.dropPair i j h.1 (Pure.basisVector c b)).toTensor), n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) • toComplex (Pure.dropPair i j ⋯ (Pure.basisVector c b)).toTensor =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) •
(Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor
Pure.dropPair_basisVector (c := c), n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) •
toComplex (Pure.basisVector (c ∘ i.succSuccAbove j) fun m => b (i.succSuccAbove j m)).toTensor =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) •
(Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor
← Tensor.basis_apply (S := realLorentzTensor) c' (fun k => b (Fin.succSuccAbove i j k)), n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) • toComplex ((Tensor.basis c') fun k => b (i.succSuccAbove j k)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) •
(Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor
toComplex_basis (c := c') (i := fun k => b (Fin.succSuccAbove i j k)) n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) •
(Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) •
(Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor] n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) •
(Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) •
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor
congr 1 e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ (Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor
· e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(Pure.contrPCoeff i j h (Pure.basisVector c b)) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) -- contrPCoeff: real and complex both equal 0 or 1 with same condition
rw [contrPCoeff_basis, e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(if b i = b j then 1 else 0) =
Pure.contrPCoeff i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(if b i = b j then 1 else 0) = if ComponentIdx.complexify b i = Fin.cast ⋯ (ComponentIdx.complexify b j) then 1 else 0 complexLorentzTensor.contrPCoeff_basis e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(if b i = b j then 1 else 0) = if ComponentIdx.complexify b i = Fin.cast ⋯ (ComponentIdx.complexify b j) then 1 else 0e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(if b i = b j then 1 else 0) = if ComponentIdx.complexify b i = Fin.cast ⋯ (ComponentIdx.complexify b j) then 1 else 0]e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(if b i = b j then 1 else 0) = if ComponentIdx.complexify b i = Fin.cast ⋯ (ComponentIdx.complexify b j) then 1 else 0
simp only [Function.comp_apply, ComponentIdx.complexify_apply, Nat.reduceAdd, Fin.cast_cast,
Fin.cast_inj, EmbeddingLike.apply_eq_iff_eq] e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ ↑(if b i = b j then 1 else 0) = if b i = b j then 1 else 0
split e_a.isTrue n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove jh✝:b i = b j⊢ ↑1 = 1e_a.isFalse n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove jh✝:¬b i = b j⊢ ↑0 = 0 <;> e_a.isTrue n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove jh✝:b i = b j⊢ ↑1 = 1e_a.isFalse n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove jh✝:¬b i = b j⊢ ↑0 = 0 simp_all All goals completed! 🐙
· e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ (Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
(Pure.dropPair i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))).toTensor -- complexify(fun k => b (succSuccAbove k)) = (complexify b) ∘ succSuccAbove
rw [Pure.dropPair_basisVector, e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ (Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
(Pure.basisVector ((colorToComplex ∘ c) ∘ i.succSuccAbove j) fun m =>
ComponentIdx.complexify b (i.succSuccAbove j m)).toTensor e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ (Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
(Tensor.basis ((colorToComplex ∘ c) ∘ i.succSuccAbove j)) fun m => ComponentIdx.complexify b (i.succSuccAbove j m) ← Tensor.basis_apply e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ (Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
(Tensor.basis ((colorToComplex ∘ c) ∘ i.succSuccAbove j)) fun m => ComponentIdx.complexify b (i.succSuccAbove j m)e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ (Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
(Tensor.basis ((colorToComplex ∘ c) ∘ i.succSuccAbove j)) fun m => ComponentIdx.complexify b (i.succSuccAbove j m)]e_a n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx cc':Fin n → Color := c ∘ i.succSuccAbove j⊢ (Tensor.basis (colorToComplex ∘ c')) (ComponentIdx.complexify fun k => b (i.succSuccAbove j k)) =
(Tensor.basis ((colorToComplex ∘ c) ∘ i.succSuccAbove j)) fun m => ComponentIdx.complexify b (i.succSuccAbove j m)
exact congr_arg _ (funext fun m => ComponentIdx.complexify_comp_succSuccAbove b m) All goals completed! 🐙
The map toComplex commutes with contrT.
set_option backward.isDefEq.respectTransparency false in
lemma contrT_toComplex {n : ℕ}
{c : Fin (n + 1 + 1) → realLorentzTensor.Color} {i j : Fin (n + 1 + 1)}
(h : i ≠ j ∧ (realLorentzTensor).τ (c i) = c j) (t : ℝT(3, c)) :
toComplex (c := c ∘ Fin.succSuccAbove i j) (contrT (S := realLorentzTensor) n i j h t)
=
contrT (S := complexLorentzTensor) n i j (by n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jt:realLorentzTensor.Tensor c⊢ i ≠ j ∧ complexLorentzTensor.τ ((colorToComplex ∘ c) i) = (colorToComplex ∘ c) j
simpa [Function.comp_apply] using
And.intro h.1 (by n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jt:realLorentzTensor.Tensor c⊢ colorToComplex (realLorentzTensor.τ (c i)) = colorToComplex (c j)
simpa [tau_colorToComplex] using congrArg colorToComplex h.2 All goals completed! 🐙))
(toComplex (c := c) t) := by n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jt:realLorentzTensor.Tensor c⊢ toComplex ((contrT n i j h) t) = (contrT n i j ⋯) (toComplex t)
induction t using induction_on_basis with
| h b => h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex ((contrT n i j h) ((Tensor.basis c) b)) = (contrT n i j ⋯) (toComplex ((Tensor.basis c) b))
rw [Tensor.basis_apply (S := realLorentzTensor) c b, h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex ((contrT n i j h) (Pure.basisVector c b).toTensor) =
(contrT n i j ⋯) (toComplex (Pure.basisVector c b).toTensor) h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
Pure.contrP i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))
contrT_pure (S := realLorentzTensor) (p := Pure.basisVector c b), h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) = (contrT n i j ⋯) (toComplex (Pure.basisVector c b).toTensor) h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
Pure.contrP i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))
toComplex_pure_basisVector (c := c) b, h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
(contrT n i j ⋯) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)).toTensorh n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
Pure.contrP i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))
contrT_pure (S := complexLorentzTensor)
(p := Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b)) h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
Pure.contrP i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
Pure.contrP i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))]h n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jb:ComponentIdx c⊢ toComplex (Pure.contrP i j h (Pure.basisVector c b)) =
Pure.contrP i j ⋯ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b))
exact toComplex_contrP_basisVector h b All goals completed! 🐙
| hzero => hzero n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c j⊢ toComplex ((contrT n i j h) 0) = (contrT n i j ⋯) (toComplex 0) simp All goals completed! 🐙
| hsmul r t ht => hsmul n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jr:ℝt:realLorentzTensor.Tensor cht:toComplex ((contrT n i j h) t) = (contrT n i j ⋯) (toComplex t)⊢ toComplex ((contrT n i j h) (r • t)) = (contrT n i j ⋯) (toComplex (r • t)) simp [map_smul, ht] All goals completed! 🐙
| hadd t1 t2 h1 h2 => hadd n:ℕc:Fin (n + 1 + 1) → Colori:Fin (n + 1 + 1)j:Fin (n + 1 + 1)h:i ≠ j ∧ realLorentzTensor.τ (c i) = c jt1:realLorentzTensor.Tensor ct2:realLorentzTensor.Tensor ch1:toComplex ((contrT n i j h) t1) = (contrT n i j ⋯) (toComplex t1)h2:toComplex ((contrT n i j h) t2) = (contrT n i j ⋯) (toComplex t2)⊢ toComplex ((contrT n i j h) (t1 + t2)) = (contrT n i j ⋯) (toComplex (t1 + t2)) simp [map_add, h1, h2] All goals completed! 🐙
F. Compatibility with evaluation: evalT
complexify commutes with precomposition by succAbove.
@[simp]
lemma ComponentIdx.complexify_comp_succAbove
{n : ℕ} {c : Fin (n + 1) → realLorentzTensor.Color} (i : Fin (n + 1))
(b : ComponentIdx (S := realLorentzTensor) c) (m : Fin n) :
(ComponentIdx.complexify (c := c ∘ i.succAbove) (fun k => b (i.succAbove k))) m =
(ComponentIdx.complexify (c := c) b) (i.succAbove m) := by n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:ComponentIdx cm:Fin n⊢ ComponentIdx.complexify (fun k => b (i.succAbove k)) m = ComponentIdx.complexify b (i.succAbove m)
simp only [ComponentIdx.complexify_apply, Function.comp_apply] All goals completed! 🐙
For a real basis vector, toComplex(evalP(basisVector c b)) equals
evalP(basisVector (colorToComplex ∘ c) (complexify b)) (complex species).
set_option backward.isDefEq.respectTransparency false in
lemma toComplex_evalP_basisVector {n : ℕ} {c : Fin (n + 1) → realLorentzTensor.Color}
(i : Fin (n + 1)) (b : Fin 1 ⊕ Fin 3)
(b' : ComponentIdx (S := realLorentzTensor) c) :
toComplex (c := c ∘ i.succAbove)
(Pure.evalP (S := realLorentzTensor) i b (Pure.basisVector c b'))
=
permT (S := complexLorentzTensor) (σ := (id : Fin n → Fin n))
(by n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ IsReindexing ((colorToComplex ∘ c) ∘ i.succAbove) (colorToComplex ∘ c ∘ i.succAbove) id simp [Function.comp_apply] All goals completed! 🐙)
(Pure.evalP (S := complexLorentzTensor) i (evalIdxToComplex (c := c) i b)
(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b'))) := by n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
(Pure.evalP i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')))
simp only [Pure.evalP] n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalPCoeff i b (Pure.basisVector c b') • ((Pure.basisVector c b').drop i).toTensor) =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor)
have hdrop : (Pure.basisVector c b').drop i =
Pure.basisVector (c ∘ i.succAbove) (fun k => b' (i.succAbove k)) := by n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
(Pure.evalP i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b'))) n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ toComplex (Pure.evalPCoeff i b (Pure.basisVector c b') • ((Pure.basisVector c b').drop i).toTensor) =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor)
ext j n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx cj:Fin n⊢ (Pure.basisVector c b').drop i j = Pure.basisVector (c ∘ i.succAbove) (fun k => b' (i.succAbove k)) j n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ toComplex (Pure.evalPCoeff i b (Pure.basisVector c b') • ((Pure.basisVector c b').drop i).toTensor) =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor); simp only [Pure.drop, Pure.basisVector, Function.comp_apply] n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ toComplex (Pure.evalPCoeff i b (Pure.basisVector c b') • ((Pure.basisVector c b').drop i).toTensor) =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor) n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ toComplex (Pure.evalPCoeff i b (Pure.basisVector c b') • ((Pure.basisVector c b').drop i).toTensor) =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor)
rw [hdrop, n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ toComplex
(Pure.evalPCoeff i b (Pure.basisVector c b') •
(Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor) =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor) n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ ↑(Pure.evalPCoeff i b (Pure.basisVector c b')) •
toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor) toComplex_map_smul (c ∘ i.succAbove) (Pure.evalPCoeff i b (Pure.basisVector c b'))
((Pure.basisVector (c ∘ i.succAbove)) (fun k => b' (i.succAbove k)) |>.toTensor) n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ ↑(Pure.evalPCoeff i b (Pure.basisVector c b')) •
toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor) n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ ↑(Pure.evalPCoeff i b (Pure.basisVector c b')) •
toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor)] n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ ↑(Pure.evalPCoeff i b (Pure.basisVector c b')) •
toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor)
· n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ ↑(Pure.evalPCoeff i b (Pure.basisVector c b')) •
toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
(Pure.evalPCoeff i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor) -- evalPCoeff: real and complex match; then tensor equality
simp only [Pure.evalPCoeff, Pure.basisVector, Basis.repr_self, Finsupp.single_apply,
ComponentIdx.complexify_apply, evalIdxToComplex] n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ ↑(if b' i = b then 1 else 0) • toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
((if Fin.cast ⋯ (finSumFinEquiv (b' i)) = Fin.cast ⋯ (finSumFinEquiv b) then 1 else 0) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor)
· n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)⊢ ↑(if b' i = b then 1 else 0) • toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
((if Fin.cast ⋯ (finSumFinEquiv (b' i)) = Fin.cast ⋯ (finSumFinEquiv b) then 1 else 0) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor) by_cases h : b' i = b pos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = b⊢ ↑(if b' i = b then 1 else 0) • toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
((if Fin.cast ⋯ (finSumFinEquiv (b' i)) = Fin.cast ⋯ (finSumFinEquiv b) then 1 else 0) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor)neg n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:¬b' i = b⊢ ↑(if b' i = b then 1 else 0) • toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
((if Fin.cast ⋯ (finSumFinEquiv (b' i)) = Fin.cast ⋯ (finSumFinEquiv b) then 1 else 0) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor)
· pos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = b⊢ ↑(if b' i = b then 1 else 0) • toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
((if Fin.cast ⋯ (finSumFinEquiv (b' i)) = Fin.cast ⋯ (finSumFinEquiv b) then 1 else 0) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor) simp [h] pos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = b⊢ (Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor =
(permT id ⋯) ((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor
have hdrop' : (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i =
Pure.basisVector (colorToComplex ∘ (c ∘ i.succAbove))
(ComponentIdx.complexify (c := c ∘ i.succAbove) (fun k => b' (i.succAbove k))) := by n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
(Pure.evalP i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b'))) pos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = bhdrop':(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i =
Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))⊢ (Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor =
(permT id ⋯) ((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor
ext j n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = bj:Fin n⊢ (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i j =
Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k)) jpos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = bhdrop':(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i =
Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))⊢ (Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor =
(permT id ⋯) ((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor; simp only [Pure.drop, Pure.basisVector, ComponentIdx.complexify_apply,
Function.comp_apply]pos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = bhdrop':(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i =
Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))⊢ (Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor =
(permT id ⋯) ((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensorpos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = bhdrop':(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i =
Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))⊢ (Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor =
(permT id ⋯) ((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor
rw [hdrop' pos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = bhdrop':(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i =
Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))⊢ (Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor =
(permT id ⋯)
(Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor pos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = bhdrop':(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i =
Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))⊢ (Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor =
(permT id ⋯)
(Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor]pos n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:b' i = bhdrop':(Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i =
Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))⊢ (Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor =
(permT id ⋯)
(Pure.basisVector (colorToComplex ∘ c ∘ i.succAbove) (ComponentIdx.complexify fun k => b' (i.succAbove k))).toTensor
exact (permT_id_self _).symm All goals completed! 🐙
· neg n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx chdrop:(Pure.basisVector c b').drop i = Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)h:¬b' i = b⊢ ↑(if b' i = b then 1 else 0) • toComplex (Pure.basisVector (c ∘ i.succAbove) fun k => b' (i.succAbove k)).toTensor =
(permT id ⋯)
((if Fin.cast ⋯ (finSumFinEquiv (b' i)) = Fin.cast ⋯ (finSumFinEquiv b) then 1 else 0) •
((Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).drop i).toTensor) simp [h] All goals completed! 🐙
The map toComplex commutes with evalT.
lemma evalT_toComplex {n : ℕ}
{c : Fin (n + 1) → realLorentzTensor.Color}
(i : Fin (n + 1)) (b : Fin 1 ⊕ Fin 3) (t : ℝT(3, c)) :
toComplex (c := c ∘ i.succAbove)
((TensorSpecies.Tensor.evalT (S := realLorentzTensor) (c := c) i b) t)
=
evalTColorToComplex (c := c) i b (toComplex (c := c) t) := by n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3t:realLorentzTensor.Tensor c⊢ toComplex ((evalT i b) t) = evalTColorToComplex i b (toComplex t)
induction t using induction_on_basis with
| h b' => h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex ((evalT i b) ((Tensor.basis c) b')) = evalTColorToComplex i b (toComplex ((Tensor.basis c) b'))
rw [Tensor.basis_apply (S := realLorentzTensor) c b' h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex ((evalT i b) (Pure.basisVector c b').toTensor) =
evalTColorToComplex i b (toComplex (Pure.basisVector c b').toTensor) h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex ((evalT i b) (Pure.basisVector c b').toTensor) =
evalTColorToComplex i b (toComplex (Pure.basisVector c b').toTensor)] h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex ((evalT i b) (Pure.basisVector c b').toTensor) =
evalTColorToComplex i b (toComplex (Pure.basisVector c b').toTensor)
simp only [evalTColorToComplex] h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex ((evalT i b) (Pure.basisVector c b').toTensor) =
(permT id ⋯) ((evalT i (evalIdxToComplex i b)) (toComplex (Pure.basisVector c b').toTensor))
rw [evalT_pure (S := realLorentzTensor) (p := Pure.basisVector c b'), h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯) ((evalT i (evalIdxToComplex i b)) (toComplex (Pure.basisVector c b').toTensor)) h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
(Pure.evalP i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')))
toComplex_pure_basisVector (c := c) b', h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
((evalT i (evalIdxToComplex i b)) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')).toTensor)h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
(Pure.evalP i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')))
evalT_pure (S := complexLorentzTensor)
(p := Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')) h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
(Pure.evalP i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')))h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
(Pure.evalP i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')))]h n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3b':ComponentIdx c⊢ toComplex (Pure.evalP i b (Pure.basisVector c b')) =
(permT id ⋯)
(Pure.evalP i (evalIdxToComplex i b) (Pure.basisVector (colorToComplex ∘ c) (ComponentIdx.complexify b')))
exact toComplex_evalP_basisVector i b b' All goals completed! 🐙
| hzero => hzero n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3⊢ toComplex ((evalT i b) 0) = evalTColorToComplex i b (toComplex 0) simp [evalTColorToComplex] All goals completed! 🐙
| hsmul r t' ht' => hsmul n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3r:ℝt':realLorentzTensor.Tensor cht':toComplex ((evalT i b) t') = evalTColorToComplex i b (toComplex t')⊢ toComplex ((evalT i b) (r • t')) = evalTColorToComplex i b (toComplex (r • t')) simp [evalTColorToComplex, ht'] All goals completed! 🐙
| hadd t1 t2 h1 h2 => hadd n:ℕc:Fin (n + 1) → Colori:Fin (n + 1)b:Fin 1 ⊕ Fin 3t1:realLorentzTensor.Tensor ct2:realLorentzTensor.Tensor ch1:toComplex ((evalT i b) t1) = evalTColorToComplex i b (toComplex t1)h2:toComplex ((evalT i b) t2) = evalTColorToComplex i b (toComplex t2)⊢ toComplex ((evalT i b) (t1 + t2)) = evalTColorToComplex i b (toComplex (t1 + t2)) simp [evalTColorToComplex, h1, h2] All goals completed! 🐙