The file src/32-dark/predictions.py of the validation package of the paper 32-dark, rendered with an anchor per line; the file itself is beside this page.
1#!/usr/bin/env python32# =====================================================================3# predictions.py -- quantify the additional falsifiable predictions of4# the finite-substrate dark sector (beyond the RAR/BTFR/EFE already in5# the paper). Each is DERIVED from the construction, not fitted.6# =====================================================================7import numpy as np8c=2.998e8; G=6.674e-11; Msun=1.989e30; AU=1.496e11; Mpc=3.086e229H0=67.4*1000/Mpc; a0=c*H0/(2*np.pi) # H0 = 67.4 km/s/Mpc, the rate the octant lemma entails (14-entr); a0 = 1.042e-1010nu=lambda y:1.0/(1-np.exp(-np.sqrt(y)))11Ez=lambda z,Om=0.3,OL=0.7:np.sqrt(Om*(1+z)**3+OL)12def hr(t): print("\n"+"="*70+"\n"+t+"\n"+"="*70)13print(f"a0 = c H0/2pi = {a0:.3e} m/s^2")1415# ---------------------------------------------------------------------16# A. Cosmic evolution: a0(z)=cH(z)/2pi => BTFR zero-point and RAR knee17# shift with redshift. At fixed baryonic mass, v_flat ~ a0^{1/4}, so18# v_flat(z)/v_flat(0) = E(z)^{1/4}; the knee sits at cH(z)/2pi.19# ---------------------------------------------------------------------20hr("A. a0(z)=cH(z)/2pi: BTFR zero-point and knee evolution (parameter-free)")21print(f" {'z':>4} {'E(z)':>7} {'a0(z)/a0':>9} {'v_flat(z)/v0 = E^1/4':>22}")22for z in (0.0,0.5,1.0,1.5,2.0):23 print(f" {z:>4.1f} {Ez(z):>7.3f} {Ez(z):>9.3f} {Ez(z)**0.25:>22.3f}")24print(" => at fixed M_bar, high-z disks rotate faster by E(z)^1/4: +7% (z=.5), +15% (z=1), +31% (z=2);")25print(" the RAR transition shifts to a0(z)=cH(z)/2pi. MOND (constant a0) predicts no shift.")2627# ---------------------------------------------------------------------28# B. Two-variable RAR scatter: sigma_log g = (2 tan a /ln10) arctan(sv/v)29# tan a(x) = sqrt(e^{-sqrt x}/(1-e^{-sqrt x})). -> 0 for cold and for x->inf;30# rises as x^{-1/4} deep. A definite surface over (x, sv/v).31# ---------------------------------------------------------------------32hr("B. two-variable RAR scatter sigma(x, sv/v) [dex]")33tana=lambda x:np.sqrt(np.exp(-np.sqrt(x))/(1-np.exp(-np.sqrt(x))))34sig=lambda x,r:(2*tana(x)/np.log(10))*np.arctan(r)35print(f" {'x=g/a0':>8} | sv/v=0.05 0.10 0.20 (dex)")36for x in (100,10,1,0.1,0.01):37 row=" ".join(f"{sig(x,r):6.3f}" for r in (0.05,0.10,0.20))38 print(f" {x:>8.2f} | {row}")39print(" => tightest locus = cold (sv/v->0), high-acceleration (x->inf) disks (sigma->0);")40print(" at sv/v = 0.1 the law reaches ~0.27 dex at x~0.01; SPARC at fixed a0 (rar_scatter.py, T25)")41print(" gives an intrinsic 0.04 dex at the knee and 0.13 dex at x~0.02, bounding d_alpha <~ 3.5 deg:")42print(" the identification d_alpha = arctan(sv/v) is conjecture Y2; the FORM (the rise) is the prediction.")4344# ---------------------------------------------------------------------45# C. Wide binaries in the deep regime, WITH the Galactic external field.46# Solar-neighbourhood g_ext ~ 1.8 a0; the vector total field sets nu.47# ---------------------------------------------------------------------48hr("C. wide binaries: g_obs/g_b with a0=cH0/2pi and the Galactic EFE")49gext=1.8*a0 # Milky-Way field at the Sun, ~1.8 a050print(f" {'s[kAU]':>7} {'g_b/a0':>8} {'nu (isolated)':>14} {'nu (with EFE)':>14}")51for skAU in (3,5,10,20,40):52 s=skAU*1000*AU; gb=G*(1.5*Msun)/s**2 # ~1.5 Msun total53 y_iso=gb/a0; y_efe=(gb+gext)/a054 print(f" {skAU:>7d} {y_iso:>8.3f} {nu(y_iso):>14.3f} {nu(y_efe):>14.3f}")55print(" => isolated binaries would show ~2x enhancement deep; the real Galactic EFE (g_ext~1.8a0)")56print(" suppresses it to ~10-30% at s>~10 kAU -- the FRC-specific Gaia wide-binary prediction,")57print(" exponential knee distinct from Newtonian (1.0) and from rational-MOND.")5859# ---------------------------------------------------------------------60# D. Pressure-supported coherence offset: hot systems (large sv/v) have a61# lower bulk-coherence fraction w = cos^2(arctan(sv/v)) = 1/(1+(sv/v)^2),62# so a reduced amplitude -> they sit at/below the cold-disk RAR.63# ---------------------------------------------------------------------64hr("D. pressure-supported coherence offset: w=1/(1+(sv/v)^2)")65print(f" {'sv/v':>6} {'coherence w':>12} {'amp factor sqrt(w)':>18} {'offset [dex]':>14}")66for r in (0.05,0.1,0.2,0.5,1.0):67 w=1/(1+r**2); print(f" {r:>6.2f} {w:>12.3f} {np.sqrt(w):>18.3f} {np.log10(np.sqrt(w)):>14.3f}")68print(" => cold disks (sv/v~0.1) lose <1%; hot dSph/UDG cores (sv/v~0.5-1) sit 0.05-0.15 dex BELOW")69print(" the cold-disk RAR, correlating with sv/v. MOND predicts the same RAR for all states.")7071hr("SUMMARY: falsifiers")72print(""" A high-z RAR knee != cH(z)/2pi, or BTFR zero-point not ~E(z)^1/4 -> fails73 B RAR scatter not rising as x^-1/4 deep, or not tracking sv/v -> fails74 C wide-binary motion Newtonian (no deep enhancement) or wrong knee -> fails75 D pressure-supported systems on the same RAR as cold disks -> fails""")76