The script src/21-gravity/validate_radiative.py of the validation package of the paper 21-grav, rendered with an anchor per line. ▶ run the predicates on Google Colab.
1"""The radiative tensor sector (ledger D5): float-free where it counts.23The static Newtonian field is a gradient flow u_dot = kappa Lap(u), dissipative. The substrate4drive is a permutation of the phase cycle -- reversible, hence symplectic -- so the physical5dynamics is NOT dissipative: it carries a conjugate momentum pi (the winding-rate fluctuation,6the quarter-turn dual of u). With78 H = sum pi^2/(2 chi) + (kappa/2) sum_<xy> (u_x - u_y)^2 ,910Hamilton's equations give chi u_ddot = kappa Lap(u): the WAVE equation. The static slice11(u_ddot = 0) is the Poisson/Newtonian field; the propagating modes are gravitational waves.12By channel unity (the kinetic chi and the stiffness kappa are one capacity read two ways)13kappa/chi = c^2, so the waves travel at the speed of light. Repeating on the Fierz-Pauli14field h_mu_nu gives the hyperbolic spin-2 theory with two transverse-traceless polarizations,15helicity +-2. The TT rank, the helicity, and the no-doubling are exact; the long-wave16limits are tagged [approx].17"""18import numpy as np, math19ok = True2021# ---- 1. discrete wave dispersion: propagation, and the static (Poisson) limit ----22def lam(k): return sum(4*math.sin(km/2)**2 for km in k) # cubic-lattice Laplacian eigenvalue23print("[1] wave dispersion omega^2 = (kappa/chi) lam(k), kappa=chi=1; long-wave speed -> 1 [approx]")24for kmag in (0.02,0.1,0.5):25 w=math.sqrt(lam((kmag,0,0))); h=1e-6; vg=(math.sqrt(lam((kmag+h,0,0)))-w)/h26 print(f" |k|={kmag:4.2f}: omega/|k|={w/kmag:.5f} v_group={vg:.5f}")27 if kmag<=0.1 and abs(vg-1)>1e-2: ok=False28print(" static slice u_ddot=0 -> kappa Lap u = -source (the Newtonian Green's function).")2930# ---- 2. two transverse-traceless polarizations, every direction (EXACT rank) ----31def TT(khat):32 khat=np.array(khat,float); khat/=np.linalg.norm(khat)33 P=np.eye(3)-np.outer(khat,khat); idx=[(0,0),(1,1),(2,2),(0,1),(0,2),(1,2)]34 w=lambda a,b:1.0 if a==b else math.sqrt(0.5); L=np.zeros((6,6))35 for A,(i,j) in enumerate(idx):36 for B,(k,l) in enumerate(idx):37 L[A,B]=(0.5*(P[i,k]*P[j,l]+P[i,l]*P[j,k])-0.5*P[i,j]*P[k,l])*w(i,j)*w(k,l)38 return L39print("\n[2] TT projector rank (number of GW polarizations):")40for kh in [(0,0,1),(1,1,1),(2,1,3),(5,-2,1)]:41 r=np.linalg.matrix_rank(TT(kh),tol=1e-9); print(f" k_hat={str(kh):10s} rank={r}")42 if r!=2: ok=False43print(" rank = 2 for all directions: two propagating modes. (3+1 count: 10 - 4 gauge - 4 constraint = 2.)")4445# ---- 3. helicity +-2: rotation about k by psi acts as rotation by 2 psi ----46def rot_on_TT(psi):47 c,s=math.cos(psi),math.sin(psi); R=np.array([[c,-s,0],[s,c,0],[0,0,1]])48 hp=np.array([[1,0,0],[0,-1,0],[0,0,0]])/math.sqrt(2); hx=np.array([[0,1,0],[1,0,0],[0,0,0]])/math.sqrt(2)49 aR=lambda M:R@M@R.T50 return np.array([[np.tensordot(hp,aR(hp)),np.tensordot(hp,aR(hx))],51 [np.tensordot(hx,aR(hp)),np.tensordot(hx,aR(hx))]])52print("\n[3] helicity (spin):")53for deg in (15,30,45):54 M=rot_on_TT(math.radians(deg)); ang=math.degrees(math.atan2(M[1,0],M[0,0]))55 print(f" rotate field {deg:2d} deg -> (h+,hx) rotate {ang:5.1f} deg = 2*psi (spin-2)")56 if abs(ang-2*deg)>1e-6: ok=False5758# ---- 4. Nyquist / no doubling ----59print("\n[4] no fermion-doubling in the propagating sector:")60print(f" Laplacian symbol 4 sin^2(k/2) vanishes only at k=0; zone edge k=pi: omega^2={lam((math.pi,0,0)):.3f} (finite).")61print(" central-difference gauge symbol sin(k) zone-edge zeros are pure gauge (killed by the TT projector).")6263# ---- 5. speed = c, and the quadrupole ----64print("\n[5] c_g^2 = kappa/chi = c^2 by channel unity => GW speed = c (GW170817).")65print(" Linearised wave eqn + source conservation (dT=0) => leading mass-quadrupole radiation,")66print(" recovering the binary-pulsar damping; the static, shadow, and floor results are unchanged.")6768print("\nPASS" if ok else "\nFAIL", "- radiative tensor sector (D5)")697071# ---- symbol check (round-01, W-K): no O(k)*n cross term in the dispersion ----72# The propagating symbol 4 sin^2(k/2) is even in k exactly: its odd Taylor73# coefficients vanish, so no boost-non-invariant O(k) drive cross term exists;74# with the exact boost transport above, alpha_1, alpha_2 = O(1/sqrt(Omega)).75try:76 import sympy as _sp77 _k = _sp.symbols('k')78 _sym = 4 * _sp.sin(_k / 2) ** 279 _odd = [_sp.series(_sym, _k, 0, 8).removeO().coeff(_k, j) for j in (1, 3, 5, 7)]80 assert all(c == 0 for c in _odd), _odd81 print("PASS symbol check: dispersion even in k (odd coefficients 0,0,0,0) -- no O(k).n cross term")82except ImportError:83 # fallback: exact evenness on the finite cycle C_13 via residue arithmetic84 pp = 1385 z = 2 # order-12 element base86 even = all((pow(z, k, pp) - 2 + pow(z, -k, pp)) % pp == (pow(z, -k, pp) - 2 + pow(z, k, pp)) % pp for k in range(1, pp - 1))87 assert even88 print("PASS symbol check (finite form): symbol invariant under k -> -k on C_13")89