from pathlib import Path
import re, math

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

def omega(H,r):
    return max(1-abs(r)/H,0.0)

def primes_upto(n):
    sieve=[True]*(n+1)
    sieve[0]=sieve[1]=False
    for p in range(2,int(n**0.5)+1):
        if sieve[p]:
            for k in range(p*p,n+1,p):
                sieve[k]=False
    return [i for i,v in enumerate(sieve) if v]

def Lambda_array(n):
    A=[0.0]*(n+1)
    for p in primes_upto(n):
        x=p
        while x<=n:
            A[x]=math.log(p)
            x*=p
    return A

def W(x):
    if x<=1 or x>=2:return 0.0
    t=(x-1)*(2-x)
    return t*t

def build(N,H):
    La=Lambda_array(2*N+H+5)
    f=[0.0]*(2*N+1)
    a=[0.0]*(2*N+1)
    for n in range(N+1,2*N):
        q=0.0
        s=0.0
        for r in range(-H+1,H):
            wt=omega(H,r)
            q+=wt*(La[n+r]-1)
            s+=wt*La[n+r]
        f[n]=W(n/N)*q
        a[n]=W(n/N)*s
    return La,f,a

def check_root_identity():
    N,H=800,31
    La,f,a=build(N,H)
    F=sum(f)
    R=sum((La[n]-1)*f[n] for n in range(len(f)))
    rhs=sum(La[n]*f[n] for n in range(len(f)))-F
    assert abs(R-rhs)<1e-9
    return R,rhs

def check_nonnegative_correction():
    N,H=800,31
    La,f,a=build(N,H)
    P=sum(La[n]*a[n] for n in range(len(a)))
    A=sum(a)
    L=sum(W(n/N)*La[n] for n in range(N+1,2*N))
    M=sum(W(n/N) for n in range(N+1,2*N))
    R=sum((La[n]-1)*f[n] for n in range(len(f)))
    rhs=H*(L-M)+R
    assert abs((P-A)-rhs)<1e-8
    return P-A,rhs

def check_signed_divisor():
    N,H=800,31
    La,f,a=build(N,H)
    F=sum(f)
    vals=[]
    for d in [1,2,3,5,7,11,17,31,61]:
        Fd=sum(f[n] for n in range(len(f)) if n%d==0)
        err=abs(Fd-F/d)
        vals.append((d,err,err/N))
        assert err<5*N
    return vals

def check_exponent_logic():
    for k in [0.1,0.3,0.7]:
        d=k/2
        assert d<k
        for eta in [0.01,0.05]:
            assert k+eta>d
    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("root_identity",check_root_identity())
    print("nonnegative_correction",check_nonnegative_correction())
    print("signed_divisor",check_signed_divisor())
    print("exponent_logic",check_exponent_logic())
    print("source_delimiters",check_source())
    print("PASS")
