some work as suggested by Simon

This commit is contained in:
Daniel Knüttel 2020-04-06 18:32:33 +02:00
parent 1a9123e82f
commit 102ed77cba
9 changed files with 212 additions and 202 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 129 KiB

View File

@ -4,11 +4,11 @@
\section{Source Code for the Benchmarks}
\label{ref:code_benchmarks}
The benchmarks used in \ref{ref:performance} are done using this code. Note
The benchmarks used in \ref{ref:performance} are based on this code. Note
that the execution time is measured which is inherently noisy. To account for
the noise several strategies are used:
\begin{enumerate}[1]
\begin{enumerate}[1.]
\item{The same circuit is applied to the starting state several times. The
minimal result is used as the noise must be positive}
\item{Several circuits are applied to the starting state. The remaining
@ -30,15 +30,9 @@ The code used to benchmark the three regimes is analogous and not included here.
Because the whole graphs are barely percetible windows have been used
in Figure \ref{fig:graph_high_linear_regime} and Figure \ref{fig:graph_intermediate_regime}.
For the sake of completeness the whole graphs are included here in Figure \ref{fig:graph_low_linear_regime_full},
For the sake of completeness the whole graphs are included here in
Figure \ref{fig:graph_intermediate_regime_full} and Figure \ref{fig:graph_high_linear_regime_full}.
\begin{figure}[H]
\centering
\includegraphics[width=\linewidth]{graphics/graph_low_linear_regime.png}
\caption[Typical Graphical State in the Low-Linear Regime]{Typical Graphical State in the Low-Linear Regime}
\label{fig:graph_low_linear_regime_full}
\end{figure}
\begin{figure}[H]
\centering
@ -57,9 +51,9 @@ Figure \ref{fig:graph_intermediate_regime_full} and Figure \ref{fig:graph_high_l
\section{Code to Generate the Example Graphs}
\label{ref:code_example_graphs}
This code has been used to generate the example graphs used in
\ref{ref:performance}. Note that generating the graph is done using a random
circuit as used in \ref{ref:code_benchmarks}. The generated \lstinline{dot}
This code has been used to generate the example graphs in \ref{ref:performance}
and \ref{ref:complete_graphs}. Note that generating the graph is done with
a random circuit as in \ref{ref:code_benchmarks}. The generated \lstinline{dot}
code is converted to an image using
\lstinline{dot i_regime.dot -Tpng -o i_regime.png}.
@ -69,17 +63,17 @@ code is converted to an image using
\section{Code to Benchmark \lstinline{ufunc} Gates against Python}
\label{ref:benchmark_ufunc_py}
It has been mentioned several times that the implementation using
\lstinline{ufuncs} as gates is faster than using a \lstinline{python}
implementation. To support this statement a simple benchmark can be used. The
relatively simple Pauli $X$ is used, more complicated gates like $CX$ or $H$
have worse performance when implemented in \lstinline{python}. The performance
improvement when using the \lstinline{ufunc} is a factor around $6.4$ in this tested
case. One must however note that the tested \lstinline{python} code is not
realistic and in a possible applications there would be a significant overhead.
It has been mentioned several times that the implementation with
\lstinline{ufuncs} as gates is faster than a pure \lstinline{python}
implementation. To support this statement a simple benchmark is written. The
relatively simple Pauli $X$ gate us implemented, more complicated gates like $CX$ or $H$
have worse performance when written in \lstinline{python}. The performance
improvement when in this example is a factor around $6.4$.
One must note that the tested \lstinline{python} code is not
realistic and in a possible application there would be a significant overhead.
\lstinputlisting[title={Code to Benchmark \lstinline{ufunc} Gates against Python}, language=Python, breaklines=True]{extra_benchmark/benchmark.py}
When using \lstinline{result_py[0::2] = qm_state[1::2]} the result is identical and
the performance is only increased by a factor around $1.7$. This method is however not
the performance is only increased by a factor around $1.7$. This method is not
applicable to general act-qbits and the bit mask has to be used.

View File

@ -2,8 +2,8 @@
\chapter{Conclusion and Outlook}
As seen in \ref{ref:performance} simulation using stabilizers is exponentially
faster than simulating using state vectors. Using a graphical representation
for the stabilizers is on average more efficiently than using a stabilizer
faster than simulating with dense state vectors. The graphical representation
for stabilizer states is on average more efficiently than the stabilizer
tableaux. In particular one can simulate more qbits while only applying
Clifford gates.
@ -13,7 +13,7 @@ stabilizer code requires $5$ qbits to encode one logical qbit
\cite{nielsen_chuang_2010}. Several layers of data encoding increase the
number of required qbits exponentially.
Simulating in the stabilizer formalism is rather uninteresting from a physical
Simulating in the stabilizer formalism is uninteresting from a physical
point of view as basically no physically interesting simulations can be
performed: As shown in \ref{ref:meas_stab} probability amplitudes have to be
$0, \frac{1}{2}, 1$; this leaves very few points in time that could be
@ -21,7 +21,7 @@ simulated by applying a transfer matrix. Algorithms like the quantum fourier
transform also require non-Clifford gates for qbit counts $n \neq 2, 4$.
The basic idea of not simulating a state but (after imposing some conditions on
the Hilbert space) other objects that describe the state is extremely
the Hilbert space) other objects that describe the state is
interesting for physics as often the exponentially large or infinitely large
Hilbert spaces cannot be mapped to a classical (super) computer. One key idea
to take from the stabilizer formalism is to simulate the Hamiltonian instead of
@ -34,14 +34,14 @@ ground state of this Hamiltonian.
While trying to extend the stabilizer formalism one inevitably hits the
question:\\ \textit{Why is there a constraint on the $R_\phi$ angle? Why is it
$\frac{\pi}{2}$?}\\ The answer to this question is hidden in the Clifford
group. Recalling Definition \ref{def:clifford_group} the Clifford group is not
defined to be generated by $H, S, CZ$ but by its property of normalizing the
multilocal Pauli group. Storing and manipulating the multilocal Pauli group is
only so efficient (or possible) because it is the tensor product of Pauli
matrices. A general unitary on $n$ qbits would be a $2^{n} \times 2^{n}$ matrix
which requires more space than a dense state vector. The Clifford group is
a group preserving this tensor product property.
$\frac{\pi}{2}$?}\\ The answer to this question can be found by taking a look
at the Clifford group. Recalling Definition \ref{def:clifford_group} the
Clifford group is not defined to be generated by $H, S, CZ$, but by its property
of normalizing the multilocal Pauli group. Storing and manipulating the
multilocal Pauli group is only so efficient (or possible) because it is the
tensor product of Pauli matrices. A general unitary on $n$ qbits would be
a $2^{n} \times 2^{n}$ matrix which requires more space than a dense state
vector. The Clifford group is a group preserving this tensor product property.
%{{{
%When lifting the constraint that $\ket{\varphi}$ is stabilized by the multilocal Pauli
@ -103,10 +103,10 @@ a group preserving this tensor product property.
The stabilizer formalism as introduced in \ref{ref:stab_states} has since been
generalized to normalizers of a finite Abelian group over the Hilbert space
\cite{bermejovega_lin_vdnest2015}\cite{bermejovega_vdnest2018}\cite{vandennest2019}\cite{vandennest2018}.
This allows to simulate more classes of circuits efficiently on classical computers
including the Quantum Fourier Transforms which is often believed to be
responsible for exponential speedups. One must note that in the definition of
the QFTs as in \cite{vandennest2018} the QFT depends on the Abelian group it
This allows to simulate more classes of circuits efficiently on classical
computers including the Quantum Fourier Transforms which is often believed to
be responsible for exponential speedups. One must note that in the definition
of the QFTs as in \cite{vandennest2018} the QFT depends on the Abelian group it
acts on. In particular the QFT on the group that decomposes the Hilbert space
as seen in this paper ($Z_2^n$) is just the tensor product of the $H$ gates.
The QFT as used in \ref{ref:quantum_algorithms} for the phase estimation
@ -115,8 +115,8 @@ interesting results: It is not the tensor product property of the multilocal
Pauli group that makes computations efficient but the normalization property of
the Clifford group \cite{vandennest2018}.
The exponential speedup of quantum computing is often attributed to
The exponential speedup of quantum computing is often attributed to
entanglement, superposition and interference effects
\cite{uwaterloo}\cite{21732}\cite{vandennest2018}. Stabilizer states
however show both entanglement, superposition and interference effects;
as do computations done using general normalizers \cite{vandennest2018}.
\cite{uwaterloo}\cite{21732}\cite{vandennest2018}. Stabilizer states show
entanglement, superposition and interference effects; as do computations using
general normalizers \cite{vandennest2018}.

View File

@ -2,13 +2,13 @@
\chapter{Implementation}
This chapter discusses how the concepts introduced before are implemented into
a simulator. Futher the infrastructure around the simulation and some tools are
a simulator. Further the infrastructure around the simulation and some tools are
explained.
The implementation is written as the \lstinline{python3} package \lstinline{pyqcs} \cite{pyqcs}. This allows
users to quickly construct circuits, apply them to states and measure
amplitudes. Full access to the state (including intermediate states) has been
priorized over execution speed. To keep the simulation speed as high as
amplitudes. Full access to the states (including intermediate states) has been
prioritized over execution speed. To keep the simulation speed as high as
possible under these constraints some parts are implemented in \lstinline{C}.
\section{Dense State Vector Simulation}
@ -23,30 +23,29 @@ useful features when it comes to computations:
\item{The projection on the integer states is trivial.}
\item{For any qbit $j$ and $0 \le i \le 2^n-1$ the coefficient $c_i$ is part of the $\ket{1}_j$ amplitude iff
$i \& (1 << j)$ and part of the $\ket{0}_j$ amplitude otherwise.}
\item{For a qbit $j$ the coefficients $c_i$ and $c_{i \hat{ } (1 << j)}$ are the conjugated coefficients.}
\item{For a qbit $j$ the coefficients $c_i$ and $c_{i \wedge (1 << j)}$ are the conjugated coefficients.}
\end{itemize}
Where $\hat{}$ is the binary XOR, $\&$ the binary AND and $<<$ the binary
Where $\wedge$ is the binary XOR, $\&$ the binary AND and $<<$ the binary
leftshift operator.
While implementing the dense state vectors two key points were allowing
a simple and readable way to use them and simple access to the states by users
that want more information than an abstracted view could allow. To meet both
requirements the states are implemented as Python objects providing abstract
features such as normalization checking, checking for sufficient qbit number
when applying a circuit, computing overlaps with other states, a stringify
method and stored measurement results. To store the measurement results
a NumPy \lstinline{int8} array \cite{numpy_array} is used; this is called the
classical state. The Python states also have a NumPy \lstinline{cdouble} array
that stores the quantum mechanical state. Using NumPy arrays has the advantage
that access to the data is simple and safe while operations on the states can
be implemented in \lstinline{C} \cite{numpy_ufunc} providing a considerable
speedup \ref{ref:benchmark_ufunc_py}.
While implementing the dense state vectors two key points were a simple way to
use them and easy access to the underlaying data. To meet both requirements
the states are implemented as Python objects that provide abstract features such
as normalization checking, checking for sufficient qbit number when applying
a circuit, computing overlaps with other states, a stringify method and stored
measurement results. To store the measurement results a NumPy \lstinline{int8}
array \cite{numpy_array} is used; this is called the classical state. The
Python states also have a NumPy \lstinline{cdouble} array that stores the
quantum mechanical state. Using NumPy arrays has the advantage that access to
the data is simple and safe while operations on the states can be implemented
in \lstinline{C} \cite{numpy_ufunc} providing a considerable speedup
\ref{ref:benchmark_ufunc_py}.
This quantum mechanical state is the component vector in integer basis
therefore it has $2^n$ components. Storing those components is acceptable in
a range from $1$ to $30$ qbits; above this range the state requires space in
the order of $1 \mbox{ GiB}$ which is in the range of usual RAM sizes for
the order of magnitude $1 \mbox{ GiB}$ which is in the range of usual RAM sizes for
personal computers. For higher qbit numbers moving to high performance
computers and other simulators is necessary.
@ -72,7 +71,7 @@ A basic set of gates is implemented in PyQCS:
\item{Hadamard $H$ gate.}
\item{Pauli $X$ or \textit{NOT} gate.}
\item{Pauli $Z$ gate.}
\item{The $S$ phase gate.}
\item{Phase gate $S$.}
\item{$Z$ rotation $R_\phi$ gate.}
\item{Controlled $X$ gate: $CX$.}
\item{Controlled $Z$ gate: $CZ$.}
@ -98,8 +97,8 @@ new_state = circuit * state
\end{lstlisting}
The elementary gates such as $H, R_\phi, CX$ are implemented as single gate
circuits and can be constructing using the built-in generators. The generators
The elementary gates are implemented as single gate
circuits and can be constructed using the built-in generators. These generators
take the act-qbit as first argument, parameters such as the control qbit or an
angle as second argument:
@ -117,7 +116,7 @@ Out[2]: (0.7071067811865476+0j)*|0b0>
+ (0.7071067811865476+0j)*|0b11>
\end{lstlisting}
Large circuits can be constructed using the binary OR operator \lstinline{|} in
Large circuits can be built using the binary OR operator \lstinline{|} in
an analogy to the pipeline operator on many *NIX shells. As usual circuits are
read from left to right similar to pipelines on *NIX shells:
@ -141,7 +140,7 @@ Out[2]: (0.7071067811865477+0j)*|0b0>
\end{lstlisting}
%}
A quick way to generate circuits programatically is to use the \lstinline{list_to_circuit}
A quick way to generate circuits programmatically is to use the \lstinline{list_to_circuit}
function:
%\adjustbox{max width=\textwidth}{
@ -168,7 +167,7 @@ For the graphical state $(V, E, O)$ the list of vertices $V$ can be stored impli
by demanding $V = \{0, ..., n - 1\}$. This leaves two components that have to be stored:
The edges $E$ and the vertex operators $O$. Storing the vertex operators is
done using a \lstinline{uint8_t} array. Every local Clifford operator is
associated with an integer ranging from $0$ to $24$, their order is
associated with an integer ranging from $0$ to $23$. Their order is
\begin{equation}
\begin{aligned}
@ -216,20 +215,20 @@ The edges are stored in an adjacency matrix
Recalling some operations on the graph as described in
\ref{ref:dynamics_graph}, \ref{ref:meas_graph} or Lemma \ref{lemma:M_a} one
sees that it is important to efficiently access and modify the neighbourhood of
a vertex. To ensure good performance when accessing the neighbourhood while
keeping the required memory low a linked list-array hybrid is used to store
the adjacency matrix. For every vertex the neighbourhood is stored in a sorted
linked list (which is a sparse representation of a column vector) and these
adjacency lists are stored in a length $n$ array.
a vertex. Also one must take care to keep the memory required to store a state
low. To meet both requirements a linked list-array hybrid is used. For every
vertex the neighbourhood is stored in a sorted linked list (which is a sparse
representation of a column vector) and these adjacency lists are stored in
a length $n$ array.
Using this storage method all operations including searching and toggling edges
inherite their time complexity from the sorted linked list.
Using this storage method all operations - including searching and toggling edges -
inherit their time complexity from the sorted linked list.
\subsection{Operations on Graphical States}
Operations on Graphical States are divided into three classes: Local Clifford
operations, the CZ operation and measurements. The graphical states are
implemented in \lstinline{C} and are exported to python3 in the class
implemented in \lstinline{C} and are exported to \lstinline{python3} in the class
\lstinline{RawGraphState}. This class has three main methods to implement the
three classes of operations.
@ -249,7 +248,7 @@ three classes of operations.
returns either $1$ or $0$ as a measurement result.}
\end{description}
Because this way of modifying the state is rather unconvenient and might lead to many
Because this way of modifying the state is inconvenient and might lead to many
errors the \lstinline{RawGraphState} is wrapped by the pure python class\\
\lstinline{pyqcs.graph.state.GraphState}. It allows the use of circuits as
described in \ref{ref:pyqcs_circuits} and provides the method
@ -258,7 +257,7 @@ vector state.
\subsection{Pure C Implementation}
Because python tends to be rather slow \cite{benchmarkgame} and might not run on any architecture
Because python tends to be slow \cite{benchmarkgame} and might not run on any architecture
a pure \lstinline{C} implementation of the graphical simulator is also provided.
It should be seen as a reference implementation that can be extended to the needs
of the user.
@ -267,37 +266,43 @@ This implementation reads byte code from a file and executes it. The execution i
always done in three steps:
\begin{enumerate}[1]
\item{Initializing the state according the the header of the bytecode file.}
\item{Applying operations given by the bytecode to the state. This includes local
\item{Initializing the state according the header of the byte code file.}
\item{Applying operations given by the byte code to the state. This includes local
Clifford gates, $CZ$ gates and measurements (the measurement outcome is ignored).}
\item{Sampling the state according the the description given in the header of the byte code
\item{Sampling the state according the description in the header of the byte code
file and writing the sampling results to either a file or \lstinline{stdout}. }
\end{enumerate}
\section{Utilities}
To make both using the simulators more convenient and to help with using them
in as scientific or educational context several utilities have been written.
This chapter explains some of them.
The package \lstinline{pyqcs} ships with several utilities that are supposed to
make using the simulators more convenient. Some utilities are designed to help
in a scientific and educational context. This chapter explains some of them.
\subsection{Sampling and Circuit Generation}
The function \lstinline{pyqcs.sample} provides a simple way to sample from
a state. Copies of the state are made when necessary and the results are
a state. Copies of the state are made when necessary, and the results are
returned in a \lstinline{collections.Counter} object. Several qbits can be
sampled at once; they can be passed to the function either as an integer which
will be interpreted as a bit mask and the least significant bit will be sampled
will be interpreted as a bit mask, and the least significant bit will be sampled
first. When passing the qbits to sample as a list of integers the integers are
interpreted as qbit indices and are measured in the order they appear.
If the keyword argument \lstinline{keep_states} is \lstinline{True} the
sampling function will include the resulting states in the result. At the
sampling function will include the collapsed states in the result. At the
moment this works for dense vectors only. Checking for equality on graphical
states has yet to be implemented but has $NP$ computational hardness
\cite{dahlberg_ea2019}.
states is not implemented due to the computational hardness.
\cite{bouchet1991} introduced an algorithm to test whether two VOP-free graph states
are equivalent with complexity $\mathcal{O}\left(n^4\right)$.
So checking for equivalency is $c-NP$ complete because the vertex operators have
to be checked as well. It might be necessary to compute all equivalent graphical
states. \cite{dahlberg_ea2019} showed that counting equivalent VOP-free
graphical states is $\#P$ complete. Showing that two graphical states are
equivalent might considerably hard.
Writing circuits out by hand can be rather painful. The function\\
\lstinline{pyqcs.list_to_circuit} Converts a list of circuits to a circuit.
Writing circuits out by hand can be inconvenient. The function\\
\lstinline{pyqcs.list_to_circuit} converts a list of circuits to a circuit.
This is particularly helpful in combination with python's
\lstinline{listcomp}:
@ -308,41 +313,40 @@ circuit_H = list_to_circuit([H(i) for i in range(nqbits)])
The module \lstinline{pyqcs.util.random_circuits} provides the method described
in \ref{ref:performance} to generate random circuits for both graphical and
dense vector simulation. Using the module \lstinline{pyqcs.util.random_graphs}
one can generate random graphical states which is more performant than using
random circuits.
one can generate random graphical states which is faster than using random
circuits.
The function \lstinline{pyqcs.util.to_circuit.graph_state_to_circuit} converts
graphical states to circuits (mapping the $\ket{0b0..0}$ to this state).
Using these circuits the graphical state can be copied or converted to a
By utilization of these circuits the graphical state can be copied or converted to a
dense vector state. Further it is a way to optimize circuits and later run them on
other simulators. Also the circuits can be exported to \lstinline{qcircuit} code
(see below) which is a relatively readable way to represent graphical states.
(see below) which is a way to represent graphical states.
\subsection{Exporting and Flattening Circuits}
Circuits can be drawn using the \LaTeX package \lstinline{qcircuit}; all
circuits in this documents use \lstinline{qcircuit}. To visualize the circuits
built using \lstinline{pyqcs} the function\\
Circuits can be drawn with the \LaTeX package \lstinline{qcircuit}; all
circuits in this documents use \lstinline{qcircuit}. To visualize
\lstinline{pyqcs} circuits the function\\
\lstinline{pyqcs.util.to_diagram.circuit_to_diagram} can be used to generate
\lstinline{qcircuit} code that can be used in \LaTeX documents or exported to
PDFs directly. The diagrams produced by this function are not optimized and the
diagrams can be unnecessary long. Usually this can be fixed easily by editing
the produced code manually.
\lstinline{qcircuit} code. The diagrams produced by this function are not
optimized, and the diagrams can be unnecessary long. Usually this can be fixed
easily by editing the resulting code manually.
The circuits constructed using the \lstinline{|} operator have a tree structure
which is rather unconvenient when optimizing circuits or exporting them.
which is rather inconvenient when optimizing circuits or exporting them.
The function \\
\lstinline{pyqcs.util.flatten.flatten} converts a circuit
to a list of single gate circuits that can be analyzed or exported easily.
to a list of single gate circuits that can be simply analyzed or exported.
\section{Performance}
\label{ref:performance}
To test the performance and compare it to the dense vector simulator the python
module is used. Although the pure \lstinline{C} implementation has potential
for better performance the python module is better comparable to the dense
vector simulator which is a python module as well.
Testing the performance and comparing the graphical with the dense vector
simulator is done with the python module. Although the pure \lstinline{C}
implementation has potential for better performance the python module is better
comparable to the dense vector simulator which is a python module as well.
For performance tests (and for tests against the dense vector simulator) random
circuits are used. Length $m$ circuits are generated from the probability space
@ -350,14 +354,11 @@ circuits are used. Length $m$ circuits are generated from the probability space
\begin{equation}
\Omega = \left(\{1, ..., 4n\} \otimes \{1, ..., n-1\} \otimes [0, 2\pi)\right)^{\otimes m}
\end{equation}
with the uniform distribution. The continous part $[0, 2\pi)$ is unused when
generating random circuits for the graphical simulator; when generating random
circuits for dense vector simulations this is the argument $\phi$ of the
$R_\phi$ gate.
For $m=1$ an outcome is mapped to a gate using
\end{equation}
with the uniform distribution. The continuous part $[0, 2\pi)$ is ignored when
generating random circuits for the graphical simulator; in order to generate
random circuits for dense vector simulations this is used as the argument $\phi$ of the
$R_\phi$ gate. For $m=1$ an outcome is mapped to a gate where
\begin{equation}
\begin{aligned}
@ -378,7 +379,7 @@ Using this method circuits are generated and applied both to graphical and
dense vector states and the time required to execute the operations
\cite{timeit} is measured. The resulting graph can be seen in
Figure \ref{fig:scaling_qbits_linear} and Figure \ref{fig:scaling_qbits_log}.
Note that in both cases the length of the circuits have been scaled linearely
Note that in both cases the length of the circuits have been scaled linearly
with the amount of qbits and the measured time was divided by the number of
qbits:
@ -403,10 +404,10 @@ qbits:
\label{fig:scaling_qbits_log}
\end{figure}
The reason for this scaling will be clear later; one can observe that the
performance of the graphical simulator increases in some cases with growing
number of qbits when the circuit length is constant. The code used to generate the
data for these plots can be found in \ref{ref:code_benchmarks}.
The reason for this scaling will be clear later. From simulation data one can
observe that the performance of the graphical simulator increases in some cases
with growing number of qbits when the circuit length is constant. The code used
to generate the data for these plots can be found in \ref{ref:code_benchmarks}.
As described by \cite{andersbriegel2005} the graphical simulator is exponentially
faster than the dense vector simulator. According to \cite{andersbriegel2005} it
@ -414,11 +415,12 @@ is considerably faster than a simulator using the straight forward approach simu
the stabilizer tableaux like CHP \cite{CHP} with an average runtime behaviour
of $\mathcal{O}\left(n\log(n)\right)$ instead of $\mathcal{O}\left(n^2\right)$.
One should be aware that the gate execution time (the time required to apply a gate
to the state) highly depends on the state it is applied to. For the dense vector
simulator and CHP this is not true: Gate execution time is constant for all gates
and states. Because the graphical simulator has to toggle neighbourhoods the
gate execution time of the $CZ$ gate varies greatly. The plot Figure \ref{fig:scaling_circuits_linear}
One should be aware that the gate execution time (the time required to apply
a gate to the state) highly depends on the state it is applied to. For the
dense vector simulator and CHP this is not true: Gate execution time is
constant for all gates and states. Because the graphical simulator has to
toggle neighbourhoods the gate execution time of the $CZ$ gate varies
significantly. The plot Figure \ref{fig:scaling_circuits_linear}
shows the circuit execution time for two different numbers of qbits. One can observe three
regimes:
@ -430,11 +432,11 @@ regimes:
\end{figure}
\begin{description}
\item[Low-Linear Regime] {Here the circuit execution time scales approximately linearely
\item[Low-Linear Regime] {\textit{(Ca. $0-10N_q$ gates)} Here the circuit execution time scales approximately linear
with the number of gates in the circuit (i.e. the $CZ$ gate execution time is approximately constant).
}
\item[Intermediate Regime]{The circuit execution time has a nonlinear dependence on the circuit length.}
\item[High-Linear Regime]{This regime shows a linear dependence on the circuit length; the slope is
\item[Intermediate Regime]{\textit{(Ca. $10N_q-20N_q$ gates)} The circuit execution time has a nonlinear dependence on the circuit length.}
\item[High-Linear Regime]{\textit{(Above ca. $20N_q$ gates)} This regime shows a linear dependence on the circuit length; the slope is
higher than in the low-linear regime.}
\end{description}
@ -445,6 +447,19 @@ regimes:
\label{fig:scaling_circuits_measurements_linear}
\end{figure}
These three regimes can be explained when considering the graphical states that
typical live in these regimes. With increased circuit length the amount of
edges increases which makes toggling neighbourhoods harder. Graphs from the
low-linear, intermediate and high-linear regime can be seen in Figure
\ref{fig:graph_low_linear_regime}, Figure \ref{fig:graph_intermediate_regime}
and Figure \ref{fig:graph_high_linear_regime}. Due to the great amount of edges
in the intermediate and high-linear regime the pictures show a window of the
actual graph. The full images are in \ref{ref:complete_graphs}. Further the
regimes are not clearly visible for $n>30$ qbits therefore choosing smaller graphs is
not possible. The code that was used to generate these images can be found
in \ref{ref:code_example_graphs}.
\begin{figure}
\centering
\includegraphics[width=\linewidth]{graphics/graph_low_linear_regime.png}
@ -466,35 +481,18 @@ regimes:
\label{fig:graph_high_linear_regime}
\end{figure}
These two regimes can be explained when considering the graphical states that
typical live in these regimes. With increased circuit length the amount of
edges increases which makes toggling neighbourhoods harder. Graphs from the
low-linear, intermediate and high-linear regime can be seen in Figure
\ref{fig:graph_low_linear_regime}, Figure \ref{fig:graph_intermediate_regime}
and Figure \ref{fig:graph_high_linear_regime}. Due to the great amount of edges
in the intermediate and high-linear regime the pictures show a window of the
actual graph. The full images are in \ref{ref:complete_graphs}. Further the
regimes are not clearly visible for $n>30$ qbits so choosing smaller graphs is
not possible. The code that was used to generate these images can be found
in \ref{ref:code_example_graphs}.
The Figure \ref{fig:scaling_circuits_measurements_linear} brings more substance
to this interpretation. In this simulation the Pauli $X$ gate has been replaced
by the measurement gate $M$, .i.e. in every gate drawn from the probability
space a qbit is measured with probability $\frac{1}{4}$. As described in
\cite{hein_eisert_briegel2008} the Schmidt measure for entropy is bounded from
above by Pauli persistency, i.e. the minimal amount of Pauli measurements
required to disentangle a state. This Pauli persistency is closely related to
the amount (and structure of) vertices in the graph
\cite{hein_eisert_briegel2008}. In particular Pauli measurements decrease the
entanglement (and the amount of edges) in a state
space a qbit is measured with probability $\frac{1}{4}$. Pauli measurements
decrease the entanglement (and the amount of edges) in a state
\cite{hein_eisert_briegel2008}\cite{li_chen_fisher2019}. The frequent
measurements in the simulation therefore keeps the amount of edges low thus
preventing a transition from the low linear regime to the intermediate regime.
Because states with more qbits reach the intermediate regime at higher circuit
lengths it is important to account for this virtual performance boost when
lengths it is important to compensate this virtual performance boost when
comparing with other simulation methods. This explains why the circuit length
in Figure \ref{fig:scaling_qbits_linear} had to be scaled with the qbit number.
@ -502,15 +500,15 @@ in Figure \ref{fig:scaling_qbits_linear} had to be scaled with the qbit number.
Although the simulator(s) are in a working state and have been tested there is
still some work that can be done. A noise model helping to teach and analyze
noisy execution is one particularly interesting piece of work. To allow a user
to execute circuits on other machines, including both real hardware and
simulators, a module that exports circuits to OpenQASM \cite{openqasm} seems
useful.
noisy execution would be an interesting improvement to implement. In order to
allow a user to execute circuits on other machines, including both real
hardware and simulators, a module that exports circuits to OpenQASM
\cite{openqasm} seems useful.
The current implementation of some graphical operations can be optimized. While
clearing VOPs as described in \ref{ref:dynamics_graph} the neighbourhood of
a vertex is toggled for every $L_a$ transformation. This is the most straight
forward implementation but often the $L_a$ transformation is performed several
forward implementation, but often the $L_a$ transformation is performed several
times on the same vertex. The neighbourhood would have to be toggled either
once or not at all depending on whether the number of $L_a$ transformations is
odd or even.

View File

@ -3,7 +3,7 @@
Quantum computing has been a rapidly growing field over the last years with
many companies and institutions working on building and using quantum computers
\cite{ibmq}\cite{intelqc}\cite{microsoftqc}\cite{dwavesys}\cite{lrzqc}\cite{heise25_18}.
\cite{ibmq}\cite{intelqc}\cite{microsoftqc}\cite{dwavesys}.
One important topic in this research is quantum error correction
\cite{nielsen_chuang_2010}\cite{gottesman2009}\cite{gottesman1997}\cite{shor1995}
that will allow the execution of arbitrarily long quantum circuits \cite{nielsen_chuang_2010}.

View File

@ -43,7 +43,7 @@ with
Note that $X = HZH$ and $Z = R_{\pi}$, so the set of $H, R_\phi$ is sufficient.
Further note that the basis vectors are chosen s.t. $Z\ket{0} = +\ket{0}$ and $Z\ket{1} = -\ket{1}$;
transforming to the other Pauli eigenstates is done using $H$ and $SH$
transforming to the other Pauli eigenstates is done using $H$ and $S$
\begin{equation}
S := R_{\frac{\pi}{2}} = \left(\begin{array}{cc} 1 & 0 \\ 0 & i\end{array}\right)
@ -148,10 +148,10 @@ For a single-qbit gate $U$ and a qbit $j = 0, 1, ..., n - 1$
In particular for $X, Z$
\begin{equation}\label{eq:CX_pr}
CX(i, j) = \ket{0}\bra{0}_j\otimes I_i + \ket{1}\bra{1}_j \otimes X_i
CX_{i, j} = \ket{0}\bra{0}_j\otimes I_i + \ket{1}\bra{1}_j \otimes X_i
\end{equation}
\begin{equation}\label{eq:CZ_pr}
CZ(i, j) = \ket{0}\bra{0}_j\otimes I_i + \ket{1}\bra{1}_j \otimes Z_i .
CZ_{i, j} = \ket{0}\bra{0}_j\otimes I_i + \ket{1}\bra{1}_j \otimes Z_i .
\end{equation}
This follows the definition given in \cite{barenco_ea_1995}.
@ -283,7 +283,8 @@ Where $T\ket{\varphi} = \exp(2\pi i\varphi) \ket{\varphi}$ and the measurement
result $\tilde{\varphi} = \frac{x}{2^n}$ is an estimation for $\varphi$. If
a success rate of $1-\epsilon$ and an accuracy of $| \varphi - \tilde{\varphi}
| < 2^{-m}$ is wanted, then $N = m + \log_2(2 + \frac{1}{2\epsilon})$ qbits are
required \cite{nielsen_chuang_2010}\cite{lehner2019}.
required \cite{nielsen_chuang_2010}.
The gate $FT^\dagger$ is the inverse quantum fourier transform as described in \cite{nielsen_chuang_2010}.
%Another possible way to use quantum computers in physics is to simulate a system's
%time evolution using the transfer matrix. By mapping an interesting system to

View File

@ -98,7 +98,7 @@ group.
$g_i$ and $m$ is the smallest integer for which these statements hold.
\end{definition}
From now on the generators $\langle S^{(i)} \rangle_{i=0, ..., n-1}$ will be
From now on the generators $\langle S^{(i)} \rangle_{i}$ will be
used as the required properties of a set of stabilizers that can be studied on
its generators.
@ -552,14 +552,14 @@ Therefore the associated graph is changed as given in the third equation.
\label{ref:sec_g_states}
The definition of a VOP-free graph state above raises an obvious question: Can
any stabilizer state be described using just a graph? The answer is straight
forward: No. The most simple cases are the single qbit states $\ket{0},\ket{1}$
and $\ket{+_Y}, \ket{-_Y}$. But there is an extension to the VOP-free graph
states that allows the representation of an arbitrary stabilizer state. The
proof that indeed any state can be represented is purely constructive. As seen
in Theorem \ref{thm:clifford_group_approx} any $c \in C_n$ can be constructed
from $CZ$ and $C_L$. In the following discussion it will become clear that both
$C_L$ and $CZ$ can be applied to a general graph state
any stabilizer state be described using just a graph? The answer is no. The
most simple cases are the single qbit states $\ket{0},\ket{1}$ and $\ket{+_Y},
\ket{-_Y}$. But there is an extension to the VOP-free graph states that allows
the representation of an arbitrary stabilizer state. The proof that any
state can be represented is purely constructive. As seen in Theorem
\ref{thm:clifford_group_approx} any $c \in C_n$ can be constructed from $CZ$
and $C_L$. In the following discussion it will become clear that both $C_L$ and
$CZ$ can be applied to a general graph state
\footnote{
One can show that any stabilizer state is local Clifford equivalent to
a VOP-free graph state, i.e. only tensor products of $C_L$ matrices are
@ -586,9 +586,9 @@ $C_L$ and $CZ$ can be applied to a general graph state
The notation in \cite{andersbriegel2005} is different. Instead of using $(V, E, O)$
to represent any stabilizer $(V, E)$ is used to represent what is called a VOP-free
graph state in this paper. Then the state $\ket{\bar{G}}$ is extended with local Clifford
gates $c_1, ..., c_n$ to an arbitrary stabilizer state. The state is then denoted as
gates $c_1, ..., c_n$ to an arbitrary stabilizer state. The full state is denoted as
$\ket{\bar{G}; (c_1, ..., c_n)} \equiv \ket{\bar{G}; \vec{c}}$. This paper prefers
the notation using $(V, E, O)$ as it both emphasizes the use of stabilizers and is closer
the notation $(V, E, O)$ as it both emphasizes the use of stabilizers and is closer
to the representation used in the simulator.
}.
\end{definition}
@ -603,11 +603,12 @@ immediately:
The great advantage of this representation of a stabilizer state is its space
requirement: Instead of storing $n^2$ Pauli matrices only some vertices (which
often are implicit), the edges and some vertex operators ($n$ matrices) have to
be stored. The following theorem will improve this even further: instead of $n$
be stored. Theorem \ref{thm:cl24} will improve this even further: Instead of $n$
matrices it is sufficient to store $n$ integers representing the vertex
operators:
operators.
\begin{theorem}
\label{thm:cl24}
$C_L$ has $24$ degrees of freedom disregarding a global phase \cite{andersbriegel2005}.
\end{theorem}
\begin{proof} It is clear that $\forall a \in C_L$ a is a group isomorphism $P
@ -643,9 +644,9 @@ operation on graph states \cite{andersbriegel2005}.
So far the graphical representation of stabilizer states is just another way to
store basically a stabilizer tableaux that might require less memory than the
tableaux used in CHP \cite{CHP}. The true power of this formalism is seen when
tableaux used in CHP \cite{CHP}. The power of this formalism can be seen by
studying its dynamics. The simplest case is a local Clifford operator $c_j$
acting on a qbit $j$: The stabilizers are changed to $\langle c_j S^{(i)}
acting on a qbit $j$ changing the stabilizers to $\langle c_j S^{(i)}
c_j^\dagger\rangle_i$. Using the definition of the graphical representation one
sees that just the vertex operators are changed and the new vertex operators
are given by
@ -658,9 +659,9 @@ are given by
\end{equation}
The action of a $CZ$ gate on the state $(V, E, O)$ is in most cases less
trivial. Let $a \neq b$ be two qbits, now consider the action of $CZ_{a,b}$ on
trivial. Let $a \neq b$ be two qbits. Consider the action of $CZ_{a,b}$ on
$(V, E, O)$. The cases given here follow the implementation of a $CZ$
application in \cite{pyqcs}, the respective paragraphs from
application in \cite{pyqcs}. The respective paragraphs from
\cite{andersbriegel2005} are given in italic. Most of the discussion follows
the one given in \cite{andersbriegel2005} closely.
@ -681,7 +682,7 @@ options with and without an edge between the qbits and $24$ Clifford operators
on each vertex.
All those states and the resulting state after a $CZ$ application can be
computed which leads to another interesting result that will be useful later:
computed which leads to another interesting insight that will be useful later:
If one vertex has the vertex operator $I$ the resulting state can be chosen
such that at least one of the vertex operators is $I$ again and in particular
the identity on the vertex can be preserved under the application of a $CZ$.
@ -692,7 +693,7 @@ has non-operand (i.e. neighbours that are neither $a$ nor $b$) neighbours. In
this case one can try to clear the vertex operators which will succeed for at
least one qbit.
The transformation given in Lemma \ref{lemma:M_a} is used to "clear" the vertex
The transformation given in Lemma \ref{lemma:M_a} is used to clear the vertex
operators. Recalling that the transformation $M_j$ toggles the neighbourhood of
vertex $j$ gives substance to the following theorem:
@ -729,7 +730,7 @@ steps:
}
\end{enumerate}
This algorithm has the important properties that if the algorithm succeeds $o_a
This algorithm has the important properties that if it succeeds $o_a
= I$ and $o_b$ has picked up powers of $\sqrt{iZ}^\dagger$. If $b$ has
non-operand neighbours after clearing the vertex operators on $a$, then the
vertex operators on $b$ can be cleared using the same algorithm which gives
@ -750,28 +751,29 @@ non-operand neighbours and $b$ does not. Now the state $\ket{G}$ has the form
\begin{aligned}
\ket{G} &= \left(\prod\limits_{o_i \in O} o_i\right) \left(\prod\limits_{\{i,j\} \in E} CZ_{i,j}\right) \ket{+}_n \\
&= \left(\prod\limits_{o_i \in O \setminus \{o_b\}} o_i \right) \left(\prod\limits_{\{i,j\} \in E \setminus \{a,b\}} CZ_{i,j}\right) o_b (CZ_{a,b})^s \ket{+}_n \\
&= \left(\prod\limits_{o_i \in O \setminus \{o_b\}} o_i \right) \left(\prod\limits_{\{i,j\} \in E \setminus \{a,b\}} CZ_{i,j}\right) \ket{+}_{n-2} \otimes \left(o_b (CZ_{a,b})^s \ket{+}_2\right) .\\
&= \left(\prod\limits_{o_i \in O \setminus \{o_b\}} o_i \right) \left(\prod\limits_{\{i,j\} \in E \setminus \{a,b\}} CZ_{i,j}\right) \ket{+}_{n-2} \otimes \left(o_b (CZ_{a,b})^s \ket{+}_2\right).\\
\end{aligned}
\end{equation}
As $o_b$ commutes with all operators but $CZ_{a,b}$ and $s \in \{0, 1\}$
indicates whether there is an edge between $a$ and $b$.
indicates whether there is an edge between $a$ and $b$. Applying the $CZ$
gives
\begin{equation}
\begin{aligned}
CZ_{a,b}\ket{G} &= CZ_{a,b}\left(\prod\limits_{o_i \in O \setminus \{o_b\}} o_i \right) \left(\prod\limits_{\{i,j\} \in E \setminus \{a,b\}} CZ_{i,j}\right) o_b (CZ_{a,b})^s \ket{+} \\
&= \left(\prod\limits_{o_i \in O \setminus \{o_b\}} o_i \right) \left(\prod\limits_{\{i,j\} \in E \setminus \{a,b\}} CZ_{i,j}\right) \ket{+}_{n-2} \otimes \left(CZ_{a,b} o_b (CZ_{a,b})^s \ket{+}_2\right) \\
&= \left(\prod\limits_{o_i \in O \setminus \{o_b\}} o_i \right) \left(\prod\limits_{\{i,j\} \in E \setminus \{a,b\}} CZ_{i,j}\right) \ket{+}_{n-2} \otimes \left(CZ_{a,b} o_b (CZ_{a,b})^s \ket{+}_2\right). \\
\end{aligned}
\end{equation}
This allows to re-use the method in Case 2 to apply the $CZ$ while keeping the
This allows to reuse the method in Case 2 to apply the $CZ$ while keeping the
$o_a = I$.
As it has been shown how both $CZ$ and $C_L$ act on a graph state $\ket{G}$
and the resulting state is a graph state as well this proofs constructively
that the graphical representation of a stabilizer state is indeed able to
represent any stabilizer state. If one wants to do computations using this
formalism it is however also necessary to perform measurements.
that the graphical representation of a stabilizer state is able to represent
any stabilizer state. If one wants to do computations using this formalism it
is also necessary to perform measurements.
\subsection{Measurements on Graph States}
\label{ref:meas_graph}
@ -781,7 +783,7 @@ the graph after a measurement is described in \cite{hein_eisert_briegel2008}.
Recalling \ref{ref:meas_stab} it is clear that one has to compute the
commutator of the observable $g_a = Z_a$ with the stabilizers to get the
probability amplitudes which is a quite expensive computation in theory. It is
probability amplitudes which is a expensive computation in theory. It is
possible to simplify the problem by pulling the observable behind the vertex
operators. For this consider the projector $P_{a,s} = \frac{I + (-1)^sZ_a}{2}$
@ -807,11 +809,11 @@ projector as $o_a$ is a Clifford operator
\end{aligned}
\end{equation}
Where $\tilde{g}_a \in \{\pm X_a, \pm Y_a, \pm Z_a\}$. Therefore, it is
enough to study the measurements of any Pauli operator on the vertex operator
free graph states. The commutators of the observable with the $K_G^{(i)}$ are
quite easy to compute. Note that Pauli matrices either commute or anticommute
and it is easier to list the operators that anticommute:
Where $\tilde{g}_a \in \{\pm X_a, \pm Y_a, \pm Z_a\}$. Therefore, it is enough
to study the measurements of any Pauli operator on the VOP-free graph states.
The commutators of the observable with the $K_G^{(i)}$ are easy to compute.
Note that Pauli matrices either commute or anticommute and it is simpler to
list the operators that anticommute:
\begin{equation}
\begin{aligned}
@ -826,25 +828,26 @@ $\tilde{g}_a = X_a (-X_a)$ is measured the result $s=0(1)$ is obtained with
probability $1$ and $(V, E, O)$ is unchanged. In any other case the results
$s=1$ and $s=0$ have probability $\frac{1}{2}$ and both graph and vertex
operators have to be updated. Further it is clear that measurements of
$-\tilde{g}_a$ and $\tilde{g}_a$ are related by just inverting the result $s$.
$-\tilde{g}_a$ and $\tilde{g}_a$ are related by inverting the result $s$.
The calculations to obtain the transformation on graph and vertex operators are
lengthy and follow the scheme of Lemma \ref{lemma:M_a}. \cite[Section
IV]{hein_eisert_briegel2008} also contains the steps required to obtain the
following results
following results:
\begin{equation}
\begin{aligned}
U_{Z,s} &= \left(\prod\limits_{b \in n_a} Z_b^s\right) X_a^s H_a \\
U_{Y,s} &= \prod\limits_{b \in n_a} \sqrt{(-1)^{1-s} iZ_b} \sqrt{(-1)^{1-s} iZ_a}.\\
U_{Y,s} &= \prod\limits_{b \in n_a} \sqrt{(-1)^{1-s} iZ_b} \sqrt{(-1)^{1-s} iZ_a}\\
\end{aligned}
\end{equation}
These transformations split it two parts: the first is a result of Lemma
These transformations split it in two parts: the first is a result of Lemma
\ref{lemma:stab_measurement}. The second part makes sure that the qbit $a$ is
diagonal in measured observable and has the correct eigenvalue. When comparing
with Lemma \ref{lemma:stab_measurement} in both cases $Y,Z$ the anticommuting
diagonal in the measured observable and has the correct eigenvalue. When comparing
with Lemma \ref{lemma:stab_measurement} in both cases $Y$ and $Z$ the anticommuting
stabilizer $K_G^{(a)}$ is chosen. The graph is changed according to
\footnote{$n_a \otimes n_a$ should be read as $\{\{i,j\} | i,j \in n_a, i \neq j\}$.}
\begin{equation}
\begin{aligned}
@ -854,7 +857,7 @@ stabilizer $K_G^{(a)}$ is chosen. The graph is changed according to
\end{equation}
For $g_a = X_a$ one has to choose a $b \in n_a$ and the transformations are
For $g_a = X_a$ one has to choose a neighbour $b \in n_a$ and the transformations are
\begin{equation}
\begin{aligned}

View File

@ -190,11 +190,13 @@
urldate={19.09.2019},
title={IBM Q - What is quantum computing?},
author={IBM},
note={https://www.ibm.com/quantum-computing/learn/what-is-quantum-computing/},
year=2019
}
@online{
intelqc,
url={https://newsroom.intel.com/press-kits/quantum-computing/\#gs.2s0dux},
note={https://newsroom.intel.com/press-kits/quantum-computing/\#gs.2s0dux},
urldate={19.09.2019},
title={Intel Press Kit: Quantum Computing},
author={Intel},
@ -203,6 +205,7 @@
@online{
microsoftqc,
url={https://www.microsoft.com/en-us/quantum/default.aspx},
note={https://www.microsoft.com/en-us/quantum/default.aspx},
urldate={19.09.2019},
title={Quantum Computing | Microsoft},
author={Microsoft},
@ -211,6 +214,7 @@
@online{
dwavesys,
url={https://www.dwavesys.com/quantum-computing},
note={https://www.dwavesys.com/quantum-computing},
urldate={19.09.2019},
title={Quantum Computing | D-Wave Systems},
author={D-Wave Systems Inc}
@ -218,6 +222,7 @@
@online{
lrzqc,
url={https://www.lrz.de/wir/newsletter/2019-08/\#LRZ_bereit_fuer_bayerische_Quantechnologie},
note={https://www.lrz.de/wir/newsletter/2019-08/\#LRZ_bereit_fuer_bayerische_Quantechnologie},
urldate={19.09.2019},
title={LRZ-Newsletter Nr. 08/2019 vom 01.08.2019},
author={S. Vieser},
@ -226,6 +231,7 @@
@online{
heise25_18,
url={https://www.heise.de/select/ct/2018/25/1544250249368810},
note={https://www.heise.de/select/ct/2018/25/1544250249368810},
urldate={19.09.2019},
title={Europa entfesselt Quanten-Power},
author={Arne Grävemeyer},
@ -287,3 +293,10 @@
title={The Computer Language Benchmarks Game},
note={https://benchmarksgame-team.pages.debian.net/benchmarksgame/}
}
@article{
bouchet1991,
author={Andrk Bouchet},
title={Recognizing locally equivalent graphs},
year=1991,
note={https://pdf.sciencedirectassets.com/271536/1-s2.0-S0012365X00X02166/1-s2.0-0012365X9390357Y/main.pdf}
}

View File

@ -90,11 +90,12 @@ Supervised by Prof. Dr. Christoph Lehner}
\newpage
\textbf{Erklärung zur Anfertigung:}\\
Ich habe die Arbeit selbständig verfasst, keine anderen als die angegebenen Quellen und Hilfsmittel be-
nutzt und bisher keiner anderen Prüfungsbehörde vorgelegt. Außerdem bestätige ich hiermit, dass die
vorgelegten Druckexemplare und die vorgelegte elektronische Version der Arbeit identisch sind, dass ich
über wissenschaftlich korrektes Arbeiten und Zitieren aufgeklärt wurde und dass ich von den in § 24 Abs.
5 vorgesehenen Rechtsfolgen Kenntnis habe.
Ich habe die Arbeit selbständig verfasst, keine anderen als die angegebenen
Quellen und Hilfsmittel benutzt und bisher keiner anderen Prüfungsbehörde
vorgelegt. Außerdem bestätige ich hiermit, dass die vorgelegten Druckexemplare
und die vorgelegte elektronische Version der Arbeit identisch sind, dass ich
über wissenschaftlich korrektes Arbeiten und Zitieren aufgeklärt wurde und dass
ich von den in § 24 Abs. 5 vorgesehenen Rechtsfolgen Kenntnis habe.
\\
\\
Unterschrift: