Imports
/- Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Joseph Tooby-Smith -/ module public import Physlib.QFT.QED.AnomalyCancellation.VectorLike

Charges assignments with constant abs

We look at charge assignments in which all charges have the same absolute value.

@[expose] public section

The condition for two rationals to have the same square (equivalent to same abs).

def ConstAbsProp : × Prop := fun s => s.1^2 = s.2^2

The condition on a charge assignment S to have constant absolute value among charges.

@[simp] def ConstAbs (S : (PureU1 n).Charges) : Prop := i j, (S i) ^ 2 = (S j) ^ 2
set_option backward.isDefEq.respectTransparency false in lemma constAbs_perm (S : (PureU1 n).Charges) (M :(FamilyPermutations n).group) : ConstAbs ((FamilyPermutations n).rep M S) ConstAbs S := n:S:(PureU1 n).ChargesM:(FamilyPermutations n).groupConstAbs (((FamilyPermutations n).rep M) S) ConstAbs S n:S:(PureU1 n).ChargesM:(FamilyPermutations n).group(∀ (i j : Fin (PureU1 n).numberCharges), S (M⁻¹ i) ^ 2 = S (M⁻¹ j) ^ 2) (i j : Fin (PureU1 n).numberCharges), S i ^ 2 = S j ^ 2 n:S:(PureU1 n).ChargesM:(FamilyPermutations n).grouph: (i j : Fin (PureU1 n).numberCharges), S (M⁻¹ i) ^ 2 = S (M⁻¹ j) ^ 2i:Fin (PureU1 n).numberChargesj:Fin (PureU1 n).numberChargesS i ^ 2 = S j ^ 2 n:S:(PureU1 n).ChargesM:(FamilyPermutations n).grouph: (i j : Fin (PureU1 n).numberCharges), S (M⁻¹ i) ^ 2 = S (M⁻¹ j) ^ 2i:Fin (PureU1 n).numberChargesj:Fin (PureU1 n).numberChargesh2:S (M⁻¹ (M.toFun i)) ^ 2 = S (M⁻¹ (M.toFun j)) ^ 2S i ^ 2 = S j ^ 2 n:S:(PureU1 n).ChargesM:(FamilyPermutations n).grouph: (i j : Fin (PureU1 n).numberCharges), S (M⁻¹ i) ^ 2 = S (M⁻¹ j) ^ 2i:Fin (PureU1 n).numberChargesj:Fin (PureU1 n).numberChargesh2:S i ^ 2 = S j ^ 2S i ^ 2 = S j ^ 2 All goals completed! 🐙n:S:(PureU1 n).ChargesCA:ConstAbs SConstAbs (((FamilyPermutations n).rep (Equiv.symm (Tuple.sort S))) S) All goals completed! 🐙

The condition for a set of charges to be sorted, and have constAbs

def ConstAbsSorted (S : (PureU1 n).Charges) : Prop := ConstAbs S Sorted S
n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:S k 0hik:i khSS:S i S kht:S i = S k S i = -S kS i = S k n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:S k 0hik:i khSS:S i S kh✝:S i = S kS i = S kn:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:S k 0hik:i khSS:S i S kh✝:S i = -S kS i = S k n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:S k 0hik:i khSS:S i S kh✝:S i = S kS i = S kn:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:S k 0hik:i khSS:S i S kh✝:S i = -S kS i = S k n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:S k 0hik:i khSS:S i S kh:S i = -S kS i = S k n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:S k 0hik:i khSS:S i S kh:S i = S kS i = S k All goals completed! 🐙 n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:S k 0hik:i khSS:S i S kh:S i = -S kS i = S k All goals completed! 🐙include hS in lemma val_le_zero {i : Fin n.succ} (hi : S i 0) : S i = S (0 : Fin n.succ) := n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Si:Fin n.succhi:S i 0S i = S 0 n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Si:Fin n.succhi:S i 0S 0 = S i n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Si:Fin n.succhi:S i 00 i All goals completed! 🐙n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:0 S khik:k ihSS:S k S iht:S i = S k S i = -S kS i = S k n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:0 S khik:k ihSS:S k S ih✝:S i = S kS i = S kn:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:0 S khik:k ihSS:S k S ih✝:S i = -S kS i = S k n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:0 S khik:k ihSS:S k S ih✝:S i = S kS i = S kn:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:0 S khik:k ihSS:S k S ih✝:S i = -S kS i = S k n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:0 S khik:k ihSS:S k S ih:S i = -S kS i = S k n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:0 S khik:k ihSS:S k S ih:S i = S kS i = S k All goals completed! 🐙 n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin n.succi:Fin n.succhk:0 S khik:k ihSS:S k S ih:S i = -S kS i = S k All goals completed! 🐙include hS in lemma zero_gt (h0 : 0 S (0 : Fin n.succ)) (i : Fin n.succ) : S (0 : Fin n.succ) = S i := n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:0 S 0i:Fin n.succS 0 = S i n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:0 S 0i:Fin n.succS i = S 0 All goals completed! 🐙n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Si:Fin n.succj:Fin n.succhi:S i 0hj:0 S jhSS:S i = S j S i = -S jS i = -S j n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Si:Fin n.succj:Fin n.succhi:S i 0hj:0 S jh:S i = S jS i = -S jn:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Si:Fin n.succj:Fin n.succhi:S i 0hj:0 S jh:S i = -S jS i = -S j n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Si:Fin n.succj:Fin n.succhi:S i 0hj:0 S jh:S i = S jS i = -S j n:S:(PureU1 n.succ).Chargesi:Fin n.succj:Fin n.succhS:ConstAbsSorted Shi:S j 0hj:0 S jh:S i = S jS j = -S j All goals completed! 🐙 n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Si:Fin n.succj:Fin n.succhi:S i 0hj:0 S jh:S i = -S jS i = -S j All goals completed! 🐙n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 = 0i:Fin (PureU1 n.succ).numberChargesht:S i ^ 2 = 0 ^ 2S i = 0 i n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 = 0i:Fin (PureU1 n.succ).numberChargesht:S i = 0S i = 0 i All goals completed! 🐙

