import numpy as np from collections import defaultdict, Counter from pin import fiber cp=(0,1,1,1,1,1); p=len(cp) rng=np.random.default_rng(109) for Zc in (7,14,21): seen=defaultdict(set); cnt=defaultdict(int) for _ in range(6000): c=fiber(cp,70,Zc+4) a=lambda kk,tt: c[kk][tt] for t in range(6,62): D=tuple(a(k,t)^a(k,t+p) for k in range(1,Zc+2)) key=(t%p,D[:Zc]); seen[key].add(D[Zc]); cnt[key]+=1 keys=[k for k in seen if cnt[k]>=10] free_phase=Counter(k[0] for k in keys if len(seen[k])>1) all_phase=Counter(k[0] for k in keys) det=sum(1 for k in keys if len(seen[k])==1) print(f"zone 1-{Zc:2d}: {len(keys):4d} states, input forced in {det} ({100*det/len(keys):.0f}%); free states by phase: {dict(sorted(free_phase.items()))} (all states by phase: {dict(sorted(all_phase.items()))})")