import numpy as np rng=np.random.default_rng(113) cp=(0,1,1,1,1,1); p=6 def build(u,K): T=len(u)*p d=[cp[t%p] for t in range(T+K+2)] e=[] for t in range(T): ph=t%p; e.append(u[t//p] if ph==0 else (1 if ph==5 else 0)) cols={0:d,1:e} for k in range(1,K): x,y=cols[k],cols[k-1]; cols[k+1]=[x[t+1]^(x[t]|y[t]) for t in range(len(x)-1)] return cols K=60; N=40 reach={} for trial in range(60): u=list(rng.integers(0,2,size=N)); base=build(u,K) for j in range(N): v=u.copy(); v[j]^=1; alt=build(v,K) for k in range(1,K+1): if any(base[k][t]!=alt[k][t] for t in range(0,p)): # does flipping u_j change V_k(0)? reach[k]=max(reach.get(k,-1),j) print("depth k : furthest free bit u_j that can change V_k(0)") print(" "+" ".join(f"{k}:{reach.get(k,'-')}" for k in range(1,K+1,4)))