Imports
/- Copyright (c) 2026 Nathaneal Sajan. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Nathaneal Sajan -/ module public import Physlib.Particles.StandardModel.Basic public import Physlib.Relativity.Tensors.ComplexTensor.Basic

Lepton doublets

i. Overview

The Standard Model lepton doublet is a left-handed Weyl spinor in the (1, 2)_{-3} representation. Here charges are normalized as 6Y, so -3 is the usual hypercharge Y = -1/2.

LeptonDoublet is the target vector space of one lepton multiplet. Its Weyl factor carries the Lorentz index and its two-dimensional factor carries the weak index. The absence of a colour factor makes it an SU(3) singlet.

The Lorentz and gauge actions are first defined separately. The gauge action is then computed on a basis, used to identify its kernel, and descended to each supported global form of the Standard Model gauge group.

ii. Key results

    LeptonDoublet : the target space of the (1, 2)_{-3} multiplet.

    repLorentzGroup : the left-handed Lorentz action.

    repGaugeGroupI : the action of the unquotiented gauge group.

    repGaugeGroupI_tmul_basis_eq_sum : the gauge action in a tensor-product basis.

    mem_repGaugeGroupI_ker_iff_eq : the kernel of the full-group action.

    gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI : triviality of the central ℤ₆.

    repGaugeGroup : the action descended to every supported gauge-group quotient.

iii. Table of contents

    A. The lepton-doublet space

    B. Linear structure

    C. Lorentz action

    D. Gauge action

    E. Kernel of the gauge action

    F. Descent to quotient gauge groups

@[expose] public section

A. The lepton-doublet space

The Weyl factor carries the left-handed Lorentz index, while EuclideanSpace ℂ (Fin 2) carries the weak index.

The target vector space of one Standard Model lepton doublet. It carries the (1, 2)_{-3} representation of the gauge group.

The left-handed Weyl spinor with its weak-doublet index.

@[ext] structure LeptonDoublet where val : Fermion.LeftHandedWeyl ⊗[] EuclideanSpace (Fin 2)

B. Linear structure

The wrapper distinguishes lepton doublets from other isomorphic vector spaces. The following equivalences transfer the linear structure of the tensor product and expose that model when defining representations.

Identifies a lepton doublet with its underlying tensor-product value.

def valEquiv : LeptonDoublet Fermion.LeftHandedWeyl ⊗[] EuclideanSpace (Fin 2) where toFun := val invFun := fun m => m
instance : AddCommGroup LeptonDoublet := Equiv.addCommGroup valEquivinstance : Module LeptonDoublet := Equiv.module valEquiv

The linear identification with the underlying tensor product.

def valLinEquiv : LeptonDoublet ≃ₗ[] Fermion.LeftHandedWeyl ⊗[] EuclideanSpace (Fin 2) where toFun := val invFun := fun m => m map_add' := (x y : LeptonDoublet), (x + y).val = x.val + y.val x✝:LeptonDoublety✝:LeptonDoublet(x✝ + y✝).val = x✝.val + y✝.val; All goals completed! 🐙 map_smul' := (m : ) (x : LeptonDoublet), (m x).val = (RingHom.id ) m x.val m✝:x✝:LeptonDoublet(m✝ x✝).val = (RingHom.id ) m✝ x✝.val; All goals completed! 🐙
@[simp] lemma valLinEquiv_apply (l : LeptonDoublet) : valLinEquiv l = l.val := rfllemma valLinEquiv_symm_apply (m : Fermion.LeftHandedWeyl ⊗[] EuclideanSpace (Fin 2)) : valLinEquiv.symm m = m := rfl@[simp] lemma val_add (l₁ l₂ : LeptonDoublet) : (l₁ + l₂).val = l₁.val + l₂.val := rfl@[simp] lemma val_smul (r : ) (l : LeptonDoublet) : (r l).val = r l.val := rfl

C. Lorentz action

The Lorentz group acts on the left-handed Weyl factor and leaves the weak index fixed.

D. Gauge action

The colour factor acts trivially, while SU(2) acts on the weak index. The U(1) action is star z ^ 3; since z is unitary, star z = z⁻¹, so this represents charge -3.

The tensor and basis formulas below expose the coefficients used to compare actions and compute the kernel.

The gauge action on a pure spinor–weak tensor.

lemma repGaugeGroupI_tmul (g : GaugeGroupI) (v : Fermion.LeftHandedWeyl) (w : EuclideanSpace (Fin 2)) : repGaugeGroupI g v ⊗ₜ w = (star g.toU1.1 ^ 3) v ⊗ₜ (g.toSU2.1.toEuclideanLin w) := rfl

E. Kernel of the gauge action

An element acts trivially when its weak action is scalar and that scalar cancels its U(1) phase. Its colour component is unrestricted because the lepton doublet is an SU(3) singlet.

Characterizes the full-group elements acting trivially on the lepton doublet.

