#!/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] def ker(M,n): A=[r[:] for r in M];piv=[];r=0 for c in range(n): p=next((i for i in range(r,n) if A[i][c]),-1) if p<0:continue 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,n):A[i][j]^=A[r][j] piv.append(c);r+=1 free=[c for c in range(n) if c not in piv] bs=[] for f in free: v=[0]*n;v[f]=1 for i,c in enumerate(piv):v[c]=A[i][f] bs.append(v) return bs n=6 E=[(i,j) for i in range(n) for j in range(i+1,n)];cnt=0;pat={};Ws={} for m in range(1<>k&1:A[i][j]=A[j][i]=1 if dt(A,n): B=[r[:] for r in A] for i in range(n):B[i][i]^=1 if dt(B,n): C=iv(B,n) if all(C[i][i]==(i<2) for i in range(n)): cnt+=1 D=[r[:] for r in C] D[0][0]^=1;D[1][1]^=1 bs=ker(D,n) M2=[[bs[0][0],bs[1][0]],[bs[0][1],bs[1][1]]] # invert 2x2 d=M2[0][0]*M2[1][1]^M2[0][1]*M2[1][0] r1=[(M2[1][1]*bs[0][k]^M2[0][1]*bs[1][k])*d^1 for k in range(n)] r2=[(M2[0][0]*bs[1][k]^M2[1][0]*bs[0][k])*d^1 for k in range(n)] L=[(r1[j],r2[j]) for j in range(2,n)] for p in L:pat[p]=pat.get(p,0)+1 W=[[D[i][j] for j in range(2,n)] for i in range(2,n)] Ws[str(W)]=Ws.get(str(W),0)+1 print('cnt',cnt) print('pat',pat) print('Wnum',len(Ws)) print('Wmult',sorted(Ws.values())[:5],sorted(Ws.values())[-5:])