Imports
/- Copyright (c) 2025 Joseph Tooby-Smith. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module public import Mathlib.Data.Finset.Powerset public import Mathlib.Data.Finset.Prod public import Mathlib.Data.Finset.Sort public import Mathlib.Data.Finset.Option

Charge Spectrum

i. Overview

In this module we define the charge spectrum of a SU(5) SUSY GUT theory with additional charges (usually U(1)) valued in 𝓩 satisfying the condition of:

    The optional existence of a Hd particle in the bar 5 representation.

    The optional existence of a Hu particle in the 5 representation.

    The optional existence of matter in the bar 5 representation.

    The optional existence of matter in the 10 representation.

The charge spectrum contains the information of the unique charges of each type of particle present in theory. Importantly, the charge spectrum does not contain information about the multiplicity of those charges.

With just the charge spectrum of the theory it is possible to put a number of constraints on the theory, most notably phenomenological constraints.

By keeping the presence of Hd and Hu optional, we can define a number of useful properties of the charge spectrum, which can help in searching for viable theories.

ii. Key results

    ChargeSpectrum 𝓩 : The type of charge spectra with charges of type 𝓩, which is usually .

iii. Table of contents

    A. The definition of the charge spectrum

      A.1. Extensionality properties

      A.2. Relation to products

      A.3. Rendering

    B. The subset relation

    C. The empty charge spectrum

    D. The cardinality of a charge spectrum

    E. The power set of a charge spectrum

    F. Finite sets of charge spectra with values

      F.1. Cardinality of finite sets of charge spectra with values

iv. References

There are no known references for charge spectra in the literature. They were created specifically for the purpose of Physlib.

@[expose] public section

A. The definition of the charge spectrum

The type such that an element corresponds to the collection of charges associated with the matter content of the theory. The order of charges is implicitly taken to be qHd, qHu, Q5, Q10.

The Q5 and Q10 charges are represented by Finset rather than Multiset, so multiplicity is not included.

This is defined for a general type 𝓩, which could be e.g.

    in the case of U(1),

    ℤ × ℤ in the case of U(1) × U(1),

    Fin 2 in the case of ℤ₂ etc.

The charge of the Hd particle.

The negative of the charge of the Hu particle. That is to say, the charge of the Hu when considered in the 5-bar representation.

The finite set of charges of the matter fields in the Q5 representation.

The finite set of charges of the matter fields in the Q10 representation.

structure ChargeSpectrum (𝓩 : Type := ) where qHd : Option 𝓩 qHu : Option 𝓩 Q5 : Finset 𝓩 Q10 : Finset 𝓩

A.1. Extensionality properties

We prove extensionality properties for ChargeSpectrum 𝓩, that is conditions of when two elements of ChargeSpectrum 𝓩 are equal. We also show that when 𝓩 has decidable equality, so does ChargeSpectrum 𝓩.

lemma eq_of_parts {x y : ChargeSpectrum 𝓩} (h1 : x.qHd = y.qHd) (h2 : x.qHu = y.qHu) (h3 : x.Q5 = y.Q5) (h4 : x.Q10 = y.Q10) : x = y := 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h1:x.qHd = y.qHdh2:x.qHu = y.qHuh3:x.Q5 = y.Q5h4:x.Q10 = y.Q10x = y 𝓩:Typey:ChargeSpectrum 𝓩qHd✝:Option 𝓩qHu✝:Option 𝓩Q5✝:Finset 𝓩Q10✝:Finset 𝓩h1:{ qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }.qHd = y.qHdh2:{ qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }.qHu = y.qHuh3:{ qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }.Q5 = y.Q5h4:{ qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }.Q10 = y.Q10{ qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ } = y 𝓩:TypeqHd✝¹:Option 𝓩qHu✝¹:Option 𝓩Q5✝¹:Finset 𝓩Q10✝¹:Finset 𝓩qHd✝:Option 𝓩qHu✝:Option 𝓩Q5✝:Finset 𝓩Q10✝:Finset 𝓩h1:{ qHd := qHd✝¹, qHu := qHu✝¹, Q5 := Q5✝¹, Q10 := Q10✝¹ }.qHd = { qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }.qHdh2:{ qHd := qHd✝¹, qHu := qHu✝¹, Q5 := Q5✝¹, Q10 := Q10✝¹ }.qHu = { qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }.qHuh3:{ qHd := qHd✝¹, qHu := qHu✝¹, Q5 := Q5✝¹, Q10 := Q10✝¹ }.Q5 = { qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }.Q5h4:{ qHd := qHd✝¹, qHu := qHu✝¹, Q5 := Q5✝¹, Q10 := Q10✝¹ }.Q10 = { qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }.Q10{ qHd := qHd✝¹, qHu := qHu✝¹, Q5 := Q5✝¹, Q10 := Q10✝¹ } = { qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ } All goals completed! 🐙lemma eq_iff {x y : ChargeSpectrum 𝓩} : x = y x.qHd = y.qHd x.qHu = y.qHu x.Q5 = y.Q5 x.Q10 = y.Q10 := fun h => congrArg qHd h, congrArg qHu h, congrArg Q5 h, congrArg Q10 h, fun h1, h2, h3, h4 => eq_of_parts h1 h2 h3 h4instance [DecidableEq 𝓩] : DecidableEq (ChargeSpectrum 𝓩) := fun _ _ => decidable_of_iff _ eq_iff.symm

