2019-10-16 05:37:49 +00:00
|
|
|
% vim: ft=tex
|
2019-10-11 09:47:17 +00:00
|
|
|
\section{The naive Simulator}
|
|
|
|
|
|
|
|
A quite big part of the simulations interesting for students and researchers is not
|
|
|
|
covered by stabilizer states and stabilizer circuits. In particular the
|
|
|
|
phase estimation algorithm is essential for many applications. Being able to simulate
|
|
|
|
such an algorithm is essential for education.
|
|
|
|
|
2019-10-16 05:37:49 +00:00
|
|
|
\subsection{Simulator Core}
|
2019-10-11 09:47:17 +00:00
|
|
|
|
2019-11-01 18:07:45 +00:00
|
|
|
Recalling \ref{ref:nqbitsystems} an arbitrary $N$ qbit state $\ket{\psi}$ can be written as such:
|
2019-10-11 09:47:17 +00:00
|
|
|
|
2019-11-01 18:07:45 +00:00
|
|
|
\begin{equation}
|
|
|
|
\ket{\psi} = \sum\limits_{i = 0}^{2^N - 1} c_i \ket{i}
|
|
|
|
\end{equation}
|
2019-10-11 09:47:17 +00:00
|
|
|
|
2019-10-16 05:37:49 +00:00
|
|
|
Which yields $2^N$ coefficients $c_i = \braket{\psi}{i}$. These coefficients are used to
|
2019-11-01 18:07:45 +00:00
|
|
|
store the quantum mechanical state of the simulator and are stored in NumPy arrays \cite{numpy_array}.
|
2019-10-16 05:37:49 +00:00
|
|
|
They can be modified and viewed without overhead
|
|
|
|
using python and allow fast modification using so-called NumPy ufuncs\cite{numpy_ufunc}.
|
|
|
|
A simulator state also contains a classical state which is a length $N$ integer array containing
|
|
|
|
the measured classical bits with a default value of $-1$.
|
2019-10-11 09:47:17 +00:00
|
|
|
|
2019-11-01 18:07:45 +00:00
|
|
|
The gates are implemented as NumPy ufuncs which allows an efficient
|
|
|
|
manipulation of NumPy arrays using C code. Every gate maps a length $2^N$
|
|
|
|
\lstinline[basicstyle=\ttfamily, language=Python]{numpy.cdouble} and a length
|
|
|
|
$N$ \lstinline[basicstyle=\ttfamily, language=Python]{numpy.int8} array to
|
|
|
|
a length $2^N$ \lstinline[basicstyle=\ttfamily,
|
|
|
|
language=Python]{numpy.cdouble}, a length $N$ \lstinline[basicstyle=\ttfamily,
|
|
|
|
language=Python]{numpy.int8} and a \lstinline[basicstyle=\ttfamily,
|
|
|
|
language=Python]{numpy.uint64} scalar. The \lstinline[basicstyle=\ttfamily,
|
|
|
|
language=Python]{numpy.cdouble} arrays are the quantum mechanical state before
|
|
|
|
and after the gate; the \lstinline[basicstyle=\ttfamily,
|
|
|
|
language=Python]{numpy.int8} arrays are the respective classical states and the
|
|
|
|
\lstinline[basicstyle=\ttfamily, language=Python]{numpy.uint64} scalar has
|
|
|
|
a logical one at every bit that has been measured.
|
|
|
|
|
|
|
|
\subsection{Implemented Gates}
|
|
|
|
|
|
|
|
As stated in \ref{ref:singleqbitsystems} and \ref{ref:nqbitsystems} a just a small set of gates is required to
|
|
|
|
approximate an arbitrary unitary matrix arbitrarily good. In principle just the $X$, $R_\phi$, $H$ and $CNOT$ gate
|
|
|
|
would be sufficient for a simulator. As however both $X$ and $Z$ are often used in practice FIXME: CITATION NEEDED
|
|
|
|
$X$, $Z$, $R_\phi$, $H$ and $CNOT$ are implemented. They can be accessed using
|
|
|
|
\lstinline[basicstyle=\ttfamily]{pyqcs.X}, \lstinline[basicstyle=\ttfamily]{pyqcs.Z}, \lstinline[basicstyle=\ttfamily]{pyqcs.R},
|
|
|
|
\lstinline[basicstyle=\ttfamily]{pyqcs.H} and \lstinline[basicstyle=\ttfamily]{pyqcs.C}.
|
|
|
|
|
|
|
|
\subsection{Usage}
|
|
|
|
|
|
|
|
FIXME
|
|
|
|
|
|
|
|
\subsection{Performance}
|
|
|
|
|
|
|
|
FIXME
|