function c = count_colorings(n, piece, eqRels) [l, w] = size(piece); [Adj, numb] = adjacency(piece); % Adj = Adj|(Adj')|eye(n); %Check symmetries sym = 1:n; %flip vert if piece == piece(l:-1:1, :) sym = [sym; sym_perm(n, numb, numb(l:-1:1, :))]; end %flip horiz if piece == piece(:, w:-1:1) sym = [sym; sym_perm(n, numb, numb(:, w:-1:1))]; end %rotate 180 if piece == (piece(l:-1:1, w:-1:1)) sym = [sym; sym_perm(n, numb, numb(l:-1:1, w:-1:1))]; end if l == w p2 = piece'; n2 = numb'; %flip across main diagonal if piece == p2 sym = [sym; sym_perm(n, numb, n2)]; end %rotate 90 if piece == p2(l:-1:1, :) sym = [sym; sym_perm(n, numb, n2(l:-1:1, :)); sym_perm(n, n2(l:-1:1, :), numb)]; end %flip across antidiagonal if piece == p2(l:-1:1, w:-1:1) sym = [sym; sym_perm(n, numb, n2(l:-1:1, w:-1:1))]; end end s = size(sym, 1); c = 0; relCount = size(eqRels, 3); for k = 1:relCount er = eqRels(:, :, k); er = er|(er')|eye(n); if (er&Adj) == 0 %coloring works c = c + 1; for j = 2:s perm = sym(j, :); er2 = er(perm, perm); if er == er2 %coloring is preserved by this permutation c = c + 1; end end end end c = c/s;