A.2. Relation to products

We show that ChargeSpectrum 𝓩 is equivalent to the product Option 𝓩 × Option 𝓩 × Finset 𝓩 × Fin 𝓩.

In an old implementation this was definitionally true, it is not so now.

The explicit casting of a term of type Charges 𝓩 to a term of Option 𝓩 × Option 𝓩 × Finset 𝓩 × Finset 𝓩.

def toProd : ChargeSpectrum 𝓩 Option 𝓩 × Option 𝓩 × Finset 𝓩 × Finset 𝓩 where toFun x := (x.qHd, x.qHu, x.Q5, x.Q10) invFun x := x.1, x.2.1, x.2.2.1, x.2.2.2 left_inv x := 𝓩:Typex:ChargeSpectrum 𝓩(fun x => { qHd := x.1, qHu := x.2.1, Q5 := x.2.2.1, Q10 := x.2.2.2 }) ((fun x => (x.qHd, x.qHu, x.Q5, x.Q10)) x) = x 𝓩:TypeqHd✝:Option 𝓩qHu✝:Option 𝓩Q5✝:Finset 𝓩Q10✝:Finset 𝓩(fun x => { qHd := x.1, qHu := x.2.1, Q5 := x.2.2.1, Q10 := x.2.2.2 }) ((fun x => (x.qHd, x.qHu, x.Q5, x.Q10)) { qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }) = { qHd := qHd✝, qHu := qHu✝, Q5 := Q5✝, Q10 := Q10✝ }; All goals completed! 🐙 right_inv x := 𝓩:Typex:Option 𝓩 × Option 𝓩 × Finset 𝓩 × Finset 𝓩(fun x => (x.qHd, x.qHu, x.Q5, x.Q10)) ((fun x => { qHd := x.1, qHu := x.2.1, Q5 := x.2.2.1, Q10 := x.2.2.2 }) x) = x 𝓩:Typefst✝:Option 𝓩snd✝:Option 𝓩 × Finset 𝓩 × Finset 𝓩(fun x => (x.qHd, x.qHu, x.Q5, x.Q10)) ((fun x => { qHd := x.1, qHu := x.2.1, Q5 := x.2.2.1, Q10 := x.2.2.2 }) (fst✝, snd✝)) = (fst✝, snd✝); All goals completed! 🐙

A.3. Rendering

unsafe instance [Repr 𝓩] : Repr (ChargeSpectrum 𝓩) where reprPrec x _ := match x with | qHd, qHu, Q5, Q10 => let s1 := reprStr qHd let s2 := reprStr qHu let s5 := reprStr Q5 let s10 := reprStr Q10 s!"⟨{s1}, {s2}, {s5}, {s10}⟩"

B. The subset relation

We define a HasSubset and HasSSubset instance on ChargeSpectrum 𝓩.

