Research source · python
verify_compact_affine.py
site/public/research-artifacts/foundations/verify_compact_affine.py
84 lines. Source is displayed for inspection; it is not executed by this page.
File fingerprint
SHA-256: 5bf17c339786e4b8917e6f20296c89189183df210ba304b76c641a5963f1cf6f
"""Finite corroboration only; unrestricted proofs are in the companion note."""
import itertools, json
from pathlib import Path
def parity(x): return x.bit_count() & 1
def rank(rows):
basis = {}
for x in rows:
while x:
k=x.bit_length()-1
if k in basis: x ^= basis[k]
else: basis[k]=x; break
return len(basis)
def qmask(u,v,n):
return sum(((u>>i&1)*(v>>j&1)) << (i*n+j) for i in range(n) for j in range(n))
def build(n, data, right=False):
clauses=[]; count=2*n
def fresh():
nonlocal count
count+=1; return count
def pin(a,b): clauses.append((a if b else -a,))
def AND(a,b,t): clauses.extend([(-t,a),(-t,b),(t,-a,-b)])
def XOR(a,b,t): clauses.extend([(a,b,-t),(-a,-b,-t),(a,-b,t),(-a,b,t)])
def chain(xs,target=None):
z=xs[0]
for i,a in enumerate(xs[1:],1):
t=target if i==len(xs)-1 and target else fresh()
XOR(z,a,t); z=t
return z
if right:
u,v=data
for j in range(n): pin(j+1,v>>j&1)
terms=[]
for i in range(n):
c=fresh(); pin(c,u>>i&1); z=fresh(); AND(c,n+i+1,z); terms.append(z)
pin(chain(terms),1)
else:
for i in range(n):
terms=[]
for j in range(n):
c=fresh(); pin(c,data>>(i*n+j)&1); z=fresh(); AND(c,j+1,z); terms.append(z)
chain(terms,n+i+1)
return count,clauses
def projection(n, pair):
count,clauses=pair; good=set()
for bits in range(1<<count):
if all(any(bool(bits>>(abs(l)-1)&1)==(l>0) for l in c) for c in clauses):
good.add(bits&((1<<(2*n))-1))
return good
n=2
left={a:projection(n,build(n,a)) for a in range(16)}
right={(u,v):projection(n,build(n,(u,v),True)) for u in range(4) for v in range(4)}
for a in range(16):
expected={x | sum(parity((a>>(i*n)&3)&x) << (n+i) for i in range(n)) for x in range(4)}
assert left[a]==expected
for u,v in right:
assert bool(left[a]&right[u,v])==bool(parity(a&qmask(u,v,n)))
for u,v in right:
assert right[u,v]=={v|(y<<n) for y in range(4) if parity(u&y)}
# Remove only final parity-output pin: every matrix has an extension.
count,cs=build(n,(u,v),True)
unpinned=projection(n,(count,cs[:-1]))
assert all(left[a]&unpinned for a in left)
counts=[]
for n in range(2,9):
vf,cf=build(n,0); vg,cg=build(n,(0,0),True)
assert (vf,len(cf),sum(map(len,cf)))==(3*n*n,8*n*n-4*n,20*n*n-12*n)
assert (vg,len(cg),sum(map(len,cg)))==(5*n-1,9*n-3,21*n-11)
counts.append({'n':n,'left_variables':vf,'left_clauses':len(cf),'right_variables':vg,'right_clauses':len(cg)})
qs=[qmask(u,v,2) for u in range(4) for v in range(4)]
checked=0; min_worst=4
for rows in itertools.product(range(16),repeat=4):
if rank(rows)!=4: continue
weights=[sum(parity(row&q) for row in rows) for q in qs]
assert sum(weights)>=16
for row in rows:
r=rank([row&3,row>>2])
assert sum(parity(row&q) for q in qs)==8-(8>>r)
min_worst=min(min_worst,max(weights)); checked+=1
result={'status':'passed','scope':'Finite exhaustive checks, not formal or unrestricted proof','dimension_2':{'matrix_query_pairs':256,'invertible_coefficient_maps':checked,'minimum_worst_support':min_worst,'cnf_projection':'all boundary and private assignments','negative_control':'removing output pin makes every join satisfiable'},'formula_counts':counts,'randomness':'none'}
Path(__file__).with_name('compact-affine-output.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps(result))