\documentclass[11pt,reqno]{amsart} % Layout of fullpage with its default one-inch margins and plain page style. \usepackage[letterpaper,margin=1in,nohead,includefoot]{geometry} \pagestyle{plain} \DeclareFontFamilySubstitution{TS1}{cmr}{lmr} \usepackage{amsmath,amssymb,amsthm,mathtools} \usepackage{array,booktabs,multirow} \usepackage{algorithm,algpseudocode,listings} \lstset{basicstyle=\footnotesize\ttfamily,columns=fullflexible, keepspaces=true,showstringspaces=false,breaklines=false, aboveskip=8pt,belowskip=8pt} \usepackage[colorlinks=true,allcolors=blue,pdfencoding=auto]{hyperref} \hypersetup{pdfauthor={OpenBMB},pdftitle={An order-eleven counterexample to triangular realization of sign matrix permanents}} \urlstyle{same} \setlength{\emergencystretch}{1.2em} \allowdisplaybreaks[1] \numberwithin{equation}{section} \renewcommand{\le}{\leqslant} \renewcommand{\ge}{\geqslant} \DeclareMathOperator{\per}{per} \newcommand{\Om}{\Omega} \providecommand{\U}{} \renewcommand{\U}{\mathcal U} \newcommand{\1}{\mathbf{1}} \theoremstyle{plain} \newtheorem{theorem}{Theorem}[section] \newtheorem{lemma}[theorem]{Lemma} \newtheorem{proposition}[theorem]{Proposition} \newtheorem{corollary}[theorem]{Corollary} \theoremstyle{definition} \newtheorem{definition}[theorem]{Definition} \theoremstyle{remark} \newtheorem{remark}[theorem]{Remark} \title{An order-eleven counterexample to triangular\\ realization of sign matrix permanents} \author{OpenBMB} \begin{document} \begin{abstract} We construct an \(11\times11\) sign matrix with permanent \(P=2\,029\,568\). An exhaustive enumeration shows that \(\lvert\per B\rvert\ne P\) for every sign matrix \(B\) of order eleven whose entries below the diagonal are all \(+1\). This gives a negative answer to a question of Ingram and Razborov~\cite{IR}. \end{abstract} \maketitle \section{Introduction}\label{sec:01-intro} The permanent of an \(n\times n\) matrix \(A=(a_{ij})\) is \[ \per A=\sum_{\sigma\in S_n}\prod_{i=1}^n a_{i,\sigma(i)}, \] where \(S_n\) is the symmetric group on \(n\) letters. With edge weights \(a_{ij}\), each summand is the weight of a perfect matching between rows and columns~\cite{Minc,BR}. Let \(\Om_n=\{-1,+1\}^{n\times n}\) denote the set of all \(n\times n\) sign matrices, that is, matrices whose entries are either \(-1\) or \(+1\). For each \(A\in\Om_n\), every perfect matching has weight \(\pm1\). For any family \(\mathcal F\subseteq\Om_n\), write \(\mathcal P(\mathcal F)=\{\per A:A\in\mathcal F\}\) for the set of permanent values attained on \(\mathcal F\). Ingram and Razborov constructed a family of sign matrices for which the number of distinct permanents grows superpolynomially in \(n\)~\cite{IR}. Hunter, Kwan and Sauermann subsequently proved that \(\lvert\mathcal P(\Om_n)\rvert\ge e^{cn}\) for some absolute constant \(c>0\) and all sufficiently large \(n\)~\cite[Corollary~1.3]{HKS}. Ingram and Razborov~\cite[Problem~4, p.~283]{IR} also asked whether the same range can be attained within the family \[ \U_n=\{B\in\Om_n:b_{ij}=+1\text{ for }i>j\}. \] Here the signs on and above the diagonal are unrestricted. The question is whether \(\mathcal P(\U_n)=\mathcal P(\Om_n)\) for every \(n\) (see also~\cite{AC12}). A matrix may share its permanent with a member of \(\U_n\) even when no row and column permutations bring it into \(\U_n\). A counterexample must therefore exclude every triangular representative of a given value. Negating the first row preserves each family and negates the permanent. Both ranges are therefore symmetric about zero, and it suffices to compare absolute values. The triangular family contains representatives for several extremal values. For \(n\ge5\) and \(1\le k\le n\), Budrevich and Guterman proved that the largest absolute permanent among sign matrices of rank \(k\) is attained by changing \(k-1\) diagonal entries of the \(n\times n\) all-ones matrix \(J_n\) to \(-1\)~\cite{BG}. Each of these matrices belongs to \(\U_n\). At order eleven, an example of Wanless~\cite[\S3]{Wanless} attains the smallest nonzero absolute permanent, \(256\). Its negative entries occupy precisely the positions with \(j-i\in\{1,2,3,8,9\}\), so this Toeplitz matrix also belongs to \(\U_{11}\). Colbrook established by exact computation that the two ranges coincide for \(1\le n\le10\)~\cite[Theorem~2]{Colbrook}. At order ten the common range contains \(3\,865\) distinct signed values. The following theorem establishes strict inclusion at order eleven. \begin{theorem}\label{thm:main} There is a matrix \(A\in\Om_{11}\) with \(\per A=2\,029\,568\). Every \(B\in\U_{11}\) satisfies \(\lvert\per B\rvert\ne 2\,029\,568\). \end{theorem} By Colbrook's result and Theorem~\ref{thm:main}, eleven is the least order at which the two ranges differ. Set \(P=2\,029\,568\). Section~\ref{sec:02-witness} constructs the matrix \(A=J_{11}-2(C\oplus I_7)\), where \(J_{11}\) is the \(11\times11\) all-ones matrix, \(I_7\) is the \(7\times7\) identity matrix, and \(C\) is the \(4\times4\) biadjacency matrix of an eight-cycle. A direct calculation gives \(\per A=P\). To exclude \(P\) from the permanents of the \(2^{66}\) matrices in \(\U_{11}\), we enumerate suffixes consisting of the last \(r\) rows. In such a suffix the first \(11-r\) columns are identical. The permanent of an \(r\times r\) submatrix is therefore determined by the subset of the last \(r\) columns that it contains. Section~\ref{sec:03-suffix} derives a recurrence for these submatrix permanents and uses them to evaluate Colbrook's upper bound on \(\lvert\per B\rvert\) for every completion \(B\)~\cite[Lemma~6]{Colbrook}. The enumeration identifies states related by a permutation of the last \(r\) columns and discards any state whose upper bound is less than \(P\). At \(r=10\) this leaves \(34\,099\) distinct sorted vectors of absolute first-row cofactors. For each retained suffix, the possible first rows yield precisely the signed sums of the entries of its cofactor vector. Section~\ref{sec:04-exclusion} verifies that no such sum equals \(P\). Appendix~\ref{sec:reproduce} gives the C++ implementation of this enumeration. \section{Construction of the order-eleven witness}\label{sec:02-witness} View an \(n\times n\) zero-one matrix \(N=(n_{ij})\) as a board on which a square \((i,j)\) is marked if \(n_{ij}=1\). The marked squares are precisely the positions of the negative entries of \(J_n-2N\). A placement of \(k\) nonattacking rooks is a set of \(k\) marked squares, no two in the same row or column. The entries in the selected squares therefore occur together in at least one term of the permanent expansion. The number of such placements is the \(k\)th \emph{rook number} \(r_k(N)\)~\cite{KR1946}. There is one empty placement, so \(r_0(N)=1\), and \(r_1(N)\) is the number of marked squares. Collecting the counts by placement size gives the \emph{rook polynomial} \[ R_N(x)=\sum_{k=0}^n r_k(N)x^k. \] \begin{lemma}\label{lem:rook} For every zero-one board \(N\) of order \(n\), \[ \per(J_n-2N)=\sum_{k=0}^n (-2)^k(n-k)!\,r_k(N). \] \end{lemma} \begin{proof} Expand each permutation product in \(\per(J_n-2N)\) by selecting either \(1\) or the corresponding entry of \(-2N\) from each factor. In a nonzero term, the \(k\) positions at which the second summand is selected form a placement of nonattacking rooks on \(N\). Each such placement extends to \((n-k)!\) permutations and contributes \((-2)^k\) in each extension. Summation over the placements proves the formula. \end{proof} \begin{proposition}\label{prop:witness} Let \(C\) be the \(4\times4\) zero-one matrix with ones on the diagonal and on the cyclic superdiagonal. Then \(A=J_{11}-2(C\oplus I_7)\) has permanent \(2\,029\,568\). \end{proposition} \begin{proof} By Lemma~\ref{lem:rook} it suffices to compute the rook polynomial of \(N=C\oplus I_7\), where \[ C=\begin{pmatrix} 1&1&0&0\\ 0&1&1&0\\ 0&0&1&1\\ 1&0&0&1 \end{pmatrix}. \] The matrix \(A=J_{11}-2N\) has entries in \(\{-1,+1\}\). Associate to each zero-one board a bipartite graph whose vertex classes are the rows and columns, with an edge for each entry equal to \(1\). Placements of nonattacking rooks correspond bijectively to matchings. The graph associated to \(C\) is an eight-cycle. On a path of \(m\) edges, a matching of size \(k\) is specified by indices \(i_1<\cdots #include #include #include #include #include #include #include #include #include using namespace std; using V = vector; // Hashes locate candidates; unordered_set compares full vectors. struct Hash { size_t operator()(V const &v) const { uint64_t h = 0x98251203; for (int x : v) { h ^= uint64_t(x) + 0x9e3779b97f4a7c15ULL + (h << 6) + (h >> 2); } return h; } }; int n; // In an unpacked state, q[s] is the minor for active-subset mask s. // valid[r] contains precisely the admissible masks at suffix size r. vector valid[14]; int choose_[13][13], factorial_[13]; // Pack valid coordinates; unpacking fills other entries with zero. V pack(const V &q, int r) { V p; p.reserve(valid[r].size()); for (int s : valid[r]) p.push_back(q[s]); return p; } V unpack(const V &p, int r) { V q(1 << r); for (int j = 0; j < (int)p.size(); ++j) q[valid[r][j]] = p[j]; return q; } // Test whether interchanging coordinates i and j fixes the state. bool twins(const V &q, int i, int j, int r) { for (int s : valid[r]) if (((s >> i) ^ (s >> j)) & 1) if (q[s] != q[s ^ (1 << i) ^ (1 << j)]) return false; return true; } V permuteq(const V &q, const V &order, int r) { V v(1 << r), map(1 << r); for (int s = 1; s < (1 << r); ++s) { int b = __builtin_ctz((unsigned)s); map[s] = map[s ^ (1 << b)] | (1 << order[b]); } for (int s : valid[r]) v[s] = q[map[s]]; return v; } // Enumerate orderings within each tied signature class. // If the class consists of twins, every such ordering is equivalent. void canonrec(const V &q, const vector &groups, int gi, V &order, V &best, int r) { if (gi == (int)groups.size()) { V v = permuteq(q, order, r); if (best.empty() || v < best) best = move(v); return; } V g = groups[gi]; bool alltwins = true; for (int j = 1; j < (int)g.size(); ++j) if (!twins(q, g[0], g[j], r)) { alltwins = false; break; } do { int old = order.size(); order.insert(order.end(), g.begin(), g.end()); canonrec(q, groups, gi + 1, order, best, r); order.resize(old); if (alltwins) break; } while (next_permutation(g.begin(), g.end())); } // Invariant signatures fix class order before exact canonicalization. V canon(const V &q, int r) { vector> signatures; for (int j = 0; j < r; ++j) { V sig; for (int k = max(0, 2 * r - n); k <= r; ++k) { V block; for (int s : valid[r]) if (__builtin_popcount((unsigned)s) == k && (s & (1 << j))) block.push_back(q[s]); sort(block.begin(), block.end()); sig.insert(sig.end(), block.begin(), block.end()); } signatures.emplace_back(move(sig), j); } sort(signatures.begin(), signatures.end()); vector groups; for (int j = 0; j < r; ++j) { if (!j || signatures[j].first != signatures[j - 1].first) groups.emplace_back(); groups.back().push_back(signatures[j].second); } V order, best; canonrec(q, groups, 0, order, best, r); return best; } // Choose each sign recursively; accept when the final sum is target. bool hits(const V &q, int target, size_t i = 0, int sum = 0) { if (i == q.size()) return sum == target; return hits(q, target, i + 1, sum + q[i]) || hits(q, target, i + 1, sum - q[i]); } int main(int argc, char **argv) { n = stoi(argv[1]); int target = stoi(argv[2]); if (n < 3 || n > 12) return 2; factorial_[0] = 1; for (int i = 1; i <= n; ++i) factorial_[i] = i * factorial_[i - 1]; for (int i = 0; i <= n; ++i) { choose_[i][0] = choose_[i][i] = 1; for (int j = 1; j < i; ++j) choose_[i][j] = choose_[i - 1][j - 1] + choose_[i - 1][j]; } for (int r = 0; r <= n; ++r) for (int s = 0; s < (1 << r); ++s) if (__builtin_popcount((unsigned)s) >= max(0, 2 * r - n)) valid[r].push_back(s); unordered_set states; // Normalize the bottom row to all +1: q_empty = q_{0} = 1. states.insert(V{1, 1}); auto start = chrono::steady_clock::now(); cout << "n=" << n << " target=" << target << "\n"; for (int r = 1; r < n - 1; ++r) { int R = r + 1; unordered_set next; uint64_t pruned = 0, generated = 0; vector affected(R); V weights(1 << R); for (int s : valid[R]) { weights[s] = choose_[n - R][R - __builtin_popcount((unsigned)s)]; for (int j = 0; j < R; ++j) if (s & (1 << j)) affected[j].push_back(s); } for (auto const &packed : states) { V q = unpack(packed, r), v(1 << R); int norm = 0; // Start with all new row signs positive. The weighted norm // is L_R divided by factorial_[n-R]. for (int s : valid[R]) { int t = s & ((1 << r) - 1), k = __builtin_popcount((unsigned)s); int p = (R - k + ((s & (1 << r)) ? 1 : 0)) * q[t]; for (int z = t; z; z &= z - 1) { int bit = z & -z; p += q[t ^ bit]; } v[s] = p; norm += weights[s] * abs(p); } for (int b = 0; b < (1 << R); ++b) { ++generated; // Consecutive Gray words flip exactly one new row sign. // Update only minors containing that coordinate. if (b) { int j = __builtin_ctz((unsigned)b), bit = 1 << j, gray = b ^ (b >> 1), delta = (gray & bit) ? -2 : 2; for (int s : affected[j]) { int t = s & ((1 << r) - 1), coefficient = q[j == r ? t : (t ^ bit)], old = v[s]; v[s] += delta * coefficient; norm += weights[s] * (abs(v[s]) - abs(old)); } } // Discard bounds strictly below the target; retain equality. if (factorial_[n - R] * norm < target) { ++pruned; continue; } // Retain sorted magnitudes of all n first-row cofactors. if (R == n - 1) { V profile; profile.push_back(abs(v[(1 << R) - 1])); for (int j = 0; j < R; ++j) profile.push_back(abs(v[((1 << R) - 1) ^ (1 << j)])); sort(profile.begin(), profile.end()); next.insert(move(profile)); } else next.insert(pack(canon(v, R), R)); } } states = move(next); cout << "r=" << R << " generated=" << generated << " pruned=" << pruned << " states=" << states.size() << " seconds=" << chrono::duration( chrono::steady_clock::now() - start).count() << endl; } vector profiles(states.begin(), states.end()); // Sort profiles so output is independent of hash-table order. // Each row has trailing spaces and a final newline (LF on POSIX). sort(profiles.begin(), profiles.end()); ofstream out("results/pm1_permanent_range/target_" + to_string(n) + "_" + to_string(target) + "_profiles.txt"); int found = 0; for (const V &q : profiles) { for (int x : q) out << x << " "; out << "\n"; if (hits(q, target)) { ++found; cout << "HIT_PROFILE "; for (int x : q) cout << x << " "; cout << endl; } } cout << "final_profiles=" << profiles.size() << " target_hits=" << found << " verdict=" << (found ? "ATTAINED" : "EXCLUDED") << endl; } \end{lstlisting} \begin{thebibliography}{10} \raggedright \bibitem{IR} D.~Ingram and A.~Razborov, On the range of the permanent of \((\pm1)\)-matrices. \emph{Linear Algebra and its Applications} \textbf{743} (2026), 271--285. \href{https://doi.org/10.1016/j.laa.2026.04.027}{doi:\nolinkurl{10.1016/j.laa.2026.04.027}}. \bibitem{Minc} H.~Minc, \emph{Permanents}. Encyclopedia of Mathematics and its Applications, vol.~6, Cambridge University Press, 1984. \href{https://doi.org/10.1017/CBO9781107340688}{doi:\nolinkurl{10.1017/CBO9781107340688}}. \bibitem{BR} R.~A. Brualdi and H.~J. Ryser, \emph{Combinatorial Matrix Theory}. Cambridge University Press, 1991, Ch.~7, pp.~198--249. \href{https://doi.org/10.1017/CBO9781107325708.008}{doi:\nolinkurl{10.1017/CBO9781107325708.008}}. \bibitem{HKS} Z.~Hunter, M.~Kwan and L.~Sauermann, \emph{Exponential anticoncentration of the permanent}. Preprint, 2025. \href{https://arxiv.org/abs/2509.22577}{arXiv:2509.22577}. \bibitem{AC12} \emph{Realizing every sign-matrix permanent with negative entries confined on or above the diagonal}. \href{https://github.com/ajt60gaibb/OpenProblemsInNLA/tree/d7fcfe7bfe8c02cd98d9463fa5a8ba12850d5bdb/arithmetic-and-complexity/AC-12}{Available online}. \bibitem{BG} M.~V. Budrevich and A.~E. Guterman, Kr\"auter conjecture on permanents is true. \emph{Journal of Combinatorial Theory, Series A} \textbf{162} (2019), 306--343. \href{https://doi.org/10.1016/j.jcta.2018.11.009}{doi:\nolinkurl{10.1016/j.jcta.2018.11.009}}. \bibitem{Wanless} I.~M. Wanless, Permanents of matrices of signed ones. \emph{Linear and Multilinear Algebra} \textbf{53} (2005), 427--433. \href{https://doi.org/10.1080/03081080500093990}{doi:\nolinkurl{10.1080/03081080500093990}}. \bibitem{Colbrook} M.~J. Colbrook, \emph{Exact finite cases of two sign-matrix permanent problems}, 11~September~2026. \href{https://github.com/ajt60gaibb/OpenProblemsInNLA/blob/3443179cb62b410678f3c67f26cd8df56ba6133a/references/colbrook-arithmetic-2026-09-11/manuscripts/AC-11-12.pdf}{Available online}. \bibitem{KR1946} I.~Kaplansky and J.~Riordan, The problem of the rooks and its applications. \emph{Duke Mathematical Journal} \textbf{13} (1946), 259--268. \href{https://doi.org/10.1215/S0012-7094-46-01324-5}{doi:\nolinkurl{10.1215/S0012-7094-46-01324-5}}. \bibitem{Savage} C.~Savage, A survey of combinatorial Gray codes. \emph{SIAM Review} \textbf{39} (1997), 605--629. \href{https://doi.org/10.1137/S0036144595295272}{doi:\nolinkurl{10.1137/S0036144595295272}}. \end{thebibliography} \end{document}