from pathlib import Path
import re, math

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

def local_mu_factor(ell,n):
    if n % ell != 0:
        return 1
    if n % (ell*ell) == 0:
        return 0
    return -1

def kappa_formula(ell,h):
    if h % ell == 0:
        return 1.0
    return (ell*ell-3*ell+1)/(ell*(ell-1))

def check_one_prime():
    for ell in [2,3,5,7,11]:
        q=ell*ell
        residues=[a for a in range(q) if math.gcd(a,q)==1]
        for h in range(0,2*ell+1):
            avg=sum(local_mu_factor(ell,a+h) for a in residues)/len(residues)
            assert abs(avg-kappa_formula(ell,h))<1e-14
    return True

def check_finite_CRT():
    primes=[2,3,5]
    Q=1
    for p in primes:
        Q*=p*p
    residues=[a for a in range(Q) if math.gcd(a,Q)==1]
    for h in [1,2,3,5,6,7,10,15]:
        lhs=0.0
        for a in residues:
            prod=1
            for p in primes:
                prod*=local_mu_factor(p,a+h)
            lhs+=prod
        lhs/=len(residues)
        rhs=math.prod(kappa_formula(p,h) for p in primes)
        assert abs(lhs-rhs)<1e-13
    return True

def check_shift_average():
    for ell in [2,3,5,7,11,13]:
        avg=sum(kappa_formula(ell,h) for h in range(ell))/ell
        target=(1-1/ell)**2
        assert abs(avg-target)<1e-14
    return True

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 check_ratio_and_dimension():
    for ell in [101,503,2003,10007]:
        f=(ell*ell-3*ell+1)/(ell*(ell-1))
        base=(1-1/ell)**2
        r=f/base
        assert abs((r-1)*ell*ell + 2) < 0.08
    ps=primes_upto(30000)
    P=1.0
    samples=[]
    checkpoints={1009,5003,10007,20011}
    for p in ps:
        P*=((p*p-3*p+1)/(p*(p-1)))
        if p in checkpoints:
            samples.append((p,P*(math.log(p)**2)))
    mags=[abs(v) for _,v in samples]
    assert len(mags)>=3
    assert max(mags)/min(mags)<1.25
    return samples

def check_signed_gain():
    for d in [0.05,0.2,0.45]:
        for tau in [d/4,d/2,0.9*d]:
            assert d-tau>0
    return True

def check_diagonal_asymptotic():
    # diagonal/target ~ log X * X^(2 eta - 1), tending to 0 for eta<1/2
    for eta in [0.05,0.2,0.45]:
        exponent=2*eta-1
        assert exponent<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("one_prime",check_one_prime())
    print("finite_CRT",check_finite_CRT())
    print("shift_average",check_shift_average())
    print("ratio_dimension",check_ratio_and_dimension())
    print("signed_gain",check_signed_gain())
    print("diagonal_asymptotic",check_diagonal_asymptotic())
    print("source_delimiters",check_source())
    print("PASS")