instance hasSubset : HasSubset (ChargeSpectrum 𝓩) where Subset x y := x.qHd.toFinset y.qHd.toFinset x.qHu.toFinset y.qHu.toFinset x.Q5 y.Q5 x.Q10 y.Q10instance hasSSubset : HasSSubset (ChargeSpectrum 𝓩) where SSubset x y := x y x yinstance subsetDecidable [DecidableEq 𝓩] (x y : ChargeSpectrum 𝓩) : Decidable (x y) := instDecidableAndlemma subset_def {x y : ChargeSpectrum 𝓩} : x y x.qHd.toFinset y.qHd.toFinset x.qHu.toFinset y.qHu.toFinset x.Q5 y.Q5 x.Q10 y.Q10 := 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩x y x.qHd.toFinset y.qHd.toFinset x.qHu.toFinset y.qHu.toFinset x.Q5 y.Q5 x.Q10 y.Q10 All goals completed! 🐙@[simp, refl] lemma subset_refl (x : ChargeSpectrum 𝓩) : x x := 𝓩:Typex:ChargeSpectrum 𝓩x.qHd.toFinset x.qHd.toFinset All goals completed! 🐙, 𝓩:Typex:ChargeSpectrum 𝓩x.qHu.toFinset x.qHu.toFinset All goals completed! 🐙, 𝓩:Typex:ChargeSpectrum 𝓩x.Q5 x.Q5 All goals completed! 🐙, 𝓩:Typex:ChargeSpectrum 𝓩x.Q10 x.Q10 All goals completed! 🐙lemma _root_.Option.toFinset_inj {x y : Option 𝓩} : x = y x.toFinset = y.toFinset := 𝓩:Typex:Option 𝓩y:Option 𝓩x = y x.toFinset = y.toFinset 𝓩:Typey:Option 𝓩none = y none.toFinset = y.toFinset𝓩:Typey:Option 𝓩val✝:𝓩some val✝ = y (some val✝).toFinset = y.toFinset 𝓩:Typey:Option 𝓩none = y none.toFinset = y.toFinset𝓩:Typey:Option 𝓩val✝:𝓩some val✝ = y (some val✝).toFinset = y.toFinset 𝓩:Typeval✝:𝓩some val✝ = none (some val✝).toFinset = none.toFinset𝓩:Typeval✝¹:𝓩val✝:𝓩some val✝¹ = some val✝ (some val✝¹).toFinset = (some val✝).toFinset 𝓩:Typenone = none none.toFinset = none.toFinset𝓩:Typeval✝:𝓩none = some val✝ none.toFinset = (some val✝).toFinset𝓩:Typeval✝:𝓩some val✝ = none (some val✝).toFinset = none.toFinset𝓩:Typeval✝¹:𝓩val✝:𝓩some val✝¹ = some val✝ (some val✝¹).toFinset = (some val✝).toFinset All goals completed! 🐙𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩z:ChargeSpectrum 𝓩hxy:x.qHd.toFinset y.qHd.toFinset x.qHu.toFinset y.qHu.toFinset x.Q5 y.Q5 x.Q10 y.Q10hyz:y.qHd.toFinset z.qHd.toFinset y.qHu.toFinset z.qHu.toFinset y.Q5 z.Q5 y.Q10 z.Q10x.qHd.toFinset z.qHd.toFinset x.qHu.toFinset z.qHu.toFinset x.Q5 z.Q5 x.Q10 z.Q10 All goals completed! 🐙lemma subset_antisymm {x y : ChargeSpectrum 𝓩} (hxy : x y) (hyx : y x) : x = y := eq_of_parts (Option.toFinset_inj.mpr (Finset.Subset.antisymm hxy.1 hyx.1)) (Option.toFinset_inj.mpr (Finset.Subset.antisymm hxy.2.1 hyx.2.1)) (Finset.Subset.antisymm hxy.2.2.1 hyx.2.2.1) (Finset.Subset.antisymm hxy.2.2.2 hyx.2.2.2)

C. The empty charge spectrum

instance emptyInst : EmptyCollection (ChargeSpectrum 𝓩) where emptyCollection := none, none, {}, {}lemma empty_eq : ( : ChargeSpectrum 𝓩) = none, none, {}, {} := rfl@[simp] lemma empty_subset (x : ChargeSpectrum 𝓩) : x := 𝓩:Typex:ChargeSpectrum 𝓩 x All goals completed! 🐙@[simp] lemma subset_of_empty_iff_empty {x : ChargeSpectrum 𝓩} : x x = := 𝓩:Typex:ChargeSpectrum 𝓩x x = 𝓩:Typex:ChargeSpectrum 𝓩x = x 𝓩:Type All goals completed! 🐙@[simp] lemma empty_qHd : ( : ChargeSpectrum 𝓩).qHd = none := 𝓩:Type.qHd = none All goals completed! 🐙@[simp] lemma empty_qHu : ( : ChargeSpectrum 𝓩).qHu = none := 𝓩:Type.qHu = none All goals completed! 🐙@[simp] lemma empty_Q5 : ( : ChargeSpectrum 𝓩).Q5 = := 𝓩:Type.Q5 = All goals completed! 🐙@[simp] lemma empty_Q10 : ( : ChargeSpectrum 𝓩).Q10 = := 𝓩:Type.Q10 = All goals completed! 🐙

