#!/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 E=[(i,j) for i in range(t) for j in range(i+1,t)] Ws=[] 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 dt(W,t):Ws.append(W) for bits in range(1<>j)&1,1-((bits>>j)&1)] for j in range(t)] # basis of kernel L^T dim2 U=[] for free in range(t): v=[0]*t;v[free]=1 # need L^T v=0 i.e. for each col a sum v_i L_i[a]=0; set pivots solve simply by try all? pass # brute all v nonzero kernel ker=[] for v in range(1,1<>i)&1)*L[i][a] for i in range(t))% 2:ok=False if ok:ker.append([(v>>i)&1 for i in range(t)]) # ker should have 3 nonzero vectors q1=0;q2=0 for W in Ws: F=iv(W,t) z=True for u in ker: for v in ker: if sum(u[i]*F[i][j]*v[j] for i in range(t) for j in range(t))% 2:z=False if z:q1+=1 # actual A det 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):q2+=1 print(bits,q1,q2)