import itertools def golden(n): out=[[]] for _ in range(n): out=[s+[b] for s in out for b in (0,1) if not (b==1 and s and s[-1]==1)] return out def row(u,K): # C_0 alternating (dark at even t); C_1 = x_-1: even t -> not u_n, odd t -> 1 T=2*len(u) C0=[t%2 for t in range(T+2)] C1=[(1-u[t//2]) if t%2==0 else 1 for t in range(T)] prev,cur=C0[:T],C1; out=[cur[0]] for k in range(1,K): nxt=[cur[t+1]^(cur[t]|prev[t]) for t in range(len(cur)-1)]; prev,cur=cur,nxt; out.append(cur[0]) return out LOOK=3; OUTS=6 for n in range(4,17,2): sigs=set() conts=[c for c in golden(LOOK)] for p in golden(n): sig=[] for c in conts: if p and p[-1]==1 and c[0]==1: sig.append(None); continue u=p+c+[0]*4 r=row(u,2*(n+LOOK)) sig.append(tuple(r[2*n:2*n+OUTS])) sigs.add(tuple(sig)) print(f"prefix length {n:2d}: admissible prefixes {len(golden(n)):5d}, distinguishable futures {len(sigs):5d}")