D. The cardinality of a charge spectrum

The cardinality of a Charges is defined to be the sum of the cardinalities of each of the underlying finite sets of charges, with Option ℤ turned to finsets.

def card (x : ChargeSpectrum 𝓩) : Nat := x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card
@[simp] lemma card_empty : card ( : ChargeSpectrum 𝓩) = 0 := 𝓩:Type.card = 0 All goals completed! 🐙lemma card_mono {x y : ChargeSpectrum 𝓩} (h : x y) : card x card y := 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yx.card y.card 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yh1:x.qHd.toFinset.card y.qHd.toFinset.cardx.card y.card 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yh1:x.qHd.toFinset.card y.qHd.toFinset.cardh2:x.qHu.toFinset.card y.qHu.toFinset.cardx.card y.card 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yh1:x.qHd.toFinset.card y.qHd.toFinset.cardh2:x.qHu.toFinset.card y.qHu.toFinset.cardh3:x.Q5.card y.Q5.cardx.card y.card 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yh1:x.qHd.toFinset.card y.qHd.toFinset.cardh2:x.qHu.toFinset.card y.qHu.toFinset.cardh3:x.Q5.card y.Q5.cardh4:x.Q10.card y.Q10.cardx.card y.card 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yh1:x.qHd.toFinset.card y.qHd.toFinset.cardh2:x.qHu.toFinset.card y.qHu.toFinset.cardh3:x.Q5.card y.Q5.cardh4:x.Q10.card y.Q10.cardx.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.card All goals completed! 🐙lemma eq_of_subset_card {x y : ChargeSpectrum 𝓩} (h : x y) (hcard : card x = card y) : x = y := 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.card = y.cardx = y 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardx = y 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardx = y 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardx = y 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardx = y 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx = y 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx.qHd.toFinset = y.qHd.toFinset𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx.qHu.toFinset = y.qHu.toFinset𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx.Q5 = y.Q5𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx.Q10 = y.Q10 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx.qHd.toFinset = y.qHd.toFinset exact Finset.eq_of_subset_of_card_le h.1 (𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardy.qHd.toFinset.card x.qHd.toFinset.card All goals completed! 🐙) 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx.qHu.toFinset = y.qHu.toFinset exact Finset.eq_of_subset_of_card_le h.2.1 (𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardy.qHu.toFinset.card x.qHu.toFinset.card All goals completed! 🐙) 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx.Q5 = y.Q5 exact Finset.eq_of_subset_of_card_le h.2.2.1 (𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardy.Q5.card x.Q5.card All goals completed! 🐙) 𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardx.Q10 = y.Q10 exact Finset.eq_of_subset_of_card_le h.2.2.2 (𝓩:Typex:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhcard:x.qHu.toFinset.card + x.qHd.toFinset.card + x.Q5.card + x.Q10.card = y.qHu.toFinset.card + y.qHd.toFinset.card + y.Q5.card + y.Q10.cardc1:x.qHd.toFinset.card y.qHd.toFinset.cardc2:x.qHu.toFinset.card y.qHu.toFinset.cardc3:x.Q5.card y.Q5.cardc4:x.Q10.card y.Q10.cardy.Q10.card x.Q10.card All goals completed! 🐙)

E. The power set of a charge spectrum

The powerset of x : Option 𝓩 defined as {none} if x is none and {none, some y} is x is some y.

