How many \(\{ 0, 1 \}\) valued \(n \times n\) matrices are invertible over \(\mathbb{R}\)?
Even at first glance, this question seems like it lends itself well to inductive reasoning. That means we just need to find a base case and a convenient inductive step.
For each matrix size \(n\) there are \(2^{n^2}\) possible bitmatrices. This is because each cell of the matrix can be either \(0\) or \(1\). This means there are \(2^1 = 2\) possible bitmatrices of size \(1 \times 1\) and they are \(\left( \begin{matrix} 1 \end{matrix} \right)\) and \(\left( \begin{matrix} 0 \end{matrix} \right)\).
A matrix \(A\) is invertible iff \(A A^{-1} = I = A^{-1}A\). We check multiplication in both orders since matrix multiplication is not commutative. A matrix \(A\) is also only invertible iff its determinant is nonzero.
So far, we know there is \(1\) invertible \(1 \times 1\) bitmatrix: \(\left( \begin{matrix} 1 \end{matrix} \right)\)
Let’s move on to \(2 \times 2\) matrices. There are \(2^{2^2} = 16\) of them. We could write them all out by hand and find their determinants:
\[ \left| \begin{matrix} 0 & 0 \\ 0 & 0 \end{matrix} \right| = 0, \: \left| \begin{matrix} 0 & 0 \\ 0 & 1 \end{matrix} \right| = 0, \: \left| \begin{matrix} 0 & 0 \\ 1 & 0 \end{matrix} \right| = 0, \: \left| \begin{matrix} 0 & 0 \\ 1 & 1 \end{matrix} \right| = 0, \\[1em] \left| \begin{matrix} 0 & 1 \\ 0 & 0 \end{matrix} \right| = 0, \: \left| \begin{matrix} 0 & 1 \\ 0 & 1 \end{matrix} \right| = 0, \: \left| \begin{matrix} 0 & 1 \\ 1 & 0 \end{matrix} \right| = -1, \: \left| \begin{matrix} 0 & 1 \\ 1 & 1 \end{matrix} \right| = -1, \\[1em] \left| \begin{matrix} 1 & 0 \\ 0 & 0 \end{matrix} \right| = 0, \: \left| \begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix} \right| = 1, \: \left| \begin{matrix} 1 & 0 \\ 1 & 0 \end{matrix} \right| = 0, \: \left| \begin{matrix} 1 & 0 \\ 1 & 1 \end{matrix} \right| = 1, \\[1em] \left| \begin{matrix} 1 & 1 \\ 0 & 0 \end{matrix} \right| = 0, \: \left| \begin{matrix} 1 & 1 \\ 0 & 1 \end{matrix} \right| = 1, \: \left| \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \right| = -1, \: \left| \begin{matrix} 1 & 1 \\ 1 & 1 \end{matrix} \right| = 0 \]
There are six invertible \(2 \times 2\) bitmatrices (since their determinants are nonzero). However, it’d be nice to be able to generate all bitmatrices of size \(n\) automatically so we can more easily examine and play with them. Luckily, we can do that with this Octave one-liner:
arrayfun(@(x) reshape(bitget(x, n^2:-1:1), n, n), 0:2^(n^2)-1, 'UniformOutput', false))(3) (@(n)
This is a bit dense so let’s explain it from the inside out.
bitget
returns a number as a vector of bits. We pass it the
number x, and the range counting from \(n^2\) down to \(1\) as an index for which bits we want. For
example, when passed 15 for \(x\) and 3
for \(n\), we get
0 0 0 0 0 1 1 1 1
.
bitget(x, n^2:-1:1)
Let’s let last
be the last expression. Now, we reshape
it to an \(n \times n\) matrix.
reshape(last, n, n)
After that we use arrayfun
to apply an anonymous
function of \(x\) to every element of
the \(n \times n\) matrix. The
anonymous function does bitget
and reshape
. We
map this over the range \(\left[ 0, 2^{n^2}-1
\right]\) because those are the possible bit values for an \(n \times n\) matrix. We also set
UniformOutput
to false
because Octave wants
that.
arrayfun(@(x) last, 0:2^(n^2)-1, 'UniformOutput', false)
Finally, we parameterize the whole thing by the matrix size \(n\) using another anonymous function.
3) (@(n) last)(
Let’s make sure that we can get the same number of invertible \(2 \times 2\) bitmatrices from our code as we got by hand. All we have to do is count up the nonzero determinants. Our final one-liner, though a bit unwieldy, looks like this:
length(nonzeros(arrayfun(@(x) det(reshape(bitget(x, n^2:-1:1), n, n)), 0:2^(n^2)-1))))(3) (@(n)
And, it gives us the same answer for the \(2 \times 2\) case!
:1> (@(n) length(nonzeros(arrayfun(@(x) det(reshape(bitget(x, n^2:-1:1), n, n)), 0:2^(n^2)-1))))(2)
octaveans = 6
At this point I got really stuck. I was able to generate answers for small \(n\), but didn’t see any reasonable formula for finding the number.
As a bonus double-check, if we look up \(1, 6, 174, 22560...\) in OEIS we get the sequence we’re looking for. There’s even a formula! But the formula is presented in terms of another sequence. And that sequence’s formula is presented in terms of…this sequence. So a circular formula won’t help us much.
I also looked into the Leibniz formula, trying to see if I could find some pattern at play that might give insight into the special case of \(\{ 0, 1 \}\) matrices.
\[ \mathrm{det}(A) = \sum_{\sigma \in S_n} \left( \mathrm{sgn}(\sigma) \prod_{i=1}^n a_{i, \sigma_i} \right) \]
I still didn’t find anything, but really wanted to. After a few hours of banging my head against the problem and asking friends for help, I caved and looked for an answer directly. At least if I had the answer, maybe I could work backwards and determine some way to come up with that formula based on the pieces I already had. Maybe the two tracks of thinking could meet in the middle. It still felt like the kind of problem that I should be able to solve.
So what’s the actual answer? Turns out nobody knows (yet).