def cij(i, j, a, b): assert len(a[0]) == len(b) N = len(b) #print("sum") #[print(f" a[{i}][{n}] * b[{n}][{j}]") for n in range(N)] return sum( a[i][n] * b[n][j] for n in range(N) ) def mult(a, b): return [ [ cij(i, j, a, b) for j in range(len(b[0])) ] for i in range(len(a)) ] genmat1 = [[1, 0, 0, 0, 1, 1, 0], [0, 1, 0, 0, 1, 0, 1], [0, 0, 1, 0, 0, 1, 1], [0, 0, 0, 1, 1, 1, 1]] genmat = [[1, 1, 1, 0, 0, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [0, 1, 0, 1, 0, 1, 0, 1], [1, 1, 0, 1, 0, 0, 1, 0]] a = [[1, 0, 1, 1]] def gendat(): def do(i): for bit in reversed(range(4)): b = i >> bit & 1 yield b for i in range(16): yield [list(do(i))] for mat in gendat(): m2 = mult(mat, genmat1) print(m2, end=' ') ext = sum(m2[0]) print(ext, ext % 2, end=' | ') ext1 = sum(mat[0][0:3]) print(ext1, ext1 % 2) # [1, 0, 1, 1, 2, 3, 2, 3] chkmat = [[1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 1, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1]] b = [[0], [1], [1], [0], [0], [1], [1], [0]] #print(mult(chkmat, b))