python3 - <<'EOF' C=[[1,1,0,1],[1,1,1,0],[0,1,0,1],[1,0,1,0]] import itertools allm=list(itertools.product([0,1],repeat=4)) def det(A): A=[list(r) for r in A] for c in range(4): p=next((r for r in range(c,4) 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,4): if A[r][c]:A[r]=[x^y for x,y in zip(A[r],A[c])] return 1 def inv(A): n=4 M=[list(row)+[1 if i==j else 0 for j in range(n)] for i,row in enumerate(A)] for c in range(n): p=next((r for r in range(c,n) if M[r][c]),None) if p is None:return None M[c],M[p]=M[p],M[c] for r in range(n): if r!=c and M[r][c]:M[r]=[x^y for x,y in zip(M[r],M[c])] return [row[n:] for row in M] for Q in itertools.product(allm,repeat=4): if not det(Q):continue if tuple(tuple(sum(Q[i][k]*Q[j][k] for k in range(4))%2 for j in range(4)) for i in range(4))==tuple(tuple(r) for r in C): R=inv(Q) print('Q',Q,'rowsums',[sum(r)%2 for r in Q],'Rrow',[sum(r)%2 for r in R],'R1',[sum(r[i] for r in R)%2 for i in range(4)]) break EOF