"""Independent rational-arithmetic audit of finite-grid Wald coverage.
No external data, random sampling, or third-party packages.
"""
import json
from math import comb
from pathlib import Path
from decimal import Decimal, localcontext

GRID=1000
# Treat the original paper's printed decimal z as an exact rational parameter.
A=1959963984540054
B=10**15

def accepted(n,i,k):
    # (i/GRID-k/n)^2 <= (A/B)^2*k*(n-k)/n^3
    return (i*n-k*GRID)**2*n*B**2 <= A**2*k*(n-k)*GRID**2

def main():
    below93=below95=0
    rows=[]
    for n in range(5,101):
        den=GRID**n
        choose=[comb(n,k) for k in range(n+1)]
        c93=c95=0
        for i in range(1,GRID):
            # Independent binomial expansion, not the original floating recurrence.
            terms=[choose[k]*i**k*(GRID-i)**(n-k) for k in range(n+1)]
            assert sum(terms)==den
            num=sum(t for k,t in enumerate(terms) if accepted(n,i,k))
            c93+=100*num<93*den
            c95+=100*num<95*den
            # A separate symmetry invariant checks interval membership.
            assert all(accepted(n,i,k)==accepted(n,GRID-i,n-k) for k in range(n+1))
        below93+=c93;below95+=c95
        rows.append({'n':n,'below_93':c93,'below_95':c95})
    pairs=96*999
    with localcontext() as ctx:
        ctx.prec=40
        result={'pairs':pairs,'below_93':below93,'below_95':below95,
                'share_below_93':float(Decimal(below93)/pairs),
                'share_below_95':float(Decimal(below95)/pairs),
                'rounded_share_below_93':float((Decimal(below93)/pairs).quantize(Decimal('0.000001'))),
                'rounded_share_below_95':float((Decimal(below95)/pairs).quantize(Decimal('0.000001'))),
                'probability_normalization_checks':pairs,
                'membership_symmetry_checks':sum(999*(n+1) for n in range(5,101))}
    out=Path('results');out.mkdir(exist_ok=True)
    (out/'R1.json').write_text(json.dumps(result,indent=2)+'\n')
    (out/'by_n.json').write_text(json.dumps(rows,indent=2)+'\n')
    print(json.dumps(result))

if __name__=='__main__':main()