A boundary of S : (PureU1 n.succ).charges (assumed sorted, constAbs and non-zero) is defined as a element of k ∈ Fin n such that S k.castSucc and S k.succ are different signs.

@[simp] def Boundary (S : (PureU1 n.succ).Charges) (k : Fin n) : Prop := S k.castSucc < 0 0 < S k.succ
include hS in lemma boundary_castSucc {k : Fin n} (hk : Boundary S k) : S k.castSucc = S (0 : Fin n.succ) := (lt_eq hS (le_of_lt hk.left) (Fin.zero_le k.castSucc : 0 k.castSucc)).symmn:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin nhk:Boundary S khn:-S k.succ = S 0S k.succ = -S 0 All goals completed! 🐙lemma boundary_split (k : Fin n) : k.succ.val + (n.succ - k.succ.val) = n.succ := n:k:Fin nk.succ + (n.succ - k.succ) = n.succ All goals completed! 🐙set_option backward.isDefEq.respectTransparency false in lemma boundary_accGrav' (k : Fin n) : accGrav n.succ S = i : Fin (k.succ.val + (n.succ - k.succ.val)), S (Fin.cast (boundary_split k) i) := n:S:(PureU1 n.succ).Chargesk:Fin n(accGrav n.succ) S = i, S (Fin.cast i) n:S:(PureU1 n.succ).Chargesk:Fin n i, S i = x, S (Fin.cast x) erw [n:S:(PureU1 n.succ).Chargesk:Fin n i, S i = i ?m.34, ?m.36 in:S:(PureU1 n.succ).Chargesk:Fin n (i : Fin (k.succ + (n.succ - k.succ))), i univ (Fin.castOrderIso ).toEquiv i ?m.34n:S:(PureU1 n.succ).Chargesk:Fin n i univ, S (Fin.cast i) = ?m.36 ((Fin.castOrderIso ).toEquiv i)n:S:(PureU1 n.succ).Chargesk:Fin nFinset (Fin n.succ)n:S:(PureU1 n.succ).Chargesk:Fin nFin n.succ n:S:(PureU1 n.succ).Chargesk:Fin n (i : Fin (k.succ + (n.succ - k.succ))), i univ (Fin.castOrderIso ).toEquiv i univn:S:(PureU1 n.succ).Chargesk:Fin n i univ, S (Fin.cast i) = S ((Fin.castOrderIso ).toEquiv i) n:S:(PureU1 n.succ).Chargesk:Fin n (i : Fin (k.succ + (n.succ - k.succ))), i univ (Fin.castOrderIso ).toEquiv i univ n:S:(PureU1 n.succ).Chargesk:Fin ni:Fin (k.succ + (n.succ - k.succ))i univ (Fin.castOrderIso ).toEquiv i univ All goals completed! 🐙 n:S:(PureU1 n.succ).Chargesk:Fin n i univ, S (Fin.cast i) = S ((Fin.castOrderIso ).toEquiv i) All goals completed! 🐙n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sk:Fin nhk:Boundary S khfst: (i : Fin k.succ), S (Fin.cast (Fin.castAdd (n.succ - k.succ) i)) = S k.castSucchsnd: (i : Fin (n.succ - k.succ)), S (Fin.cast (Fin.natAdd (↑k.succ) i)) = S k.succ(k + 1) * S 0 + (n - k) * -S 0 = (2 * k + 1 - n) * S 0 All goals completed! 🐙