g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) = (GaugeGroupI.toSU2 g) 0 0 1 (GaugeGroupI.toSU2 g) 0 0 * star (GaugeGroupI.toU1 g) ^ 3 = 1 g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) = (GaugeGroupI.toSU2 g) 0 0 1g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) 0 0 * star (GaugeGroupI.toU1 g) ^ 3 = 1 g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) = (GaugeGroupI.toSU2 g) 0 0 1 g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0i:Fin 2j:Fin 2(GaugeGroupI.toSU2 g) i j = ((GaugeGroupI.toSU2 g) 0 0 1) i j g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0j:Fin 2(GaugeGroupI.toSU2 g) ((fun i => i) 0, ) j = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 0, ) jg:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0j:Fin 2(GaugeGroupI.toSU2 g) ((fun i => i) 1, ) j = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 1, ) j g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0j:Fin 2(GaugeGroupI.toSU2 g) ((fun i => i) 0, ) j = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 0, ) jg:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0j:Fin 2(GaugeGroupI.toSU2 g) ((fun i => i) 1, ) j = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 1, ) j g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) ((fun i => i) 1, ) ((fun i => i) 0, ) = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 1, ) ((fun i => i) 0, )g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) ((fun i => i) 1, ) ((fun i => i) 1, ) = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 1, ) ((fun i => i) 1, ) g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) ((fun i => i) 0, ) ((fun i => i) 0, ) = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 0, ) ((fun i => i) 0, )g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) ((fun i => i) 0, ) ((fun i => i) 1, ) = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 0, ) ((fun i => i) 1, )g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) ((fun i => i) 1, ) ((fun i => i) 0, ) = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 1, ) ((fun i => i) 0, )g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) ((fun i => i) 1, ) ((fun i => i) 1, ) = ((GaugeGroupI.toSU2 g) 0 0 1) ((fun i => i) 1, ) ((fun i => i) 1, ) All goals completed! 🐙 g:GaugeGroupIhc:star (GaugeGroupI.toU1 g) ^ 3 0h₀₀:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 0 0 = 1h₁₀:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 1 0 = 0h₀₁:star (GaugeGroupI.toU1 g) ^ 3 = 0 (GaugeGroupI.toSU2 g) 0 1 = 0h₁₁:star (GaugeGroupI.toU1 g) ^ 3 * (GaugeGroupI.toSU2 g) 1 1 = 1h₁₀':(GaugeGroupI.toSU2 g) 1 0 = 0h₀₁':(GaugeGroupI.toSU2 g) 0 1 = 0hdiag:(GaugeGroupI.toSU2 g) 1 1 = (GaugeGroupI.toSU2 g) 0 0(GaugeGroupI.toSU2 g) 0 0 * star (GaugeGroupI.toU1 g) ^ 3 = 1 All goals completed! 🐙

F. Descent to quotient gauge groups

A representation descends through a quotient when the quotient subgroup lies in its kernel. For the central ℤ₆, the weak central phase and charge -3 phase combine to a sixth power and therefore act trivially.

The central ℤ₆ subgroup acts trivially on (1, 2)_{-3}.

lemma gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI : GaugeGroupQuot.subgroup .ℤ₆ repGaugeGroupI.ker := GaugeGroupQuot.ℤ₆.subgroup MonoidHom.ker repGaugeGroupI x : GaugeGroupI (x_1 : ˣ) (x_2 : x_1 rootsOfUnity 6 ), gaugeGroupℤ₆OfRoot x_1, x_2 = x a, (GaugeGroupI.toSU2 x) = a 1 a * star (GaugeGroupI.toU1 x) ^ 3 = 1 x:ˣhx:x rootsOfUnity 6 a, (GaugeGroupI.toSU2 (gaugeGroupℤ₆OfRoot x, hx)) = a 1 a * star (GaugeGroupI.toU1 (gaugeGroupℤ₆OfRoot x, hx)) ^ 3 = 1 x:ˣhx:x rootsOfUnity 6 (GaugeGroupI.toSU2 (gaugeGroupℤ₆OfRoot x, hx)) = (starRingEnd ) (x ^ 3) 1 (starRingEnd ) (x ^ 3) * star (GaugeGroupI.toU1 (gaugeGroupℤ₆OfRoot x, hx)) ^ 3 = 1 x:ˣhx:x rootsOfUnity 6 (x ^ 3)⁻¹ * (x ^ 3)⁻¹ = 1 x:ˣhx:x rootsOfUnity 6 1 = x ^ 6 All goals completed! 🐙

Every supported quotient subgroup acts trivially on the lepton doublet.

lemma gaugeGroup_subgroup_le_ker_repGaugeGroupI (Q : GaugeGroupQuot) : Q.subgroup repGaugeGroupI.ker := Q.subgroup_le_subgroup_ℤ₆.trans gaugeGroup_subgroup_ℤ₆_le_ker_repGaugeGroupI