const PRIME_LIMIT=1_000_000; var [const] BI=Import("zklBigNum"); // libGMP var [const] primeBitMap=Data(PRIME_LIMIT).fill(0x30); // one big string p:= BI(1); while(p.nextPrime()<=PRIME_LIMIT){ primeBitMap[p]="1" } // bitmap of primes fcn primeWindows(m,deltas){ // eg (6,4,2) n,r := 0,List(); ds:=deltas.len().pump(List,'wrap(n){ deltas[0,n+1].sum(0) }); // (6,10,12) sp:=Data(Void,"1" + "0"*deltas.sum(0)); foreach n in (ds){ sp[n]="1" } // "1000001000101" while(n=primeBitMap.find(sp,n+1)){ r.append(n) } // (31, 61, 271,...) r.apply('wrap(n){ T(n).extend(ds.apply('+(n))) }) //( (31,37,41,43), (61,67,71,73), (271,277,281,283) ...) }