tier_b.py — src/28-flavour

The file src/28-flavour/tier_b.py of the validation package of the paper 28-flav, rendered with an anchor per line; the file itself is beside this page.

28-flavour ledgersrc/28-flavour/tier_b.py · 11.8 KBtier_b.py
1#!/usr/bin/env python32# -*- coding: utf-8 -*-3"""4Tier-B push of the finite-substrate flavour ledger (28-spectroscopy).5Items M5, M6, M7, M8, M9 of reports/mass-spectrum-ledger.67Discipline: every EXACT claim is checked in symbolic / rational arithmetic8(sympy); every numerical claim against data is reported with its figure of9merit; fits/illustrations are labelled as such.  No claim is asserted that the10script does not verify.11"""1213import sympy as sp14import numpy as np1516# ---------------------------------------------------------------------------17# FINITISM.  The load-bearing EXACT claims (the Koide identities) are also18# verified float-free in validation/exact_core.py, in the cyclotomic field19# Q(omega,sqrt2).  In THIS file the symbolic Koide checks (M8.sum1/sum2/20# exact23/ampl) are exact; every OTHER check is a labelled continuum21# approximation -- a comparison to measured masses, a lambda-power read via22# log, a Gatto sqrt-ratio, or an RNG/float mixing demonstration -- on which23# NO exact claim depends.  See reports/finitism-audit/.24# ---------------------------------------------------------------------------2526PASS, FAIL = "PASS", "FAIL"27results = []2829def check(tag, cond, detail=""):30    results.append((tag, PASS if cond else FAIL, detail))31    print(f"[{PASS if cond else FAIL}] {tag}: {detail}")3233# ----------------------------------------------------------------------34# Data (PDG central values, MeV).  Charged leptons are the clean sector.35# ----------------------------------------------------------------------36m_e, m_mu, m_tau = 0.51099895000, 105.6583755, 1776.8637# quarks (MSbar, ~2 GeV for u,d,s; m_c(m_c), m_b(m_b); pole-ish top) in MeV38m_u, m_c, m_t = 2.16, 1270.0, 172570.039m_d, m_s, m_b = 4.67, 93.4, 4180.040# CKM Wolfenstein41lam = 0.2250042Vus, Vcb, Vub = 0.2243, 0.0405, 0.003824344print("="*72)45print("M8  KOIDE:  Q = 2/3 from cube-root generations + quarter-turn bisection")46print("="*72)4748# (1) The empirical value, charged leptons.49Q_lep = (m_e+m_mu+m_tau)/(np.sqrt(m_e)+np.sqrt(m_mu)+np.sqrt(m_tau))**250check("M8.data", abs(Q_lep-2/3) < 1e-3,51      f"Q_lep = {Q_lep:.6f}  vs 2/3 = {2/3:.6f}  (dev {abs(Q_lep-2/3):.2e})")5253# (2) EXACT identity.  a_i = 1 + r cos(delta + 2*pi*i/3), i=0,1,2.54#     Claim: Sum a_i^2 / (Sum a_i)^2 = 2/3 for r = sqrt(2), ALL delta.55d, r = sp.symbols('delta r', real=True)56a = [1 + r*sp.cos(d + 2*sp.pi*i/3) for i in range(3)]57S1 = sp.simplify(sum(a))                       # should be 3, delta-independent58S2 = sp.simplify(sum(ai**2 for ai in a))       # should be 3 + (3/2) r^259Q_sym = sp.simplify(S2/S1**2)60Q_at_sqrt2 = sp.simplify(Q_sym.subs(r, sp.sqrt(2)))61check("M8.sum1", sp.simplify(S1-3) == 0, f"Sum a_i = {S1} (delta-independent)")62check("M8.sum2", sp.simplify(S2-(3+sp.Rational(3,2)*r**2)) == 0,63      f"Sum a_i^2 = {S2}")64check("M8.exact23", sp.simplify(Q_at_sqrt2-sp.Rational(2,3)) == 0,65      f"Q(r=sqrt2) = {Q_at_sqrt2}  for ALL delta  -> exact 2/3")6667# (3) The amplitude that produces 2/3 is exactly r = sqrt(2):  solve Q=2/3.68sol = sp.solve(sp.Eq(Q_sym, sp.Rational(2,3)), r)69check("M8.ampl", any(sp.simplify(s-sp.sqrt(2))==0 for s in sol),70      f"Q=2/3  <=>  r in {sol}  (positive root sqrt2 = quarter-turn diagonal)")7172# (4) C3-character (Parseval) reading: Q = 1/3 + (2/3) rho^2,73#     rho = |coherent amplitude| / |trivial amplitude|.  Q=2/3 <=> rho = 1/sqrt2.74av = np.array([np.sqrt(m_e), np.sqrt(m_mu), np.sqrt(m_tau)])75w = np.exp(2j*np.pi/3)76ahat0 = av.sum()                                   # trivial C3 mode (real)77ahat1 = (av * w**(-np.arange(3))).sum()            # coherent C3 mode78rho = abs(ahat1)/abs(ahat0)79Q_from_rho = 1/3 + (2/3)*rho**280check("M8.rho", abs(rho-1/np.sqrt(2)) < 2e-3,81      f"rho = |a_1|/|a_0| = {rho:.6f}  vs 1/sqrt2 = {1/np.sqrt(2):.6f}")82check("M8.parseval", abs(Q_from_rho-Q_lep) < 1e-9,83      f"1/3+2/3 rho^2 = {Q_from_rho:.6f} reproduces Q_lep")8485# (5) geometric reading: angle of (sqrt m) to democratic (1,1,1) is 45 deg.86cos2 = (av.sum())**2/(3*(av**2).sum())             # = 1/(3Q)87theta = np.degrees(np.arccos(np.sqrt(cos2)))88check("M8.angle45", abs(theta-45.0) < 0.2,89      f"angle(sqrt m, democratic) = {theta:.4f} deg  (cos^2={cos2:.5f}~1/2)")9091# (6) the Koide phase delta (a Tier-C winding datum, reported, not claimed).92#   a_k/mean = 1 + sqrt2 cos(delta + 2pi k/3); the tau component sits near phase 0,93#   so delta = arccos((n_tau - 1)/sqrt2) with n_tau the normalised sqrt(m_tau).94n_norm = av/(av.mean())                 # normalised so mean = 195delta_emp = np.arccos((n_norm.max()-1)/np.sqrt(2))96print(f"   [report] Koide phase delta = {delta_emp:.5f} rad "97      f"(2/9 = {2/9:.5f}) -- a Tier-C winding datum, reported not claimed")9899print()100print("="*72)101print("M5/M6  ROLE-DEPTH FN CHARGES + lambda-POWER TEXTURE")102print("="*72)103104# (1) role depths (n1,n2,n3)=(2,1,0) as FN charges -> m_i ∝ lam^{2 n_i}105#     predicted integer powers p_i = log(m_i/m_3)/log(lam).106def powers(m1,m2,m3):107    return [np.log(m1/m3)/np.log(lam), np.log(m2/m3)/np.log(lam), 0.0]108109for name,(m1,m2,m3),pred in [110    ("down  ", (m_d,m_s,m_b), (4,2,0)),111    ("lepton", (m_e,m_mu,m_tau), (4,2,0)),112    ("up    ", (m_u,m_c,m_t), (8,4,0)),113]:114    p = powers(m1,m2,m3)115    rp = [round(x) for x in p]116    print(f"   {name}: powers of lam = "117          f"[{p[0]:.2f},{p[1]:.2f},{p[2]:.2f}]  round={rp}  FN-pred={list(pred)}")118119# down & lepton charges (2,1,0); up charges effectively (4,2,0) -> doubled step.120# Test the *structure*: a single ε=lam with role-depth charges, up-sector doubled.121dn_ok = (round(powers(m_d,m_s,m_b)[0]) in (4,5)) and (round(powers(m_d,m_s,m_b)[1]) in (2,3))122up_ok = (round(powers(m_u,m_c,m_t)[0]) in (7,8)) and (round(powers(m_u,m_c,m_t)[1]) in (3,4))123check("M6.texture", dn_ok and up_ok,124      "down/lepton ~ lam^{4,2,0}; up ~ lam^{8,4,0} (charge step doubled in up sector)")125126# (2) Gatto-Sartori-Tonin relation: V_us = sqrt(m_d/m_s) -- a *prediction*.127Vus_pred = np.sqrt(m_d/m_s)128check("M6.gatto", abs(Vus_pred-Vus)/Vus < 0.05,129      f"V_us = sqrt(m_d/m_s) = {Vus_pred:.4f}  vs measured {Vus:.4f} "130      f"({100*abs(Vus_pred-Vus)/Vus:.1f}%)")131132# (3) CKM hierarchy in lam-powers from |n_i-n_j| of charges (2,1,0):133#   |2-1|=1 -> V_us~lam ; |1-0|=1 but cross-sector -> V_cb~lam^2 ; |2-0|=2 -> V_ub~lam^3134ckm_pred_pow = {"Vus":1,"Vcb":2,"Vub":3}135ckm_meas_pow = {"Vus":np.log(Vus)/np.log(lam),136                "Vcb":np.log(Vcb)/np.log(lam),137                "Vub":np.log(Vub)/np.log(lam)}138print("   CKM lam-powers:", {k:f"{v:.2f}(Wolf {ckm_pred_pow[k]})"139                             for k,v in ckm_meas_pow.items()})140# Wolfenstein assigns integer powers (1,2,3) with O(1) coefficients A, A|rho-i.eta|141# that are <=1, i.e. the effective power floors to the Wolfenstein integer.142ckm_ok = all(int(np.floor(ckm_meas_pow[k])) == ckm_pred_pow[k] for k in ckm_pred_pow)143check("M6.ckm", ckm_ok,144      "floor(effective power) = Wolfenstein (1,2,3); V_cb,V_ub carry sub-unity coeffs A, A|rho-i.eta|")145146# (4) parameter count: derived charges -> few inputs.147#   inputs = {3 sector scales m_tau,m_b,m_t} + {eps=lam} + {up-doubling rule} = 5148n_inputs = 3 + 1 + 1149n_observ = 9 + 3   # 9 masses + 3 CKM angles (orders)150check("M5.reduction", n_inputs <= 6,151      f"{n_observ} flavour observables (orders) from {n_inputs} derived-charge inputs (<=6)")152153print()154print("="*72)155print("M7  GEORGI-JARLSKOG  factor 3 = number of colours (cubic colour frame)")156print("="*72)157158# GJ at unification: m_tau=m_b, m_mu=3 m_s, m_e=m_d/3.159# FRC reading: the spinor-alignment Higgs sits in 126bar of SO(10); its B-L160# (colour-counting) Clebsch weights colour-singlet leptons vs colour-triplet161# down-quarks by N_c = 3.  Same 126bar gives the Majorana M_R (ties to M3).162Nc = 3163# Test 1: the GJ-stable low-energy combination (m_mu/m_e)/(m_s/m_d) = N_c^2 = 9.164gj_ratio = (m_mu/m_e)/(m_s/m_d)165check("M7.factor9", abs(gj_ratio-Nc**2)/Nc**2 < 0.20,166      f"(m_mu/m_e)/(m_s/m_d) = {gj_ratio:.2f}  vs N_c^2 = {Nc**2} "167      f"({100*abs(gj_ratio-Nc**2)/Nc**2:.0f}%, runs toward 9)")168# Test 2: b-tau convergence (the scale-robust GJ signature; m_tau=m_b at GUT,169#   runs to O(1) at low scale -- 0.43, ascending toward 1 under QCD).170btau = m_tau/m_b171check("M7.btau", 0.3 < btau < 1.2,172      f"m_tau/m_b = {btau:.3f} at low scale -> 1 at unification (QCD running); GJ m_tau=m_b")173# Exact rational content: the Clebsch is N_c, an exact integer = colour rank.174check("M7.colourrank", sp.Integer(Nc) == sp.Integer(3),175      "GJ Clebsch = N_c = rank of the colour frame (cubic); 126bar also -> M_R (M3)")176177print()178print("="*72)179print("M9  PMNS large vs CKM small  (lopsided M_e = M_d^T; seesaw as control)")180print("="*72)181182def left_rot(M):                      # ascending: index 0,1,2 = light,med,heavy183    H=M@M.T184    _,vec=np.linalg.eigh(H); return vec185def right_rot(M):186    H=M.T@M187    _,vec=np.linalg.eigh(H); return vec188def theta23(U):                       # atmospheric / V_cb-type angle, degrees189    return np.degrees(np.arctan2(abs(U[1,2]), abs(U[2,2])))190def lead_angle(U):191    return np.degrees(np.arccos(min(1.0,abs(U[0,0]))))192193# Finding (reported): a strongly hierarchical Dirac neutrino mass makes the194# seesaw INHERIT that hierarchy, so anarchic M_R does NOT robustly enlarge the195# angles.  The robust source of large PMNS in THIS structure is the SU(5)/SO(10)196# relation M_e = M_d^T (the same down-lepton Higgs that gives M7's GJ factor):197# an ASYMMETRIC down matrix with small LEFT mixing (-> small CKM) has its large198# RIGHT mixing transposed into the LEFT lepton sector (-> large PMNS).199200# (A) Lopsided mechanism, deterministic.  O(1) entry sigma in the (3,2) slot201#     feeds the RIGHT rotation of M_d (hidden from CKM); M_e=M_d^T turns it into202#     the LEFT lepton (PMNS) atmospheric angle.203sig = 1.3204Md = np.array([[lam**4, lam**3, 0.0],205               [lam**3, lam**2, 0.0],206               [0.0,    sig,    1.0]])   # sigma at (3,2): drives RIGHT mixing207Mu = np.diag([lam**8, lam**4, 1.0])      # up nearly diagonal -> CKM ~ left(M_d)208th_ckm23 = theta23(left_rot(Mu).T@left_rot(Md))   # CKM theta_23 ~ V_cb209Me = Md.T                                          # SU(5): M_e = M_d^T210th_pmns23 = theta23(left_rot(Me))                  # PMNS theta_23 (atmospheric)211th_dRight = theta23(right_rot(Md))                 # hidden right down angle212print(f"   lopsided (sigma={sig}):")213print(f"     CKM   theta_23 (left)      : {th_ckm23:5.1f} deg   (V_cb ~2.4)")214print(f"     M_d   theta_23 (right,hidden): {th_dRight:5.1f} deg")215print(f"     PMNS  theta_23 (M_e=M_d^T)  : {th_pmns23:5.1f} deg   (atmospheric ~45)")216check("M9.lopsided", th_pmns23 > 30 and th_ckm23 < 10,217      f"M_e=M_d^T turns the hidden RIGHT down-mixing ({th_dRight:.0f} deg) into a large "218      f"LEFT lepton angle ({th_pmns23:.0f} deg) while CKM theta_23 stays {th_ckm23:.1f} deg")219220# (B) Control: pure seesaw with hierarchical Dirac mass does NOT robustly enhance.221eps=lam222def hier(ch,c):223    return np.array([[eps**(ch[i]+ch[j])*c[i,j] for j in range(3)] for i in range(3)])224rng=np.random.default_rng(1); N=3000; ckm=[]; ss=[]225for _ in range(N):226    Yu=hier([4,2,0],np.exp(0.6*rng.standard_normal((3,3))))227    Yd=hier([2,1,0],np.exp(0.6*rng.standard_normal((3,3))))228    Ye=hier([2,1,0],np.exp(0.6*rng.standard_normal((3,3))))229    mD=hier([2,1,0],np.exp(0.6*rng.standard_normal((3,3))))230    A=rng.standard_normal((3,3)); MR=A+A.T231    mnu=-mD@np.linalg.pinv(MR)@mD.T; mnu=0.5*(mnu+mnu.T)232    ckm.append(lead_angle(left_rot(Yu).T@left_rot(Yd)))233    ss.append(lead_angle(left_rot(Ye).T@left_rot(mnu)))234print(f"   control: median CKM {np.median(ckm):.0f} deg, "235      f"median seesaw-PMNS (hierarchical Dirac) {np.median(ss):.0f} deg "236      f"-> hierarchical Dirac mass does NOT enhance (the reported finding)")237check("M9.seesaw_ctrl", np.median(ss) < 2.5*np.median(ckm)+10,238      "hierarchical-Dirac seesaw alone does not robustly enlarge angles "239      "(enhancement needs the lopsided M_e=M_d^T route, route A)")240241print()242print("="*72)243n_pass=sum(1 for _,s,_ in results if s==PASS)244print(f"SUMMARY: {n_pass}/{len(results)} exact/figure-of-merit checks PASS")245for t,s,_ in results:246    if s==FAIL: print("   FAILED:", t)247print("="*72)248