#!/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] n=6;t=4 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) Ls=[] for bits in range(1<>j)&1,1-((bits>>j)&1)] for j in range(t)] Ls.append(L) print(len(Ws),len(Ls)) cnt=0;per={} for W in Ws: F=iv(W,t) for L in Ls: B=[[0]*n for _ in range(n)] for i in range(2): B[i][i]=1 for j in range(t): B[i][2+j]=B[2+j][i]=L[j][i] for i in range(t): for j in range(t): v=F[i][j] for a in range(2): for b in range(2): v^=L[i][a]*L[j][b] B[2+i][2+j]=v if dt(B,n): A=[r[:] for r in B] for i in range(n):A[i][i]^=1 if dt(A,n): C=iv(B,n) if all(C[i][i]==(i<2) for i in range(n)): cnt+=1;per[str(W)]=per.get(str(W),0)+1 print('cnt',cnt,'numW',len(per),sorted(per.values()))