from pathlib import Path
import re, math, cmath, random

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

def D(H,a):
    return sum(cmath.exp(2j*math.pi*h*a) for h in range(1,H+1))

def check_fejer():
    random.seed(72)
    for H in [10,100,1000]:
        for _ in range(1000):
            a=random.random()
            dist=min(a,1-a)
            lhs=abs(D(H,a))
            rhs=min(H,1/(2*dist)) if dist>0 else H
            assert lhs<=rhs+1e-9
    return True

def check_q_major_weight():
    N=10**12
    H=int(N**0.8)
    for q in [2,3,5,11,101]:
        for a in range(1,q):
            if math.gcd(a,q)!=1: continue
            beta=math.log(N)**5/N
            x=a/q+beta
            dist=abs(x-round(x))
            assert dist>=1/(3*q)
            # abstract Dirichlet-kernel inequality implies O(q)
            assert min(H,1/(2*dist)) <= 2*q
    return True

def check_central_scaling():
    for k in [0.1,0.3,0.7,0.95]:
        d=k/2
        # width N^-1 * amplitude^2 N^(2-2d) * H^2
        # relative to N H^2 is N^-2d=N^-k
        assert abs(2*d-k)<1e-14
    return True

def check_far_frequency():
    random.seed(720)
    for _ in range(10000):
        k=random.uniform(0.02,0.95)
        d=k/2
        tau=random.uniform(0.001,1-k-0.001)
        upper=1-tau-d
        if upper<=0: continue
        v=random.uniform(0.0001,upper*0.999)
        s=2*(1-tau-v)
        assert s>k
    return True

def check_strip_selberg():
    for k in [0.1,0.4,0.9]:
        for tau in [0.01,0.1,0.5]:
            s=k*(1-tau)
            assert s<k
    return True

def boundary_integral(d,gamma,y):
    # integral_1^2 u^{-d+i gamma} e(yu) du by midpoint
    M=5000
    z=0j
    for j in range(M):
        u=1+(j+0.5)/M
        z += (u**(-d+1j*gamma))*cmath.exp(2j*math.pi*y*u)/M
    return z

def check_boundary_nonzero_near_zero():
    d=0.2; gamma=3.0
    vals=[abs(boundary_integral(d,gamma,y)) for y in [0,0.002,0.005,0.01]]
    assert min(vals)>0.05
    return vals

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("fejer",check_fejer())
    print("q_major_weight",check_q_major_weight())
    print("central_scaling",check_central_scaling())
    print("far_frequency",check_far_frequency())
    print("strip_selberg",check_strip_selberg())
    print("boundary_nonzero",check_boundary_nonzero_near_zero())
    print("source_delimiters",check_source())
    print("PASS")
