from pathlib import Path
import re, math, cmath

HERE=Path(__file__).resolve().parent
PAPER=HERE/"CSM_RH_Paper_79_Factor_Scale_Resonance_Flatness_and_Distributed_Vaughan_Parity_Wall_v0.1_2026-09-09.md"

def psi(u):
    if not (1<u<2):
        return 0.0
    t=(u-1)*(2-u)
    return t**4

def psihat(w,M=20000):
    s=0j
    for j in range(M):
        u=1+(j+0.5)/M
        s += psi(u)*(u**(w-1))/M
    return s

def block_synthetic(E,rho,M=200000):
    # Synthetic prime-error mode: Lambda-1 -> -x^(rho-1).
    # At s=rho, weighted block should be -int psi(u)/u du, independent of E.
    a=int(E)
    b=int(2*E)
    total=0j
    for n in range(a+1,b):
        total += -(n**(rho-1))*psi(n/E)*(n**(-rho))
    return total

def check_scale_invariance():
    rho=0.72+3.4j
    target=-psihat(0,50000)
    vals=[]
    for E in [500,1000,2000,4000]:
        val=block_synthetic(E,rho)
        vals.append((E,complex(val),abs(val-target)))
    assert vals[-1][2]<2e-4
    assert abs(vals[-1][1]-vals[-2][1])<3e-4
    return vals

def check_self_phase():
    rho=0.72+3.4j
    # E^(rho-rho)=1 exactly.
    for E in [3,10,1000,1e8]:
        assert abs(E**(rho-rho)-1)<1e-14
    return True

def check_factor_scale_orthogonality():
    gammas=[1.1,4.3,8.8]
    coeffs=[1+0.2j,0.4-0.1j,0.8+0.3j]
    diag=sum(abs(c)**2 for c in coeffs)
    T=20000.0
    M=200000
    acc=0.0
    for j in range(M):
        t=(j+0.5)*T/M
        z=sum(c*cmath.exp(1j*g*t) for c,g in zip(coeffs,gammas))
        acc+=abs(z)**2
    mean=acc/M
    assert abs(mean-diag)/diag<3e-3,(mean,diag)
    return mean,diag

def check_level_scope():
    for tau in [0.05,0.2,0.4]:
        sigma=1-tau-0.01
        assert sigma<1-tau
        ratio_exp=sigma-(1-tau)
        assert ratio_exp<0
        # complete complementary factor mass is 1, outside sigma<1.
        assert 1>sigma
    return True

def check_log_length():
    for u,v in [(0.1,0.1),(0.2,0.3),(0.05,0.7)]:
        if u+v<1:
            assert 1-u-v>0
    return True

def check_source():
    s=PAPER.read_text(encoding="utf-8")
    for pat in [r"(?<!\\)\\\(",r"(?<!\\)\\\)",r"(?<!\\)\\\[",r"(?<!\\)\\\]"]:
        assert re.search(pat,s) is None
    assert s.count("$$")%2==0
    tmp=re.sub(r"\$\$.*?\$\$","",s,flags=re.S)
    assert len(re.findall(r"(?<!\\)\$",tmp))%2==0
    return True

if __name__=="__main__":
    print("scale_invariance",check_scale_invariance())
    print("self_phase",check_self_phase())
    print("factor_scale_orthogonality",check_factor_scale_orthogonality())
    print("level_scope",check_level_scope())
    print("log_length",check_log_length())
    print("source_delimiters",check_source())
    print("PASS")
