#!/usr/local/bin/python3 def rk(M,n): M=[r[:] for r in M];r=0 for c in range(n): p=next((i for i in range(r,n) if M[i][c]),-1) if p<0:continue M[r],M[p]=M[p],M[r] for i in range(r+1,n): if M[i][c]: for j in range(c,n):M[i][j]^=M[r][j] r+=1 return r def dt(M,n):return rk(M,n)==n def iv(M,n): A=[M[i][:]+[int(i==j) for j in range(n)] for i in range(n)];r=0 for c in range(n): p=next((i for i in range(r,n) if A[i][c]),-1) if p<0:return None A[r],A[p]=A[p],A[r] for i in range(n): if i!=r and A[i][c]: for j in range(c,2*n):A[i][j]^=A[r][j] r+=1 return [q[n:] for q in A] t=4;n=6;bits=3 L=[[(bits>>j)&1,1-((bits>>j)&1)] for j in range(t)] E=[(i,j) for i in range(t) for j in range(i+1,t)] for m in range(1<<6): W=[[0]*t for _ in range(t)] for k,(i,j) in enumerate(E): if m>>k&1:W[i][j]=W[j][i]=1 if not dt(W,t):continue F=iv(W,t) # U basis l1,l2 for bits3: (1,1,0,0) and (0,0,1,1) u1=[1,1,0,0];u2=[0,0,1,1] q=sum(u1[i]*F[i][j]*u2[j] for i in range(t) for j in range(t))% 2 K=[[(F[i][j]^(i==j)^(sum(L[i][a]*L[j][a] for a in range(2))% 2)) for j in range(t)] for i in range(t)] A=[[0]*n for _ in range(n)] for i in range(2): for j in range(t):A[i][2+j]=A[2+j][i]=L[j][i] for i in range(t): for j in range(t):A[2+i][2+j]=K[i][j] if dt(A,n) and q==1: print('FOUND',m,'q',q,'rankK',rk(K,t)) print('W',W) print('F',F) print('K',K) print('A',A) break else: continue break