def _root_.Option.powerset (x : Option 𝓩) : Finset (Option 𝓩) := match x with | none => {none} | some x => {none, some x}
@[simp] lemma _root_.Option.mem_powerset_iff {x : Option 𝓩} (y : Option 𝓩) : y x.powerset y.toFinset x.toFinset := 𝓩:Typeinst✝:DecidableEq 𝓩x:Option 𝓩y:Option 𝓩y x.powerset y.toFinset x.toFinset 𝓩:Typeinst✝:DecidableEq 𝓩y:Option 𝓩y none.powerset y.toFinset none.toFinset𝓩:Typeinst✝:DecidableEq 𝓩y:Option 𝓩val✝:𝓩y (some val✝).powerset y.toFinset (some val✝).toFinset 𝓩:Typeinst✝:DecidableEq 𝓩y:Option 𝓩y none.powerset y.toFinset none.toFinset𝓩:Typeinst✝:DecidableEq 𝓩y:Option 𝓩val✝:𝓩y (some val✝).powerset y.toFinset (some val✝).toFinset 𝓩:Typeinst✝:DecidableEq 𝓩val✝:𝓩none (some val✝).powerset none.toFinset (some val✝).toFinset𝓩:Typeinst✝:DecidableEq 𝓩val✝¹:𝓩val✝:𝓩some val✝ (some val✝¹).powerset (some val✝).toFinset (some val✝¹).toFinset 𝓩:Typeinst✝:DecidableEq 𝓩none none.powerset none.toFinset none.toFinset𝓩:Typeinst✝:DecidableEq 𝓩val✝:𝓩some val✝ none.powerset (some val✝).toFinset none.toFinset𝓩:Typeinst✝:DecidableEq 𝓩val✝:𝓩none (some val✝).powerset none.toFinset (some val✝).toFinset𝓩:Typeinst✝:DecidableEq 𝓩val✝¹:𝓩val✝:𝓩some val✝ (some val✝¹).powerset (some val✝).toFinset (some val✝¹).toFinset All goals completed! 🐙

The powerset of a charge . Given a charge x : Charges it's powerset is the finite set of all Charges which are subsets of x.

def powerset (x : ChargeSpectrum 𝓩) : Finset (ChargeSpectrum 𝓩) := (x.qHd.powerset.product <| x.qHu.powerset.product <| x.Q5.powerset.product <| x.Q10.powerset).map toProd.symm.toEmbedding
lemma mem_powerset_iff {x y : ChargeSpectrum 𝓩} : x powerset y x.qHd y.qHd.powerset x.qHu y.qHu.powerset x.Q5 y.Q5.powerset x.Q10 y.Q10.powerset := 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩x y.powerset x.qHd y.qHd.powerset x.qHu y.qHu.powerset x.Q5 y.Q5.powerset x.Q10 y.Q10.powerset All goals completed! 🐙@[simp] lemma mem_powerset_iff_subset {x y : ChargeSpectrum 𝓩} : x powerset y x y := 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩x y.powerset x y All goals completed! 🐙lemma self_mem_powerset (x : ChargeSpectrum 𝓩) : x powerset x := 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩x x.powerset All goals completed! 🐙lemma empty_mem_powerset (x : ChargeSpectrum 𝓩) : powerset x := 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩 x.powerset All goals completed! 🐙@[simp] lemma powerset_of_empty : powerset ( : ChargeSpectrum 𝓩) = {} := 𝓩:Typeinst✝:DecidableEq 𝓩.powerset = {} 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩x .powerset x {} All goals completed! 🐙lemma powerset_mono {x y : ChargeSpectrum 𝓩} : powerset x powerset y x y := 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩x.powerset y.powerset x y 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩x.powerset y.powerset x y𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩x y x.powerset y.powerset 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩x.powerset y.powerset x y 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x.powerset y.powersetx y All goals completed! 🐙 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩x y x.powerset y.powerset 𝓩:Typeinst✝:DecidableEq 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yz:ChargeSpectrum 𝓩hz:z x.powersetz y.powerset All goals completed! 🐙-- `unusedArguments` (newly flagged under v4.32.0): `hn` names the induction -- target but the proof discharges it directly via `exists_min_image`. @[nolint unusedArguments] lemma min_exists_inductive (S : Finset (ChargeSpectrum 𝓩)) (hS : S ) : (n : ) (hn : S.card = n) y S, powerset y S = {y} := 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S (n : ), S.card = n y S, y.powerset S = {y} 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝ y S, y.powerset S = {y} 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.card y S, y.powerset S = {y} 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.cardy.powerset S = {y} 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.cardz:ChargeSpectrum 𝓩z y.powerset S z {y} 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.cardz:ChargeSpectrum 𝓩z y z S z = y 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.cardz:ChargeSpectrum 𝓩z y z S z = y𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.cardz:ChargeSpectrum 𝓩z = y z y z S 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.cardz:ChargeSpectrum 𝓩z y z S z = y 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.cardz:ChargeSpectrum 𝓩hzy:z yhzS:z Sz = y All goals completed! 🐙 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝y:ChargeSpectrum 𝓩hyS:y Shy: x' S, y.card x'.cardz:ChargeSpectrum 𝓩z = y z y z S 𝓩:Typeinst✝:DecidableEq 𝓩S:Finset (ChargeSpectrum 𝓩)hS:S n✝:hn✝:S.card = n✝z:ChargeSpectrum 𝓩hyS:z Shy: x' S, z.card x'.cardz z z S All goals completed! 🐙lemma min_exists (S : Finset (ChargeSpectrum 𝓩)) (hS : S ) : y S, powerset y S = {y} := min_exists_inductive S hS S.card rfl

