python3 - <<'EOF' import itertools def det(A): n=len(A) A=[list(r) for r in A] for c in range(n): p=next((r for r in range(c,n) if A[r][c]),None) if p is None:return 0 A[c],A[p]=A[p],A[c] for r in range(c+1,n): if A[r][c]:A[r]=[x^y for x,y in zip(A[r],A[c])] return 1 def direct(n): pairs=[(i,j) for i in range(n) for j in range(i+1,n)] cnt=0 for bits in itertools.product([0,1],repeat=len(pairs)): C=[[0]*n for _ in range(n)] C[0][0]=C[1][1]=1 for (i,j),b in zip(pairs,bits):C[i][j]=C[j][i]=b if not det(C):continue ok=True for i in range(n): rows=C[:i]+C[i+1:] sub=[row[:i]+row[i+1:] for row in rows] if not det(sub): ok=False break if not ok:continue D=[[C[i][j]^(i==j) for j in range(n)] for i in range(n)] if det(D):cnt+=1 return cnt print('direct4',direct(4)) print('direct6',direct(6)) EOF