A good $[[n, k, d]]$ qLDPC code is one where $\lim_{n \rightarrow \infty} \frac{k}{n} > 0$ and $k = O(n)$ and $\lim_{n \rightarrow \infty} \frac{d}{n} > 0$ and $d = O(n)$. A CSS code is one where we take two classical codes $C_1$ and $C_2$ with parity check matrices $H_1$ and $H_2$ such that $H_1 H_2^T = 0$. The intuition is that we can now use $C_1$ for $X$ errors and $C_2$ for $Z$ errors.
Suppose our classical codes are themselves LDPC codes. Then $C_1$ has distance $d_1 = O(n)$ and $C_2$ has distance $d_2 = O(n)$ as well. $H_1$ and $H_2$ are supposed to be sparse. Now, we run into a contradiction. We see that $H_2^T$ generates the codewords of $C_1$ because $H_1 H_2^T = 0$. But the code $C_1$ has distance $O(n)$ - hence its codewords cannot be sparse.
I have seen this argument in a talk but is it a formal no-go theorem? And if so, what is the intuition behind how to work around this no-go and create good qLDPC codes? Some naive ideas are
- Make CSS codes out of classical codes that are not both LDPC
- Don't try to make good qLDPC codes through the CSS route
I'm looking for the intuition behind the newer constructions in 2020 and later.