F. Finite sets of charge spectra with values

We define the finite set of ChargeSpectrum with 5-bar and 10d representation charges in a given finite set.

Given S5 S10 : Finset 𝓩 the finite set of charges associated with for which the 5-bar representation charges sit in S5 and the 10d representation charges sit in S10.

def ofFinset (S5 S10 : Finset 𝓩) : Finset (ChargeSpectrum 𝓩) := let SqHd := {none} S5.map Option.some, Option.some_injective 𝓩 let SqHu := {none} S5.map Option.some, Option.some_injective 𝓩 let SQ5 := S5.powerset let SQ10 := S10.powerset (SqHd.product (SqHu.product (SQ5.product SQ10))).map toProd.symm.toEmbedding
𝓩:Typeinst✝:DecidableEq 𝓩S5:Finset 𝓩S10:Finset 𝓩x:ChargeSpectrum 𝓩hoption: (a : Option 𝓩) (S : Finset 𝓩), a {none} Finset.map { toFun := some, inj' := } S a.toFinset Sx ofFinset S5 S10 x.qHd.toFinset S5 x.qHu.toFinset S5 x.Q5 S5 x.Q10 S10 All goals completed! 🐙𝓩:Typeinst✝:DecidableEq 𝓩S5:Finset 𝓩S10:Finset 𝓩x:ChargeSpectrum 𝓩y:ChargeSpectrum 𝓩h:x yhy:y.qHd.toFinset S5 y.qHu.toFinset S5 y.Q5 S5 y.Q10 S10x.qHd.toFinset S5 x.qHu.toFinset S5 x.Q5 S5 x.Q10 S10 All goals completed! 🐙𝓩:Typeinst✝:DecidableEq 𝓩S5:Finset 𝓩S5':Finset 𝓩S10:Finset 𝓩S10':Finset 𝓩h5:S5 S5'h10:S10 S10'x:ChargeSpectrum 𝓩hx:x.qHd.toFinset S5 x.qHu.toFinset S5 x.Q5 S5 x.Q10 S10x.qHd.toFinset S5' x.qHu.toFinset S5' x.Q5 S5' x.Q10 S10' All goals completed! 🐙𝓩:Typeinst✝¹:DecidableEq 𝓩inst✝:Fintype 𝓩x:ChargeSpectrum 𝓩x.qHd.toFinset Finset.univ x.qHu.toFinset Finset.univ x.Q5 Finset.univ x.Q10 Finset.univ All goals completed! 🐙

F.1. Cardinality of finite sets of charge spectra with values

The cardinality of ofFinset S5 S10.

def ofFinsetCard (S5 S10 : Finset 𝓩) : := (S5.card + 1) * (S5.card + 1) * (2 ^ S5.card : ) * (2 ^ S10.card : )
lemma ofFinset_card_eq_ofFinsetCard (S5 S10 : Finset 𝓩) : (ofFinset S5 S10).card = ofFinsetCard S5 S10 := 𝓩:Typeinst✝:DecidableEq 𝓩S5:Finset 𝓩S10:Finset 𝓩(ofFinset S5 S10).card = ofFinsetCard S5 S10 𝓩:Typeinst✝:DecidableEq 𝓩S5:Finset 𝓩S10:Finset 𝓩(S5.card + 1) * ((S5.card + 1) * (2 ^ S5.card * 2 ^ S10.card)) = (S5.card + 1) * (S5.card + 1) * 2 ^ S5.card * 2 ^ S10.card All goals completed! 🐙