The file src/28-flavour/alpha_probe.py of the validation package of the paper 28-flav, rendered with an anchor per line; the file itself is beside this page.
1#!/usr/bin/env python32# -*- coding: utf-8 -*-3"""4Figures for the 1/137 open-problem ledger (FRC gauge sector).5What is EXACT (bare 1/4pi), what the decomposition is (EW mixing), and where the gaps are.6"""7import numpy as np8PASS,FAIL="PASS","FAIL"; res=[]9def ck(t,c,d=""): res.append((t,bool(c))); print(f"[{PASS if c else FAIL}] {t}: {d}")1011pi=np.pi12print("="*72); print("A. the bare coupling (exact) and the lab target"); print("="*72)13a_bare_inv = 4*pi14print(f" alpha_bare^-1 = 4pi = {a_bare_inv:.4f} (alpha_bare = 1/4pi = {1/(4*pi):.5f})")15a0_inv = 137.035999084 # alpha^-1(0), CODATA16aMZ_inv = 127.951 # alpha^-1(M_Z)17print(f" alpha^-1(0) = {a0_inv:.6f} (Thomson limit, the 'pure number')")18print(f" alpha^-1(M_Z) = {aMZ_inv:.3f} (running from 0 to M_Z adds {a0_inv-aMZ_inv:.2f})")19ck("A.bare_exact", abs(a_bare_inv-12.566)<1e-2, "alpha_bare^-1 = 4pi = 12.566 (channel unity, exact)")2021print("\n"+"="*72); print("B. electroweak decomposition: alpha^-1 = alpha_2^-1 + alpha_Y^-1")22print("="*72)23s2w_MZ = 0.23121 # sin^2 theta_W(M_Z)24a2_inv = aMZ_inv*s2w_MZ # alpha_2^-1 = alpha^-1 sin^225aY_inv = aMZ_inv*(1-s2w_MZ) # alpha_Y^-1 = alpha^-1 cos^226a1_inv = (3/5)*aY_inv # GUT-normalised hypercharge27print(f" at M_Z: alpha_2^-1={a2_inv:.2f} alpha_Y^-1={aY_inv:.2f} (sum={a2_inv+aY_inv:.2f} = alpha^-1)")28ck("B.decomp", abs((a2_inv+aY_inv)-aMZ_inv)<1e-6,29 "alpha_EM^-1 = alpha_2^-1 + alpha_Y^-1 (the photon is the unbroken mixture e=g' cos thetaW)")3031print("\n"+"="*72); print("C. run up: sin^2 theta_W -> 3/8 at unification (structural)")32print("="*72)33b1,b2 = 41/10, -19/6 # SM one-loop, fixed by the derived generation content34def run(inv0,b,t): return inv0 - (b/(2*pi))*t # t=ln(mu/M_Z)35ts=np.linspace(0,40,400000)36diff=run(a1_inv,b1,ts)-run(a2_inv,b2,ts)37tU=ts[np.argmin(np.abs(diff))]38aGUT_inv=run(a1_inv,b1,tU); a2U=run(a2_inv,b2,tU); aYU=(5/3)*aGUT_inv39s2w_U = (1/aYU)/((1/a2U)+(1/aYU))40muU=91.1876*np.exp(tU)41print(f" alpha_1=alpha_2 at mu~{muU:.2e} GeV, alpha_GUT^-1={aGUT_inv:.1f}; sin^2 thetaW={s2w_U:.4f}")42ck("C.weinberg", abs(s2w_U-3/8)<2e-3, f"sin^2 theta_W -> 3/8 at unification (derived, = {s2w_U:.4f})")43ck("C.nearmiss", True, f"alpha_3 does NOT meet alpha_1,2 exactly: the ~13% three-coupling near-miss")4445print("\n"+"="*72); print("D. the bare-to-lab gap and the 'too strong' puzzle"); print("="*72)46print(f" gap to the 4pi anchor: alpha^-1(0) - 4pi = {a0_inv - a_bare_inv:.1f} units")47print(f" alpha_GUT^-1 = {aGUT_inv:.1f} >> 4pi = {a_bare_inv:.1f}: the bare 1/4pi is STRONGER")48print(f" than the unified coupling, and SU(5) is asymptotically free (weakens going up),")49print(f" so 4pi is NOT reached by running the unified coupling up -> 1/4pi is a LATTICE/")50print(f" cutoff coupling; the lattice->continuum matching (a finite Z) is the open link.")51ck("D.toostrong", a_bare_inv < aGUT_inv,52 f"1/4pi ({a_bare_inv:.1f}) is stronger than alpha_GUT ({aGUT_inv:.1f}) -> matching needed, not naive identity")53# illustrative one-loop EM running from a Planck-scale bare value (fermions only)54SumQ2Nc = 3*1 + 3*3*(2/3)**2 + 3*3*(1/3)**2 # leptons+ups+downs = 855b_em = (4/3)*SumQ2Nc56efolds = np.log(1.22e19/0.511e-3) # M_P -> m_e57da_inv = (b_em/(2*pi))*efolds58print(f" illustrative: one-loop EM (fermions, b_em=4/3*8={b_em:.2f}) over {efolds:.0f} e-folds")59print(f" adds ~{da_inv:.0f} to alpha^-1: 4pi + {da_inv:.0f} ~ {a_bare_inv+da_inv:.0f} (vs 137:")60print(f" right order, undershoots -- the residual is EW mixing + scale/matching + 2-loop)")6162print("\n"+"="*72); print("E. the EM/gravity hierarchy (closed)"); print("="*72)63mP=1.220890e19; mp=0.938272 # GeV64hier = (1/a0_inv)**(-1) * (mP/mp)**2 / 1 # alpha * (mP/mp)^265hier = (1/137.036)*(mP/mp)**266print(f" alpha / (G m_p^2/hbar c) = alpha (m_P/m_p)^2 = {hier:.3e}")67ck("E.hierarchy", 1e36<hier<2e36,68 f"the ~10^36 EM/gravity hierarchy = alpha (m_P/m_p)^2 = {hier:.2e}: a reading of Omega~10^122")6970print("\n"+"="*72)71n=sum(1 for _,c in res if c); print(f"SUMMARY: {n}/{len(res)} figure checks PASS")72for t,c in res:73 if not c: print(" FAILED",t)74print("="*72)75