"""Finite algebra/construction checks, not verification of asymptotic query bounds."""
from itertools import product
import json

r=3; n=1<<r; count=0
for multiplicities in product(range(3),repeat=n-1):
    m=sum(multiplicities)
    F=[sum(k*(1-2*((x&a).bit_count()%2)) for a,k in enumerate(multiplicities,1)) for x in range(n)]
    assert sum(y*y for y in F)==n*sum(k*k for k in multiplicities)
    if m:
        low=sum(2*y>m for y in F) # F>m/2 iff weight<m/4
        assert low*m<=4*n*2
    count+=1

# A small member of the construction, below the r>=64 barrier theorem range.
r=4;n=1<<r;M=n//r;d=n*n
cols=[]
for j in range(M):
    cols.extend(a<<(j*r) for a in range(1,n) for _ in range(r))
core_count=len(cols)
cols.extend((1<<(j*r+t))|(1<<(((j+1)%M)*r+t)) for j in range(M) for t in range(r))
assert len(cols)==d and core_count==d-n
rows=[sum(((a>>i)&1)<<j for j,a in enumerate(cols)) for i in range(n)]
assert all(row.bit_count()==r*n//2+2 for row in rows)
assert all(1<<i in cols for i in range(n)) # full row rank
adj=[set() for _ in range(n)]
for a in cols:
    support=[i for i in range(n) if a>>i&1]
    for i in support:adj[i].update(support)
seen={0}; todo=[0]
while todo:
    for i in adj[todo.pop()]-seen:seen.add(i);todo.append(i)
assert len(seen)==n
mask=(1<<core_count)-1
encoded=[0]*(1<<n)
max_ratio_num=0
for x in range(1,1<<n):
    low=x&-x; i=low.bit_length()-1
    encoded[x]=encoded[x^low]^rows[i]
    active=sum(bool((x>>(j*r))&(n-1)) for j in range(M))
    assert (encoded[x]&mask).bit_count()==active*r*n//2
    assert x.bit_count()*(r*n//2+2)<=2*r*encoded[x].bit_count()
print(json.dumps({'scope':'Parseval and low-weight count for all 2187 multiplicity patterns with r=3 and multiplicities 0..2; construction checks for n=16,r=4 including all 65536 messages. Small construction is below r>=64 theorem range; no adaptive-query, general repair or asymptotic verification.', 'parseval_patterns':count,'construction':{'n':n,'r':r,'columns':len(cols),'core_columns':core_count,'bridge_columns':n,'full_row_rank':True,'connected':True,'generator_weight':r*n//2+2,'messages_checked':len(encoded),'deterministic_certificate_K_bound':2*r}},indent=2))
