symmetry: by transforming the single-particle basis to quasi-momentum eigenstates: $${|k_xk_y;\sigma\rangle} = \frac{1}{L}\sum_{x,y=1}^Le^{ik_x x}e^{ik_y y}{|xy;\sigma\rangle}~,$$ in which $L$ is the linear dimension of the lattice. The constraint matrices then decompose into blocks with the same two-particle or particle-hole quasi-momentum $(K_x,K_y)$, [*e.g.*]{} the $S = 0$ part of the $\mathcal{G}$ matrix falls apart in $L^2$ blocks of dimension $L^2$. This *does* change the scaling of the program. Instead of the $\mathcal{O}(L^{12})$ scaling of a matrix multiplication on the $\mathcal{G}$ matrix without translational invariance, we now have a scaling of $\mathcal{O}(L^8)$.

### Point group symmetry

The final symmetry we exploit is the point-group symmetry ($C_{4v}$) of the lattice. Combined with translational invariance this forms the space group $P4mm$. There are three independent transformations which leave the Hamiltonian invariant: $$\begin{aligned}
{|x,y\rangle} \rightarrow& {|-x , y\rangle}\qquad\text{reflection symmetry in the $x$-direction}\\
{|x,y\rangle} \rightarrow& {|x,-y\rangle}\qquad\text{reflection symmetry in the $y$-direction}\\
{|x,y\rangle} \rightarrow& {|y,x\rangle}\qquad\text{reflection symmetry along the diagonal}\end{aligned}$$ These operations do not commute with the translation operator, which means they map different $(K_x,K_y)$ blocks in the constraint matrices onto each other. This can be used to reduce the number of blocks we have to store and perform calculations on. A problem arises in blocks that are mapped onto themselves 