A S ∈ charges has a boundary if there exists a k ∈ Fin n which is a boundary.

@[simp] def HasBoundary (S : (PureU1 n.succ).Charges) : Prop := (k : Fin n), Boundary S k
include hS in lemma not_hasBoundary_zero_le (hnot : ¬ (HasBoundary S)) (h0 : S (0 : Fin n.succ) < 0) : i, S (0 : Fin n.succ) = S i := n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary Sh0:S 0 < 0 (i : Fin (PureU1 n.succ).numberCharges), S 0 = S i n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary Sh0:S 0 < 0i:hi:i < (PureU1 n.succ).numberChargesS 0 = S i, hi n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0i:hi:i < (PureU1 n.succ).numberChargeshnot: (x : Fin n), S x.castSucc < 0 S x.succ 0S 0 = S i, hi n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0hi:0 < (PureU1 n.succ).numberChargesS 0 = S 0, hin:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0n✝:a✝: (hi : n✝ < (PureU1 n.succ).numberCharges), S 0 = S n✝, hihi:n✝ + 1 < (PureU1 n.succ).numberChargesS 0 = S n✝ + 1, hi n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0hi:0 < (PureU1 n.succ).numberChargesS 0 = S 0, hi All goals completed! 🐙 n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0n✝:a✝: (hi : n✝ < (PureU1 n.succ).numberCharges), S 0 = S n✝, hihi:n✝ + 1 < (PureU1 n.succ).numberChargesS 0 = S n✝ + 1, hi n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0i:hii: (hi : n✝ < (PureU1 n.succ).numberCharges), S 0 = S n✝, hihi:n✝ + 1 < (PureU1 n.succ).numberChargesS 0 = S n✝ + 1, hi n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0i:hii: (hi : n✝ < (PureU1 n.succ).numberCharges), S 0 = S n✝, hihi:n✝ + 1 < (PureU1 n.succ).numberChargeshnott:S i, .castSucc < 0 S i, .succ 0S 0 = S n✝ + 1, hi n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0i:hii✝: (hi : n✝ < (PureU1 n.succ).numberCharges), S 0 = S n✝, hihi:n✝ + 1 < (PureU1 n.succ).numberChargeshnott:S i, .castSucc < 0 S i, .succ 0hii:S 0 = S i, S 0 = S n✝ + 1, hi erw [n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0i:hii✝: (hi : n✝ < (PureU1 n.succ).numberCharges), S 0 = S n✝, hihi:n✝ + 1 < (PureU1 n.succ).numberChargeshnott:S 0 < 0 S i, .succ 0hii:S 0 = S i, S 0 = S n✝ + 1, hin:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Sh0:S 0 < 0hnot: (x : Fin n), S x.castSucc < 0 S x.succ 0i:hii✝: (hi : n✝ < (PureU1 n.succ).numberCharges), S 0 = S n✝, hihi:n✝ + 1 < (PureU1 n.succ).numberChargeshnott:S 0 < 0 S i, .succ 0hii:S 0 = S i, S 0 = S n✝ + 1, hi at hnott All goals completed! 🐙include hS in lemma not_hasBoundry_zero (hnot : ¬ (HasBoundary S)) (i : Fin n.succ) : S (0 : Fin n.succ) = S i := n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary Si:Fin n.succS 0 = S i n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary Si:Fin n.succhi:S 0 < 0S 0 = S in:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary Si:Fin n.succhi:¬S 0 < 0S 0 = S i n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary Si:Fin n.succhi:S 0 < 0S 0 = S i All goals completed! 🐙 n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary Si:Fin n.succhi:¬S 0 < 0S 0 = S i n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary Si:Fin n.succhi:0 S 0S 0 = S i All goals completed! 🐙include hS in lemma not_hasBoundary_grav (hnot : ¬ (HasBoundary S)) : accGrav n.succ S = n.succ * S (0 : Fin n.succ) := n:S:(PureU1 n.succ).ChargeshS:ConstAbsSorted Shnot:¬HasBoundary S(accGrav n.succ) S = n.succ * S 0 All goals completed! 🐙n:A:(PureU1 n.succ).LinSolshA:ConstAbsSorted A.valh:A.val 0 0hn:¬HasBoundary A.valh0:0 = (n + 1) * A.val 0False n:A:(PureU1 n.succ).LinSolshA:ConstAbsSorted A.valh:A.val 0 0hn:¬HasBoundary A.valh0:n + 1 = 0 A.val 0 = 0False n:A:(PureU1 n.succ).LinSolshA:ConstAbsSorted A.valh:A.val 0 0hn:¬HasBoundary A.valh✝:n + 1 = 0Falsen:A:(PureU1 n.succ).LinSolshA:ConstAbsSorted A.valh:A.val 0 0hn:¬HasBoundary A.valh✝:A.val 0 = 0False n:A:(PureU1 n.succ).LinSolshA:ConstAbsSorted A.valh:A.val 0 0hn:¬HasBoundary A.valh✝:n + 1 = 0False All goals completed! 🐙 n:A:(PureU1 n.succ).LinSolshA:ConstAbsSorted A.valh:A.val 0 0hn:¬HasBoundary A.valh✝:A.val 0 = 0False All goals completed! 🐙n:A:(PureU1 (2 * n + 1)).LinSolsh:ConstAbsSorted A.valhA:A.val 0 0k:Fin (2 * n)hk:Boundary A.val kh0:2 * k + 1 - 2 * n = 0h1:2 * n = 2 * k + 1False All goals completed! 🐙lemma AFL_odd_zero {A : (PureU1 (2 * n + 1)).LinSols} (h : ConstAbsSorted A.val) : A.val (0 : Fin (2 * n + 1)) = 0 := n:A:(PureU1 (2 * n + 1)).LinSolsh:ConstAbsSorted A.valA.val 0 = 0 n:A:(PureU1 (2 * n + 1)).LinSolsh:ConstAbsSorted A.valhn:¬A.val 0 = 0False All goals completed! 🐙theorem AFL_odd (A : (PureU1 (2 * n + 1)).LinSols) (h : ConstAbsSorted A.val) : A = 0 := n:A:(PureU1 (2 * n + 1)).LinSolsh:ConstAbsSorted A.valA = 0 n:A:(PureU1 (2 * n + 1)).LinSolsh:ConstAbsSorted A.valA.val = ACCSystemLinear.LinSols.val 0 All goals completed! 🐙n:A:(PureU1 (2 * n.succ)).LinSolsh:ConstAbsSorted A.valhA:A.val 0 0k:Fin (2 * n + 1)hk:Boundary A.val kh0:2 * k - 2 * n = 0k = n All goals completed! 🐙n:A:(PureU1 (2 * n.succ)).LinSolsh:ConstAbsSorted A.valhA:A.val 0 0i:Fin n.succk:Fin (Nat.mul 2 n + 1)hk:Boundary A.val ki n All goals completed! 🐙n:A:(PureU1 (2 * n.succ)).LinSolsh:ConstAbsSorted A.vali:Fin n.succhA:A.val 0 = 00 (Fin.cast (Fin.castAdd n.succ i)) = 0 0 All goals completed! 🐙 n:A:(PureU1 (2 * n.succ)).LinSolsh:ConstAbsSorted A.vali:Fin n.succhA:¬A.val 0 = 0A.val (Fin.cast (Fin.castAdd n.succ i)) = A.val 0 All goals completed! 🐙n:A:(PureU1 (2 * n.succ)).LinSolsh:ConstAbsSorted A.valhA:A.val 0 0i:Fin n.succk:Fin (Nat.mul 2 n + 1)hk:Boundary A.val kn + 1 n.succ + i All goals completed! 🐙n:A:(PureU1 (2 * n.succ)).LinSolsh:ConstAbsSorted A.vali:Fin n.succhA:A.val 0 = 00 (Fin.cast (Fin.natAdd n.succ i)) = -0 0 All goals completed! 🐙 n:A:(PureU1 (2 * n.succ)).LinSolsh:ConstAbsSorted A.vali:Fin n.succhA:¬A.val 0 = 0A.val (Fin.cast (Fin.natAdd n.succ i)) = -A.val 0 All goals completed! 🐙theorem boundary_value_odd (S : (PureU1 (2 * n + 1)).LinSols) (hs : ConstAbs S.val) : S = 0 := have hS := And.intro (constAbs_sort hs) (sort_sorted S.val) sortAFL_zero S (ConstAbsSorted.AFL_odd (sortAFL S) hS)n:S:(PureU1 (2 * n.succ)).LinSolshs:ConstAbs S.valhS:ConstAbs (sort S.val) Sorted (sort S.val)i:Fin n.succh1: (i : Fin n.succ), sort S.val (Fin.cast (Fin.castAdd n.succ i)) = sort S.val 0h2: (i : Fin n.succ), sort S.val (Fin.cast (Fin.natAdd n.succ i)) = -sort S.val 0sort S.val 0 = - -sort S.val 0 All goals completed! 🐙