From 354d8c7357f18461a6f5464d32f0b802018c11ce Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 10:13:18 +0100 Subject: [PATCH 01/22] First modifications to chapter 3 --- data.Rmd | 1177 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 928 insertions(+), 249 deletions(-) diff --git a/data.Rmd b/data.Rmd index b3f122b..127299b 100644 --- a/data.Rmd +++ b/data.Rmd @@ -1,256 +1,497 @@ -# Classical data in quantum computers {#chap-classical-data-quantum-computers} +# Classical data on quantum computers {#chap-classical-data-quantum-computers} -```{r, echo=FALSE, fig.align = 'center', fig.width=10, fig.cap="This section is heavily work in progress. In this [TODO list](https://github.com/Scinawa/quantumalgorithms.org/issues/70) you can see the improvements of this Chapter in the following months."} -knitr::include_graphics("images/wip.png") -``` +
Contributors: Alessandro Luongo, Jun Hao Hue, Francesco Ghisoni, João F. Doriguello
+
-In this chapter we will discuss the problem of manipulating classical information (numbers, vectors, matrices, and functions) into our quantum computer. More precisely, after describing possible ways of storing information into quantum states, we discuss the problem of loading and retrieving data from quantum computer. In other words, we are just studying the I/O interface of our quantum computer. +
Version: 0.5.1
+
-We size the opportunity of discussing classical data in quantum computers to step back, and show you [all the possible combinations](https://indico.desy.de/event/26672/contributions/60982/attachments/39512/49045/qml_maria.pdf) of quantum and classical data and algorithms. This book is mostly interested in classical and quantum data processed by quantum computer. What is quantum data? ( Actually, no one knows, but it is often something that you hear at conferences. No.. I am kidding!) Quantum data is supposed to be quantum states that is generated by a generic quantum process, which could be another quantum circuit, a quantum channel (i.e. communication from quantum internet) or any density matrix that you receive from experiments. + + + -```{r, echo=FALSE, fig.width=10, fig.cap="We can have four combinations between classica and quantum data, and classical and quantum computers. As you can imagine, in these pages we will focus on quantum algorithms on classical data, with some detours on quantum algorithms on quantum data. "} -knitr::include_graphics("algpseudocode/typesofdata-1.png") -``` + + + + + + + + -## Representing data in quantum computers + -We begin our journey into quantum algorithms by understanding how we can represent and store data as a quantum state. This problem is of paramount importance, because knowing what is the best way of encoding data in a quantum computer might pave the way for intuitions in solving our problems. On the contrary, using the wrong encoding might prevent you from reasoning about the right algorithm design, and obtaining the desired advantages in the implementation of your algorithm. As it has been well-said: *"In order to use the strengths of quantum mechanics without being confined by classical ideas of data encoding, finding "genuinely quantum" ways of representing and extracting information could become vital for the future of quantum machine learning".* [@schuld2015introduction]. There are two fundamental ways of encoding information in a quantum state: the *amplitude* encoding and the *binary* encoding. In amplitude encoding we store your data in the amplitudes of a quantum state, therefore we can encode $n$ real values (or better, some fixed point precision approximation of a real number) using $O(\lceil \log n\rceil )$ qubits. In the binary (or digital) encoding you store a bit in the state of a qubit. Each encoding allows to process the data in different ways, unlocking different possibilities. As tacit convention that is used in literature - and throughout this book - we often use Greek letters inside kets to represent generically quantum states $\ket{\psi}, \ket{\phi}, \ket{\varphi}$, etc..., and use Latin letters to represent quantum registers holding classical data interpreted as bitstrings. The precision that we can use for specifying the *amplitude* of a quantum state might be limited - in practice - by the precision of our quantum computer in manipulating quantum states (i.e. development in techniques in quantum metrology and sensing). Techniques that use a certain precision in the amplitude of a state might suffer of initial technical limitations of the hardware. The precision in the manipulation could be measured, for instance, by the fidelity, but discussing this subject is out of scope for this work. -### Numbers and quantum arithmetics {#sec:numbers} +In this chapter discuss how to represent and load classically available data on a quantum computer. +First, we describe how to represent data, which reduces to understanding the possible ways of storing information in quantum states. Then, we introduce the quantum memory model of computation, which is the model that we use to load data (which we assume to know classically) into a quantum computer. We finally look at the problem of retrieving data from a quantum computer, discussing the complexity of the problem. The main takeaway from this chapter is the understanding of the tools that are often used at the very start and very end of many quantum algorithms, which will set us up to understanding quantum algorithms in future chapters. This chapter can be tought as the study of the I/O interface of our quantum computer. -Number can be stored as binary encoding: each bit of a number is encoded in the state of a single qubit. Let's start with the most simple scalar: an integer. Let $x \in \mathbb{N}$. To represent it on a quantum computer, we consider the binary expansion of $x$ as a list of $m$ bits, and we set the state of the $i$-th qubit as the value of the $i$-th bit of $x$: +## Representing data in quantum computers{#sec:representing-data} + + +We'll begin our journey into quantum algorithms by understanding how we can represent and store data as a quantum state. Data plays a key role and is at the heart of most modern algorithms and knowing the best way to encode it on a quantum computer might pave the way for intuitions in solving problems, an essential step towards quantum advantage (as noted also in [@schuld2015introduction]). + +There are various ways to achieve this task. Some are borrowed from classical computation, such as the *binary* encoding, which consist in representing encoding boolean strings of length $n$ using $n$ qubits, while some leverage quantum properties, such as the *amplitude* encoding, which consits in representing vectors as linear combination of computational basis. We note that some of the presented schemes depend heavily on the accuracy of the available quantum computers in manipulating quantum states (i.e. developments in metrology and sensing). For example, techniques that rely on precise amplitudes of a state will be hindered by the current noisy hardware, or incour in high overhead of the quantum error correction. Considerations on the practical feasibility of an encoding technique are out of scope for this book. + +### Binary encoding {#sec:binary-encoding} + +The first method is a way to represent natural numbers on a quantum computer by using the binary expansion of the number to determine the state of a sequence of qubits. Each qubit is set to either the state $\ket{0}$ or $\ket{1}$, corresponding to each bit in the binary representation of the number. To represent a natural number $x \in \mathbb{N}$ on a quantum computer, we consider the binary expansion of $x$ as a list of $m$ bits, and we set the state of the $i^{th}$ qubit as the value of the $i^{th}$ bit of $x$: \begin{equation} -\ket{x} = \bigotimes_{i=0}^{m} \ket{x_i} +\ket{x} = \bigotimes_{i=0}^{m} \ket{x_i}. +(\#eq:binary-encoding) \end{equation} -Eventually, we can use one more qubit for the sign. In most of the cases, we want to work also with non-integer numbers. Real numbers can be approximated with decimal numbers with a certain bits of precision. For this, we need a bit to store the sign, some bits to store the integer part, and some other bits to store the decimal part. This is more precisely stated in the following definition. - +When extending this definition to signed integers we can, for example, use an additional qubit to store the sign of $x \in \mathbb{Z}$. Another possibility, is to represent signed integer using $2$s complement. This is actually the representation of choice for classical and quantum arithmetic [@luongo2024measurement]. For real numbers we consider that, as on classical computers, $x \in \mathbb{R}$ can be approximated with binary representation up to a certain precision. As before, we need a bit to store the sign, some bits to store the integer part, and some bits to store the fractional part. This is more precisely stated in the following definition, which is a possible way to represent number with fixed precision. (ref:rebentrost2021quantum) [@rebentrost2021quantum] ```{definition, fixed-point-encoding, name="Fixed-point encoding of real numbers (ref:rebentrost2021quantum)"} -Let $c_1,c_2$ be positive integers, and $a\in\{0,1\}^{c_1}$, $b \in \{0,1\}^{c_2}$, and $s \in \{0,1\}$ be bit strings. Define the rational number as: +Let $c_1,c_2$ be positive integers, and $a\in\{0,1\}^{c_1}$, $b \in \{0,1\}^{c_2}$, and $s \in \{0,1\}$ be bit strings. Define the rational number as \begin{equation} \mathcal{Q}(a,b,s):= (-1)^s \left(2^{c_1-1}a_{c_1}+ \dots + 2a_2 + a_1 + \frac{1}{2}b_1 + \dots + \frac{1}{2^{c_2}}b_{c_2} \right) \in [-R,R], \end{equation} -where $R := 2^{c_1}-2^{-c_2}$. If $c_1,c_2$ are clear from the context, we can use the shorthand notation for a number $z:=(a,b,s)$ and write $\mathcal{Q}(z)$ instead of $\mathcal{Q}(a,b,s)$. Given an $n$-dimensional vector $v \in (\{0,1\}^{c_1} \times \{0,1\}^{c_2} \times \{0,1\})^n$ -the notation $\mathcal{Q}(v)$ means an $n$-dimensional vector whose $j$-th component is $\mathcal{Q}(v_j)$, for $j \in[n]$. +where $R= 2^{c_1}-2^{-c_2}$. ``` -It might seem complicated, but it is really the (almost) only thing that a reasonable person might come up with when expressing numbers as (qu)bits with fixed-point precision. In most of the algorithms we implicitly assume this (or equivalent) models. Stating clearly how to express numbers on a quantum computer as fixed point precision is important: we want to work a model where we can represent numbers with enough precision so that numerical errors in the computation are negligible and will not impact the final output of our algorithm. The choice of values for $c_1$ and $c_2$ in the previous definition depends on the problem and algorithm. For the purposes of optimizing the quantum circuit, these constants can be changed dynamically in various steps of the computation (for instance, if at some point we need to work with numbers between $0$ and $1$ we can neglect the $c_1$ bits needed to represent the integer part of a number). While analyzing how error propagates and accumulates throughout the operations in the quantum circuit is essential to ensure a correct final result, this analysis is often done numerically (via simulations, which we will discuss in Chapter \@ref(chap-QML-on-real-data) ), or when implementing the algorithm on real hardware. In principle, we could also think of having [floating point](https://en.wikipedia.org/wiki/IEEE_754) representation of numbers in our quantum computer. However, it is believed that the circuital overhead in the computation is not worth the trouble. +If $c_1,c_2$ are clear from the context, we use the shorthand notation for a number $z:=(a,b,s)$ and write $\mathcal{Q}(z)$ instead of $\mathcal{Q}(a,b,s)$. Given an $n$-dimensional vector $v \in (\{0,1\}^{c_1} \times \{0,1\}^{c_2} \times \{0,1\})^n$ +the notation $\mathcal{Q}(v)$ means an $n$-dimensional vector whose $j$-th component is $\mathcal{Q}(v_j)$, for $j \in[n]$. -When programming quantum algorithms, it is very common to use subroutines to perform arithmetic on numbers, and we will discuss these procedures in later sections of this work. We avoid the analysis of such details by using the quantum arithmetic model as in Definition \@ref{def:defQArith}. Recall that any Boolean circuit can be made reversible, and any reversible computation can be realized with a circuit involving negation and three-bit Toffoli gates. Such a circuit can be turned into a quantum circuit with single-qubit NOT gates and three-qubit Toffoli gates. Since most of the boolean circuits for arithmetic operations operate with a number of gates of $O(\text{poly}(c_1,c_2))$ this implies a number of quantum gates of $O(\text{poly}(c_1,c_2))$ for the corresponding quantum circuit. +We note that the choice of $c_1$ and $c_2$ in definition \@ref(def:fixed-point-encoding) depends both on the problem at hand and the implemented algorithm. For the purposes of optimizing a quantum circuit, these constants can be dynamically changed. For example, if at some point of a computation we are required to work with numbers between $0$ and $1$, then we can neglect the $c_1$ bits. + +One of the utilities of having a definition to express numbers on a quantum computer to a fixed point precision is the analysis of numerical errors, which is essential to ensure the validity of the solution. This is often done numerically (via simulations, which we will discuss in Chapter \@ref(chap-QML-on-real-data) ), or during the implementation of the algorithm on real hardware. This binary encoding encompasses other kinds of encoding like $2$-complement encoding and a possible quantum implementation of [floating point](https://en.wikipedia.org/wiki/IEEE_754) representation. Howevever, we observe that the floating point encoding has a relatively high circuital overhead and, therefore, is not a common choice. A further layer of complexity arises in understanding how to treat arithmetic operations. This is addressed in the section below. + +#### Arithmetic model {#sec:arithmetic-model} -```{definition, defQArith, name="Quantum arithmetic model"} -Given $c_1, c_2 \in \mathbb{N}$ specifying fixed-point precision numbers as in Definition \@ref(def:fixed-point-encoding), we say we use a quantum arithmetic model of computation if the four arithmetic operations can be performed in constant time in a quantum computer. -``` -Most often than not, quantum algorithms are not taking into account in the complexity of their algorithm the cost for performing operations described in their arithmetic model. In fact, they somehow don't even define a quantum arithmetic model, leaving that implicit. However, when estimating the resources needed to run an algorithm on a quantum computer, specifying these values become important. For a resource estimation for problems in quantum computational finance that takes into account the cost of arithmetic operations in fixed-point precision we refer to [@chakrabarti2021threshold]. +The advantage of using a binary encoding is that we can use quantum circuits for arithmetic operations. +As we will discuss more in depth in \@ref(sec:implementation-oracle-synthesis) any Boolean circuit can be made reversible, and any reversible circuit can be implemented using single-qubit NOT gates and three-qubit Toffoli gates. Since most of the classical Boolean circuits for arithmetic operations operate with a number of gates of $O(\text{poly}(c_1,c_2))$, this implies a number of quantum gates of $O(\text{poly}(c_1,c_2))$ for the corresponding quantum circuit. Extending the analogy with classical computation allows us to introduce the arithmetic model of computation for performing operations on binary encoded numbers in constant time. - +(ref:optimalstoppingtime) [@optimalstoppingtime] + +```{definition, defQArith, name="Quantum arithmetic model (ref:optimalstoppingtime)"} +Given $c_1, c_2 \in \mathbb{N}$ specifying fixed-point precision numbers as in Definition \@ref(def:fixed-point-encoding), we say we use a quantum arithmetic model of computation if the four arithmetic operations can be performed in constant time in a quantum computer. +``` -### Vectors and matrices {#subsec-stateprep-matrices} +Beware that using Definition \@ref(def:fixed-point-encoding) is not the only possibile choice. For example, most of the non-modular and modular arithemtic circuits are expressed in 2s complement. For a comprehensive and optimized list of results about this topic, the interest reader can read [@luongo2024measurement]. As for the classical counterpart, a quantum algorithm's complexity does not take into account the cost of performing arithmetic operations, as the number of digits of precisions used to represents numbers is a constant, and does not depend on the input size. However, when estimating the resources needed to run an algorithm on a quantum computer, specifying these values becomes important. For a good example of a complete resource analysis, including arithmetic operations in fixed-point precision, of common algorithms in quantum computational finance we refer to [@chakrabarti2021threshold]. -Representing vectors and matrices in quantum computers is the best way to understand the amplitude encoding. We can represent a vector $x \in \mathbb{R}^{2^n}$ as the following quantum state: +### Amplitude encoding{#sec:amplitude-encoding} +Amplitude encoding is a way to represent a vector $x$ of size $n$ (where $n$ is a power of $2$) in the amplitudes of an $\log(n)$ qubit pure state. We can map a vector $x \in \mathbb{R}^{N}$ (or even $\in \mathbb{C}^{N}$) to the following quantum state: \begin{equation} -\ket{x} = \frac{1}{{\left \lVert x \right \rVert}}\sum_{i=0}^{2^n-1}x_i\ket{i} = \|x\|^{-1}x +\ket{x} = \frac{1}{{\left \lVert x \right \rVert}}\sum_{i=0}^{N-1}x_i\ket{i} = \|x\|^{-1}x, +(\#eq:amplitude-encoding) \end{equation} -To represent a vector of size $2^n$, for some integer $n$, we just need $n$ qubits: we encode each component of the classical vector in the amplitudes of a pure state. In fact, we are just building an object representing $\ell_2$-normalized version of the vector $x$. Note that, in the quantum state in the previous equation we are somehow "losing" the information on the norm of the vector $x$: however we will see how this is not a problem when we work with more than one vector. This idea can be generalized to matrices: let $X \in \mathbb{R}^{n \times d}$, a matrix of $n$ rows of length $d$. We will encode them using $\lceil log(d) \rceil +\lceil log(n) \rceil$ qubits. Let $x(i)$ be the $i$-th row of $X$. +Sometimes, amplitude encoding is also known as *quantum sampling access*, as sampling from a quantum state we prepare can also be interpreted as sampling from a probability distribution. In fact, if the amplitude of a computational basis $\ket{i}$ is $\alpha_i$, then we sample $\ket{i}$ with probability $|\alpha_i|^2$. Observe from the state in the above equation we are actually representing an $\ell_2$-normalized version of the vector $x$. Therefore we have "lost" the information on the norm of the vector $x$. However we will see how this is not a problem when we work with more than one vector. This type of encoding can be generalized to matrices. Let $x(i)$ be the $i$-th row of $X \in \mathbb{R}^{n \times d}$, a matrix with $n$ rows and $d$ columns (here we take again $n$ and $d$ to be a power of $2$). Then we can encode $X$ with $\lceil log(d) \rceil +\lceil log(n) \rceil$ qubits as: \begin{equation} -\frac{1}{\sqrt{\sum_{i=1}^n {\left \lVert x(i) \right \rVert}^2 }} \sum_{i=1}^n {\left \lVert x(i) \right \rVert}\ket{i}\ket{x(i)} +\ket{X} = \frac{1}{\sqrt{\sum_{i=1}^n {\left \lVert x(i) \right \rVert}^2 }} \sum_{i=1}^n {\left \lVert x(i) \right \rVert}\ket{i}\ket{x(i)} (\#eq:matrix-state1) \end{equation} -\begin{equation}\frac{1}{\sqrt{\sum_{i,j=1}^{n,d} |X_{ij}|^2}} \sum_{i,j=1}^{n,d} X_{ij}\ket{i}\ket{j} +```{exercise} +Check that Equation \@ref(eq:matrix-state1) is equivalent to +\begin{equation} +\ket{X} = \frac{1}{\sqrt{\sum_{i,j=1}^{n,d} |X_{ij}|^2}} \sum_{i,j=1}^{n,d} X_{ij}\ket{i}\ket{j}, (\#eq:matrix-state2) \end{equation} +``` + -```{exercise} -Check that Equation \@ref(eq:matrix-state1) and \@ref(eq:matrix-state2) are in fact equivalent? + + + +From an algorithms perspective, amplitude encoding is useful because it requires a logarithmic number of qubits with respect to the vector size, which might seem to lead to an exponential saving in physical resources when compared to classical encoding techniques. A major drawback of amplitude encoding is that, in the worst case, for the majority of states, it requires a circuit of size $\Omega(N)$. + + + + +### Block encoding {#sec:block-encoding} +Block encoding is another type of encoding for working with matrices on a quantum computer. More precisely, we want to encode a matrix into a unitary that has a circuit representation on a quantum computer. As it will become clear in the next chapters, being able to perform such encoding unlocks many possibilities in terms of new quantum algorithms. + +```{definition, name="Block encodings"} +Let $A \in \mathbb{R}^{N \times N}$ be a square matrix for $N = 2^n$ for $n\in\mathbb{N}$, and let $\alpha \geq 1$. For $\epsilon > 0$, we say that a $(n+a)$-qubit unitary $U_A$ is a $(\alpha, a, \epsilon)$-block encoding of $A$ if + +\begin{equation} + | A - \alpha ( \bra{0}^{\otimes a} \otimes I) U_A (\ket{0}^{\otimes a} \otimes I) | \leq \epsilon +\end{equation} ``` - +It is useful to observe that an $(\alpha, a, \epsilon)$-block encoding of $A$ is just a $(1, a, \epsilon)$-block encoding of $A/\alpha$. Often, we do not want to take into account the number of qubits $a$ we need to create the block encoding because these are expected to be negligible. Therefore, some definitions of block encoding in the literature use the notation $(\alpha, \epsilon)$ or the notation $\alpha$-block encoding if the error is $0$. Note that the matrix $U_A \in \mathbb{R}^{(N+\kappa) \times (N+\kappa)}$ has the matrix $A$ encoded in the top-left part: - +\begin{equation} +U_A = \begin{pmatrix} +A & . \\ +. & . +\end{pmatrix}. +(\#eq:blockencoding) +\end{equation} - + - +### Angle encoding {#sec:angle-encoding} +Another way to encode vectors, as defined by [@schuld2021machine], is with angle encoding. This technique encodes information as angles of the Pauli rotations $\sigma_x(\theta)$, $\sigma_y(\theta)$, $\sigma_z(\theta)$. Given a vector $x \in \mathbb{R}^n$, with all elements in the interval $[0,2\pi]$; the technique seeks to apply $\sigma_{\alpha}^i(x_i)$, where $\alpha \in \{x,y,z \}$ and $i$ refers to the target qubit. The resulting state is said to be an angle encoding of $x$ and has a form given by - +\begin{equation} + \ket{x} = \prod_{i=1}^{n} \sigma_{\alpha}^{i}(x_i)\ket{0}^{\otimes n} + (\#eq:angle-encoding) +\end{equation} + +This technique's advantages lies in its efficient resource utilization, which scales linearly for number of qubits. One major drawback is that it is difficult to perform arithmetic operations on the resulting state, making it difficult to apply to quantum algorithms. + + - +### Graph encoding {#sec:graph-encoding} +A graph is as a tuple $G =(V,E)$, where $V$ are the vertices in the graph and $E$ are the edges, where $E \subseteq V \times V$. For graph encoding we require unidirected graphs in which if $( v_i, v_j ) \in E$ then $( v_j, v_i ) \in E$. Unidirected graphs can be either simple or multigraphs. A simple unidirected graph is one without self loops and at most a single edge connecting two vertices, whilst a unidirected multigraph can have self loops or multiple edges between two vertices. Graph encoding is possible for unidirected multigraphs with self loops but at most a single edge between two vertices. - +A graph $G$ will be represented as an $N=|V|$ qubit pure quantum state $\ket{G}$ such that + +\begin{equation} + K_G^v\ket{G} = \ket{G}, \;\; \forall v \in V + (\#eq:graph-encoding) +\end{equation} - +where $K_G^v = \sigma_x^v\prod_{u \in N(v)}\sigma_z^u$, and $\sigma_x^u$ and $\sigma_z^u$ are the Pauli operators $\sigma_x$ and $\sigma_z$ applied to the $u^{th}$ qubit. - +Given a graph $G$ with $V$ vertices and edges $E$, take $N=|V|$ qubits in the $\ket{0}^{\otimes N}$ state, apply $H^{\otimes N}$, producing the $\ket{+}^{\otimes N}$ state where $\ket{+} = \frac{\ket{0} + \ket{1}}{\sqrt{2}}$. Then apply a controlled $Z$ rotation between qubits connected by an edge in $E$. It is worth noting that 2 different graphs can produce the same graph state $\ket{G}$. In particular if a graph state $\ket{\tilde{G}}$ can be obtained from a graph state $\ket{G}$ by only applying local Clifford group operators, the 2 graphs are said to be LC-equivalent. The work by [@graph_encoding] has interesting application of this type of encoding. -## Access models {#sec:quantum-memory-models} + -Now we focus on how to input classical data in quantum computers. As discussed in the Section \@ref(measuring-complexity) of the previous chapter, in quantum computing we often work in a **oracle model**, also called **black-box model** of quantum computation. This section is devoted to the formalization and implementation of some of the oracles that are commonly used to load classical data (numbers, vectors, matrices). The word "oracle", (a word referencing concepts in complexity theory), is used to imply that an application of the oracle has $O(1)$ cost, i.e. that at first sight, we do not care about the cost of implementing the oracle in our algorithm. A synonym of quantum oracle model is **quantum query model**, which stress the fact that we can use this oracle to perform queries. A query to an oracle is any unitary that performs the mapping: +### One-hot encoding{#sec:onehot-encoding} +Another possible way of encoding vectors as quantum states introduced by [@mathur2022medical] is **one-hot amplitude encoding**, also known as **unary amplitude encoding**, which encodes a normalized vector $x \in \mathbb{C}^n$ onto $n$ qubits. The vector values $x_i \in \mathbb{C}$ will be stored in the amplitudes of the states that form the $2^n$-dimensional canonical basis, i.e, the states with only one $1$ and the rest $0$s. This corresponds to preparing the state: \begin{equation} -\ket{i}\ket{0}\mapsto \ket{i}\ket{x_i}, -(\#eq:querytooracle) +\ket{x} = \frac{1}{||x||} \sum_{i=1}^n x_i \ket{e_i}, +(\#eq:one-hot-encoding) +\end{equation} + +where, for some integer $i$, the states $e_i$ take the form $e_i = 0^{i-1}10^{n-i}$. + + + +## Quantum memory{#sec:quantum-memory} + +Having seen possible ways to represent data on a quantum computer, we will now take the first step toward understanding how to create quantum states that are representing numbers using these encodings. The first step involves understanding quantum memory, which plays a key role in various quantum algorithms/problems such as: Grover’s search, solving the dihedral hidden subgroup problem, collision finding, phase estimation for quantum chemistry, pattern recognition, machine learning algorithms, cryptanalysis, and state preparation. + +To work with quantum memory we need to define a quantum memory model of computation, which enables us to accurately calculate the complexity of quantum algorithms. In this framework we divide a quantum computation into a data pre-processing step and a computational step. Quantum memory allows us to assume that the pre-processed data can be easily accessed (as in classical computers). In this model, since the pre-processing is negligible, and has to be performed only once, the complexity of a quantum algorithm is fully characterized by the computational step. This understanding formalizes a quantum computation in two distinct components: a quantum processing unit and a quantum memory device. Two notable examples of quantum memory devices are the quantum random access memory ($\mathsf{QRAM}$) and the quantum random access gates ($\mathsf{QRAG}$). It is important to note that having access to a quantum memory device is associated with fault tolerant quantum computers. + +This section will first introduce the quantum memory model of computation (\@ref(sec:quantum-memory-model)). This will be followed by the formalization of a quantum computation in the memory model via a quantum processing unit ($\mathsf{QPU}$) and a quantum memory device ($\mathsf{QMD}$) (\@ref(sec:QPU-QMD)), where the $\mathsf{QRAM}$ and $\mathsf{QRAG}$ will be presented as possible implementation of the $\mathsf{QMD}$. + + + + + + +### The quantum memory model of computation{#sec:quantum-memory-model} + +As discussed in the Section \@ref(measuring-complexity) of the previous chapter, in quantum computing we often work in a oracle model, also called black-box model of quantum computation. This section is devoted to the formalization of this model of computation. The word “oracle”, (a word referencing concepts in complexity theory), is used to imply that an application of the oracle has $\mathcal{O}(1)$ cost, i.e. we do not care about the cost of implementing the oracle in our algorithm. A synonym of quantum oracle model is quantum query model, which stresses the fact that we can only use the oracle to perform queries. + +To appreciate the potential of quantum algorithms, it is important to understand the quantum memory model. This is because we want to compare quantum algorithms with classical algorithms. Understanding the quantum memory model makes sure that we not favor any of the approaches, ensuring a fair evaluation of their performance across different computational models and memory architectures. Understanding classical memory is also important for classical algorithms. Memory limitations make the analysis of big datasets challenging. This limitation is exacerbated when the random-access memory is smaller than the dataset to analyze, as the bottleneck of computational time switch from being the number of operations to the time to move data from the disk to the memory. Hence, algorithms with super linear runtime (such as those based on linear algebra) become impractical for large input size. + +As we will formalize later, the runtime for analyzing a dataset represented by a matrix $A \in \mathbb{R}^{n \times d}$ using a quantum computer is given by the time to preprocess the data (i.e., creating quantum accessible data structures) and the runtime of the quantum algorithm. Importantly, the pre-processing step needs to be done only once, allowing one to run (different) quantum algorithms on the same matrix. We can see this pre-processing step as a way of encoding and/or storing the data: once the matrix is pre-processed, we can always retrieve the matrix in the original representation (i.e. it is a loss less encoding). This step bears some similarities with the process of loading the data from the disk in RAM Therefore, because the pre-processing step is analyzed differently from the runtime, when we work with a quantum algorithm that has quantum access to some classical data, we have the following model in mind. + +```{definition, costing-of-quantum-memory-model, name="Costing in the quantum memory model"} +An algorithm in the quantum memory model that processes a data-set of size $m$ has two steps: + + * A pre-processing step with complexity $\widetilde{O}(m)$ that constructs an efficient quantum access to the data + * A computational step where the algorithm has quantum access to the data structures constructed in step 1. + +The complexity of the algorithm in this model is measured by the cost for step 2. +``` + +Let's consider an example. We will see that many of the quantum algorithms considered in this book have a computational complexity expressed (in number of operations of a certain kind) as some functions of the matrix and the problem. Consider a classical algorithm with a runtime of $\widetilde{O} \left( \frac{\norm{A}_0\kappa(A)}{\epsilon^2}\log(1/\delta) \right)$ calls to the classical memory (and coincidentally, CPU operations). Here $\epsilon$ is some approximation error in the quantity we are considering, $\kappa(A)$ is the condition number of the matrix, $\delta$ the failure probability. The quantum counterpart of this algorithm has a runtime of $O(\norm{A}_0)$ classical operation for pre-processing and + +\begin{equation} +\widetilde{O}(poly(f(A)), poly(\kappa(A), poly(1/\epsilon), poly(\log(nd), poly(\log(1/\delta)) ) +\end{equation} + +queries to the quantum memory (and coincidentally, number of operations). Here, $f(A)$ represents some size-independent function of the matrix that depends on the properties of $A$ which can be chosen to be $\|A\|_F$: the Frobenius norm of the matrix. Importantly, note that in the runtime of the quantum algorithm there is no dependence on $\|A\|_0$. + +The first step, i.e., loading data (for example a matrix $A$) onto a quantum memory gives an additive price of $\widetilde{O}(\norm{A}_0)$, and is computationally easy to implement. In some cases this can be done on the fly, with only a single pass over the dataset, for example while receiving each of the rows of the matrix. For more complex choices of $f(A)$, the construction of the data structure needs only a few (constant) numbers of passes over the dataset. As pre-processing the data is negligible, we expect quantum data analysis to be faster than classical data analysis. However, there is no need to employ quantum data analysis for small datasets if classical data analysis is sufficient. + +In the quantum memory model, we assumed that the pre-processing step to be negligible in cost, and thereby claim that there is significant practical speedup when using quantum algorithms compared to classical algorithms. However, a proper comparison for practical applications needs to include the computational cost of the loading process, which may or may not remove the exponential gap between the classical and the quantum runtime. Nevertheless, even when the pre-processing step is included, we expect the overall computational cost to largely favor the quantum procedure. This analysis can be done only with a proper understanding of the quantum memory model. + +Having a clear and deep understanding of the quantum memory model can help us understand the power and limitations of classical computers as well. The past few years saw a trend of works proposing "dequantizations" of quantum machine learning algorithms. These algorithms explored and sharpened some ideas [@tang2018quantum] to leverage a classical data structure to perform importance sampling on input data to have classical algorithm with polylogarithmic runtimes in the size of the input. This data structure is very similar to the one used in many quantum machine learning algorithms (see Section \@ref(sec:implementation-KPtrees)). As a result, many quantum algorithms which had an exponential separation with their classical counterpart now have at most a polynomial speedup compared to the classical algorithm. However, these classical algorithms have a worse dependence in other parameters (like condition number, Frobenius norm, rank, and so on) that will make them disadvantageous in practice (i.e., they are slower than the fastest classical randomized algorithms [@arrazola2020quantum]). With that said, having small polynomial speedup is not something to be critical about: even constant speedups matter a lot in practice! Overall, dequantizations and polynomial speedups highlight the importance of clearly understanding the techniques behind loading classical data in quantum computers. + +### The quantum processing unit and quantum memory device {#sec:QPU-QMD} + +In this section, we formally define a model of a quantum computer with quantum access to memory. We can intuitively understand this model by separating the available Hilbert space in two: a part dedicated to computing, the Quantum Processing Unit ($\mathsf{QPU}$) and a part dedicated to storing, the Quantum Memory Device ($\mathsf{QMD}$). + +The qubits which comprise the $\mathsf{QPU}$ are assigned to either an input register or a workspace register; whilst the qubits which comprise the $\mathsf{QMD}$ are assigned to either a ancillary register or a memory register. Two other registers, the address register and the target register, are shared by the $\mathsf{QPU}$ and $\mathsf{QMD}$ and allow for communication between the two Hilbert spaces. A depiction of the architecture of a $\mathsf{QPU}$ with access to a $\mathsf{QMD}$ can be seen in Figure \@ref(fig:quantum-architecture). Before defining a model of a quantum computer with quantum access to memory, we will first formally define a computation with only the quantum processing unit $\mathsf{QPU}$. + +(ref:allcock2023quantum) [@allcock2023quantum] + +```{definition, QPU, name="Quantum Processing Unit (ref:allcock2023quantum)"} +A Quantum Processing Unit($\mathsf{QPU}$) of size $m$ is defined as a tuple $(\mathtt{I}, \mathtt{W},\mathcal{G})$ consisting of + +- an $m_{\mathtt{I}}$-qubit Hilbert space called \emph{input register} $\mathtt{I}$; +- an $(m-m_{\mathtt{I}})$-qubit Hilbert space called \emph{workspace} $\mathtt{W}$; +- a constant-size universal gate set $\mathcal{G}\subset\mathcal{U}(\mathbb{C}^{4\times 4})$. + +The qubits in the workspace $\mathtt{W}$ are called ancillary qubits or simply ancillae. An input to the $\mathsf{QPU}$, or quantum circuit, is a tuple $(T,|\psi_{\mathtt{I}}\rangle,C_1,\dots,C_T)$ where $T\in\mathbb{N}$, $|\psi_{\mathtt{I}}\rangle\in\mathtt{I}$, and, for each $t\in\{1,\dots,T\}$, $C_t\in\mathcal{I}(\mathcal{G})$ is a set of instructions from a set $\mathcal{I}(\mathcal{G})$ of possible instructions. Starting from the state $|\psi_0\rangle := |\psi_\mathtt{I}\rangle|0\rangle_{\mathtt{W}}^{\otimes (m-m_\mathtt{I})}$, at each time step $t\in\{1,\dots, T\}$ we obtain the state $|\psi_t\rangle = C_t|\psi_{t-1}\rangle\in\mathtt{I}\otimes\mathtt{W}$. The instruction set $\mathcal{I}(\mathcal{G})\subset\mathcal{U}(\mathbb{C}^{2^m\times 2^m})$ consists of all $m$-qubit unitaries on $\mathtt{I}\otimes\mathtt{W}$ of the form + +\begin{equation} +\prod_{i=1}^k (\mathsf{U}_i)_{\to I_i} \end{equation} -where the $x_i$ could be a binary encoding or amplitude encoding of something. In the following image we have schematized two different kinds of access model that are commonly used in literature. In the first case we use a binary encoding (for numbers), in the second one we use an amplitude encoding (for vectors and matrices). +for some $k\in\mathbb{N}$, $\mathsf{U}_1,\dots,\mathsf{U}_k\in\mathcal{G}$ and pair-wise disjoint non-repeating sequences $I_1,\dots,I_k\in[m]^{\leq 2}$ of at most $2$ elements. We say that $\sum_{i=1}^k |I_i|$ is the \emph{size} of the corresponding instruction. We say that $T$ is the \emph{depth} of the input to the $\mathsf{QPU}$, while its \emph{size} is the sum of the sizes of the instructions $C_1,\dots,C_T$. +``` + +Note that in this definition the circuit size differs from the standard notion of circuit size, which is the number of selected gates from $\mathcal{G}$, up to a factor of at most $2$. + -```{r, echo=FALSE, fig.width=6, fig.cap="This table describes different types of oracles. An oracle for numbers gives you quantum access to elements in a list of numbers. This oracle can be implemented in at least two ways: either with a QRAM, or with particular circuits. An oracle for getting amplitude encoding is usually called quantum sampling access, needs a quantum oracle for numbers to be implemented.", } -knitr::include_graphics("images/oracle-models.png") +```{exercise, standardzied} +Can you explain why the circuit size differs from the standard notion of circuit size by up to a factor of at most $2$ ``` -An oracle for numbers gives you quantum access to elements in a list of numbers, as we describe in Section \@ref(sec:numbers). This oracle can be implemented in at least two ways: either with a QRAM (see Section \@ref(subsec:qram-model), or with particular circuits (see next Section \@ref(sec:accessmodel-circuits) ). An oracle for getting amplitude encoding, which is more and more often called quantum sampling access for reasons that will be evident later (see Section \@ref(subsec-stateprep-matrices) ) needs a quantum oracle for numbers to be implemented." -## Implementations +Moreover, in this framework, the locations of the address and target registers are fixed. One could imagine a more general setting where the address and target registers are freely chosen from the workspace. This case can be handled by this model with minimal overhead, e.g. by performing $\ell$-$\mathsf{SWAP}$ gates to move the desired workspace qubits into the address or target register locations. -### Quantum memory models {#subsec:qram-model} +Adding access to a $\mathsf{QMD}$ changes how we define the model of computation. In practice, a call to the $\mathsf{QMD}$ sees the address register selecting a unitary from a set of unitaries $\mathcal{V}$ and applying it to both the target and memory register. It is important to stress that even though a call to the $\mathsf{QMD}$ might require gates from a universal gate set, the underlying quantum circuit implementing such a call is \emph{fixed}, i.e., does not change throughout the execution of a quantum algorithm by the $\mathsf{QPU}$, or even between different quantum algorithms. Below we find the full definition of a quantum computation of a $\mathsf{QPU}$ with access to a $\mathsf{QMD}$. -#### The QRAM -Along with a fully fledged quantum computer, it is often common to assume that we access to a quantum memory, i.e. a classical data structure that store classical information, but that is able to answer queries in quantum superposition. This model is commonly called the **QRAM model** (and is a kind of query model). There is a catch. As we will see in greater details soon, the task of building the data structure classically requires time that is linear (up to polylogarithmic factors) in the dimension of the data (this observation is better detailed in definition \@ref(def:QRAM-model) ). If we want to have quantum access to a dense matrix $M \in \mathbb{R}^{n \times d}$ the preprocessing time *mush* be at least $O(nd \log (nd))$, as we need to do some computation to create this data structure. To stress more the fact that we are linear in the effective number of elements contained in the matrix (which can often be sparse) can write that the runtime for the preprocessing is $O(\norm{A}_0\log(nd))$. The name QRAM is meant to evoke the way classical RAM works, by addressing the data in memory using a tree structure. Note that sometimes, QRAM goes under the name of QROM, as actually it is not something that can be written during the runtime of the quantum algorithm, but just queried, i.e. read. Furthermore, a QRAM is said to be *efficient* if can be updated by adding, deleting, or modifying an entry in polylogarithmic time w.r.t the size of the data it is storing. Using the following definition, we can better define the computational model we are working with. Remember that assuming to have access to a large QRAM in your algorithms is something that is often associated with more long-term quantum algorithms, so it is a good idea to limit as much as possible the dependence on QRAM on your quantum algorithms. +```{definition, QPUQMD, name="Quantum Processing Unit and Quantum Memory Device (ref:allcock2023quantum)"} +We consider a model of computation comprising a Quantum Processing Unit($\mathsf{QPU}$) of size $\poly\log(n)$ and a Quantum Memory Device ($\mathsf{QMD}$) of $n$ memory registers, where each register is of $\ell$-qubit size (for $n$ a power of $2$). A $\mathsf{QPU}$ and a $\mathsf{QMD}$ are collectively defined by a tuple $(\mathtt{I}, \mathtt{W}, \mathtt{A}, \mathtt{T}, \mathtt{Aux}, \mathtt{M}, \mathcal{G}, \mathsf{V})$ consisting of - +- two $(\operatorname{poly}\log{n})$-qubit Hilbert spaces called \emph{input register} $\mathtt{I}$ and \emph{workspace} $\mathtt{W}$ owned solely by the $\mathsf{QPU}$; +- a $(\log{n})$-qubit Hilbert space called \emph{address register} $\mathtt{A}$ shared by both $\mathsf{QPU}$ and $\mathsf{QMD}$; +- an $\ell$-qubit Hilbert space called \emph{target register} $\mathtt{T}$ shared by both $\mathsf{QPU}$ and $\mathsf{QMD}$; +- a $(\poly{n})$-qubit Hilbert space called \emph{auxiliary register} $\mathtt{Aux}$ owned solely by the $\mathsf{QMD}$; +- an $n\ell$-qubit Hilbert space called \emph{memory} $\mathtt{M}$ comprising $n$ registers $\mathtt{M}_0, \ldots, \mathtt{M}_{n-1}$, each containing $\ell$ qubits, owned solely by the $\mathsf{QMD}$; +- a constant-size universal gate set $\mathcal{G}\subset\mathcal{U}(\mathbb{C}^{4\times 4})$; +- a function $\mathsf{V} : [n] \to \mathcal{V}$, where $\mathcal{V}\subset \mathcal{U}(\mathbb{C}^{2^{2\ell}\times 2^{2\ell}})$ is a $O(1)$-size subset of $2\ell$-qubit gates. -(ref:giovannetti2008quantum) [@giovannetti2008quantum] +The qubits in $\mathtt{W}$, $\mathtt{A}$, $\mathtt{T}$, and $\mathtt{Aux}$ are called ancillary qubits or simply ancillae. An input to the $\mathsf{QPU}$ with a $\mathsf{QMD}$, or quantum circuit, is a tuple $(T,|\psi_\mathtt{I}\rangle,|\psi_{\mathtt{M}}\rangle,C_1,\dots,C_T)$ where $T\in\mathbb{N}$, $|\psi_{\mathtt{I}}\rangle\in\mathtt{I}$, $|\psi_{\mathtt{M}}\rangle\in\mathtt{M}$, and, for each $t\in\{1,\dots,T\}$, $C_t\in\mathcal{I}(\mathcal{G},\mathsf{V})$ is an instruction from a set $\mathcal{I}(\mathcal{G},\mathsf{V})$ of possible instructions. The instruction set $\mathcal{I}(\mathcal{G},\mathsf{V})$ is the set $\mathcal{I}(\mathcal{G})$ acting on $\mathtt{I}\otimes\mathtt{W}\otimes\mathtt{A}\otimes\mathtt{T}$ augmented with the call-to-the-$\mathsf{QMD}$ instruction that implements the unitary + +\begin{equation} +|i\rangle_{\mathtt{A}}|b\rangle_{\mathtt{T}}|x_i\rangle_{\mathtt{M}_i}|0\rangle^{\otimes \poly{n}}_{\mathtt{Aux}} \mapsto|i\rangle_{\mathtt{A}}\big(\mathsf{V}(i)|b\rangle_{\mathtt{T}}|x_i\rangle_{\mathtt{M}_i}\big)|0\rangle^{\otimes \poly{n}}_{\mathtt{Aux}}, \qquad \forall i\in[n],b,x_i\in\{0,1\}^\ell. +\end{equation} + +Starting from $|\psi_0\rangle|0\rangle^{\otimes \poly{n}}_{\mathtt{Aux}}$, where $|\psi_0\rangle := |\psi_\mathtt{I}\rangle|0\rangle^{\otimes\poly\log{n}}_{\mathtt{W}}|0\rangle_{\mathtt{A}}^{\otimes \log{n}}|0\rangle_{\mathtt{T}}^{\otimes \ell}|\psi_\mathtt{M}\rangle$, at each time step $t\in\{1,\dots, T\}$ we obtain the state $|\psi_t\rangle|0\rangle^{\otimes \poly{n}}_{\mathtt{Aux}} = C_t(|\psi_{t-1}\rangle|0\rangle^{\otimes \poly{n}}_{\mathtt{Aux}})$, where $|\psi_t\rangle\in \mathtt{I}\otimes \mathtt{W}\otimes \mathtt{A}\otimes \mathtt{T}\otimes \mathtt{M}$. -```{definition, qram, name="Quantum Random Access Memory (ref:giovannetti2008quantum)"} -A quantum random access memory is a device that stores indexed data $(i,x_i)$ for $i \in [n]$ and $x_i \in \R$ (eventually truncated with some bits of precision). It allows query in the form $\ket{i}\ket{0}\mapsto \ket{i}\ket{x_i}$, and has circuit depth $O(polylog(n))$. ``` -We say that a dataset is efficiently loaded in the QRAM, if the size of the data structure is linear in the dimension and number of data points and the time to enter/update/delete an element is polylogarithmic in the dimension and number of data points. More formally, we have the following definition (the formalization is taken from [@kerenidis2017quantumsquares] but that's folklore knowledge in quantum algorithms). -```{definition, QRAM-model, name="QRAM model"} -An algorithm in the QRAM data structure model that processes a data-set of size $m$ has two steps: +```{r, quantum-architecture, echo=FALSE, out.width="50%", fig.cap="The architecture of a Quantum Processing Unit($\\mathsf{QPU}$) with access to a quantum memory device($\\mathsf{QMD}$). The $\\mathsf{QPU}$ is composed of a $\\poly \\log(n)$-qubit input register $\\mathtt{I}$ and workspace $\\mathtt{W}$. The $\\mathsf{QMD}$ is composed of an $nl$-qubit memory array $\\mathtt{M}$, composed of $n$ memory cells each of size $l$-qubits, and a $\\poly(n)$-qubit auxiliary register $\\mathtt{Aux}$. Two registers, the $\\log(n)$-qubit address register $\\mathtt{A}$ and an $l$-qubit target register $\\mathtt{T}$, are shared between the $\\mathsf{QPU}$ and the $\\mathsf{QMD}$."} +knitr::include_graphics("algpseudocode/quantum_architecture.png") +``` - * A pre-processing step with complexity $\widetilde{O}(m)$ that constructs efficient QRAM data structures for storing the data. - * A computational step where the quantum algorithm has access to the QRAM data structures constructed in step 1. +This model can be seen as a refined version of the one described in [@buhrman2022memory], where the authors divide the qubits of a quantum computer into work and memory qubits. Given $M$ memory qubits, their workspace consists of $O(\log M)$ qubits, of which the address and target qubits are always the first $\lceil\log M\rceil + 1$ qubits. However, address and target qubits are not considered to be shared by the $\mathsf{QMD}$, and there is no mention of ancillary qubits mediating a call to the $\mathsf{QMD}$. The inner structure of the $\mathsf{QMD}$ is abstracted away by assuming access to the unitary of a $\mathsf{QRAG}$ (see Definition \@ref(def:qrag) later). This model, in contrast, "opens" the quantum memory device, and allows for general fixed unitaries, including $\mathsf{QRAM}$ and $\mathsf{QRAG}$. -The complexity of the algorithm in this model is measured by the cost for step 2. +In addition, this model does not include measurements. These can easily be performed on the output state $\ket{\psi_T}$ if need be. Furthermore the position of the qubits is not fixed within the architecture, allowing for long-range interactions through, for example, multi-qubit entangling +gates. This feature is not always possible in physical the real world since some quantum devices, such as superconducting quantum computers, don't allow for long-range interactions between qubits. For a model of computation which take in consideration physically realistic device interactions we suggest the work by [@Beals_2013]. + +We stress the idea that call to the $\mathsf{QMD}$ is defined by the function $\mathsf{V}$ and quantum memory device is defined by the unitary that it implements. In many applications, one is interested in some form of reading a specific entry from the memory, which corresponds to the special cases where the $\mathsf{V}(i)$ unitaries are made of controlled single-qubit gates, and to which the traditional $\mathsf{QRAM}$ belongs. + +#### The QRAM{#sec:qram} + + +A type of $\mathsf{QMD}$ of particular interest is the $\mathsf{QRAM}$, which is the quantum equivalent of a classical Random Access Memory (RAM), that stores classical or quantum data and allows for superposition-based queries. More specifically, a $\mathsf{QRAM}$ is a device comprising a memory register that stores data, an address register that points to the memory cells to be addressed, and a target register into which the content of the addressed memory cells is copied. If necessary, it also includes an auxiliary register supporting the overall operation, which is reset to its initial state at the end of the computation. Formally, we define it as: + +```{definition, qram, name="Quantum Random Access Memory"} +Let $n\in\mathbb{N}$ be a power of $2$ and $f(i) = \mathsf{X}$ for all $i\in[n]$. A \emph{quantum random access memory} $\mathsf{QRAM}$ of memory size $n$ is a $\mathsf{QMD}$ with $\mathsf{V}(i) = \mathsf{C}_{\mathtt{M}_i}$-$\mathsf{X}_{\to\mathtt{T}}$. Equivalently, it is a $\mathsf{QMD}$ that maps + +\begin{equation} +\ket{i}_{\mathtt{A}}\ket{b}_{\mathtt{T}}\ket{x_0,\dots,x_{n-1}}_{\mathtt{M}} \mapsto \ket{i}_{\mathtt{A}}(f(i)^{x_i}\ket{b}_{\mathtt{T}}) \ket{x_0,\dots,x_{n-1}}_{\mathtt{M}} \quad\quad \forall i\in[n], b,x_0,\dots,x_{n-1}\in\{0,1\}. +\end{equation} ``` -Equipped with this definition we will see how we can load all sorts of data in the quantum computer. For example, we can formalize what it means to have quantum query access to a vector $x \in \mathbb{R}^N$ stored in the QRAM. +A unitary performing a similar mapping often goes under the name of quantum read-only memory ($\mathsf{QROM}$) The difference with $\mathsf{QRAM}$ is that that this term stresses that they don't allow data to be added or modified. Oftentimes, the authors using this term are considering a circuit, as described in section \@ref(sec:multiplexer). + + +Instead assuming to have access to a $\mathsf{QRAM}$ requires a protocol for the pre-processing of the data and creation of a data structure in time which is asymptotically linear in the data size (as indicated by definition \@ref(def:quantum-memory-model)). + +Equipped with definition \@ref(def:qram)) we can formalize what it means to have quantum query access, which is also referred to as $\mathsf{QRAM}$ access or as having "$x$ is in the $\mathsf{QRAM}$". We will formalize the case of having a vector $x \in (\{0,1\}^m)^N$ stored in the $\mathsf{QRAM}$. ```{definition, quantum-query-access-vector, name="Quantum query access to a vector stored in the QRAM"} -Given $x \in (\{0,1\}^m)^N$, we say that we have quantum query access to $x$ stored in the QRAM if we have access to a unitary operator $U_x$ such that $U_x\ket{i}\ket{b} = \ket{i}\ket{b \oplus x_i}$ for any bit string $b\in\{0,1\}^m$. One application of $U_x$ costs $O(1)$ operations. +Given $x \in (\{0,1\}^m)^N$, we say that we have quantum query access to $x$ stored in the $\mathsf{QRAM}$ if we have access to a unitary operator $U_x$ such that $U_x\ket{i}\ket{b} = \ket{i}\ket{b \oplus x_i}$ for any bit string $b\in\{0,1\}^m$. ``` -Other common names for this oralce is "QRAM access", or we simply say that "$x$ is in the QRAM". Note that this definition is very similar to Definition \@ref(def:quantum-oracle-access). The difference is that in the case of most boolean functions we know how to build an efficient classical (and thus quantum) boolean circuit for calculating the function's value. If we have just a list of numbers, we need to resort to a particular hardware device, akin to a classical memory, which further allows query in superposition. Most importantly, when using this oracle in our algorithm, we consider the cost of a query to a data structure of size $N$ to be $O(polylog(N))$. We will see in Section \@ref(sec:qramarchitectures) how, even if the number of quantum gates is $N$, they can be arranged and managed in a way such that the depth and the execution time sill remains polylogarithmic. +In practical terms when analyzing the complexity of a quantum algorithm with a $\mathsf{QRAM}$ we need to take in consideration three factors: the circuit size of the quantum algorithm as introduced in definition \@ref(def:QPU), the number of queries to the $\mathsf{QRAM}$ and the complexity each $\mathsf{QRAM}$ query. We emphasize that the complexity that arises due to a query to the $\mathsf{QRAM}$ is still an open question. Details of some possible implementations will be discussed in section \@ref(sec:implementations). + + -Another gate that is standard (but less frequent) in literature is the Quantum Random Access Gate. This gate was introduced in the paper of [@ambainis2007quantumdistinctness]. Given a quantum state that holds a string $z$ of bits (or word of $m$ bits), this gate swaps an $m$-bit target register $\ket{b}$ with the $i$-th position of the string $z_i$. + + +#### The QRAG{#sec:qrag} + +Another type of quantum memory device is the quantum random access gate($\mathsf{QRAG}$). This quantum memory device was introduced in the paper of [@ambainis2007quantumdistinctness] and performs a $\mathsf{SWAP}$ gate between the target register and some portion of the memory register specified by the address register. The $\mathsf{QRAG}$ finds applications in quantum algorithms for element distinctness, collision finding and random walks on graphs. The formal definition is: ```{definition, qrag, name="Quantum Random Access Gate"} -Given $x \in (\{0,1\}^m)^N = x_0,x_1, \dots x_N$ we say that we have access to a quantum random access gate if we have a unitary operator $U_x$ such that $U_x \ket{i}\ket{b}\ket{x}= \ket{i}\ket{z_i}\ket{z_0,x_1,\dots,x_{i-1},b,x_{i+1}, \dots x_M}$. +Let $n\in\mathbb{N}$ be a power of $2$. A \emph{quantum random access gate} $\mathsf{QRAG}$ of memory size $n$ is a $\mathsf{QMD}$ with $\mathsf{V}(i) = \mathsf{SWAP}_{\mathtt{M}_i\leftrightarrow \mathtt{T}}$, $\forall i\in[n]$. Equivalently, it is a $\mathsf{QMD}$ that maps + +\begin{equation} + |i\rangle_{\mathtt{A}}|b\rangle_{\mathtt{T}}|x_0,\dots,x_{n-1}\rangle_{\mathtt{M}} \mapsto |i\rangle_{\mathtt{A}}|x_i\rangle_{\mathtt{T}} |x_0,\dots,x_{i-1},b,x_{i+1},\dots,x_{n-1}\rangle_{\mathtt{M}} \quad \forall i\in[n], b,x_0,\dots,x_{n-1}\in\{0,1\}. +\end{equation} ``` -It is natural to ask if this model is more or less powerful than a QRAM model. It turns out that with a QRAG you can have a QRAM. This is the sketch of the proof. Set $b=0$ in the second quantum register, and adding another ancillary register, we have: +It turns out that the $\mathsf{QRAG}$ can be simulated with a $\mathsf{QRAM}$, but the $\mathsf{QRAM}$ can be simulated with the $\mathsf{QRAG}$ by requiring single qubit operations (which are not present in the model of computation of definition \@ref(def:QPUQMD)). We will present the proof for the simulation of the $\mathsf{QRAM}$ with a $\mathsf{QRAG}$ and leave the opposite proof as exercise. -$$U_x \ket{i}\ket{0}\ket{b}\ket{x}= \ket{i}\ket{0}\ket{x_i}\ket{x_0,x_1,\dots,x_{i-1},b,x_{i+1}, \dots x_M}$$ now we copy with a CNOT the register $x_i$ in an ancilla register, i.e. we perform this mapping: $$\ket{i}\ket{0}\ket{x_i}\ket{x_0,x_1,\dots,x_{i-1},b,x_{i+1}, \dots x_M} \mapsto \ket{i}\ket{x_i}\ket{ x_i}\ket{x_0,x_1,\dots,x_{i-1},b,x_{i+1}, \dots x_M}$$ +```{theorem, sim-qram-with-qrag, name="Simulating QRAM with QRAG."} +A query to a $\mathsf{QRAM}$ of memory size $n$ can be simualted using 2 queries to a $\mathsf{QRAG}$ of memory size $n$, 3 two-qubit gates, and $1$ workspace qubit. +``` -and lastly we undo the query to the QRAG gate to obtain $\ket{i}\ket{x_i}\ket{ b}\ket{x}$ This shows that with access to a gate that performs QRAG queries, we can symulate a QRAM query. We will see in Section \@ref(sec:qramarchitectures) how the hardware architectures for performing a QRAG gate do not differ much from the architectures required to implement a QRAM gate (Thanks to Patrick Rebentrosts and our group meetings at CQT for useful discussions). +```{proof} +Start with the input $\ket{i}_{\mathtt{A}}\ket{0}_{\mathtt{Tmp}}\ket{b}_{\mathtt{T}}\ket{x_0,\dots,x_{n-1}}_{\mathtt{M}}$ by using an ancillary qubit $\mathtt{Tmp}$ for the workspace. Use the $\mathtt{SWAP}_{\mathtt{T} \leftrightarrow \mathtt{Tmp}}$ gate to obtain $\ket{i}_{\mathtt{A}}\ket{b}_{\mathtt{Tmp}}\ket{0}_{\mathtt{T}}\ket{x_0,\dots,x_{n-1}}_{\mathtt{M}}$. A query to the $\mathsf{QRAG}$ then leads to $\ket{i}_{\mathtt{A}}\ket{b}_{\mathtt{Tmp}}\ket{x_i}_{\mathtt{T}}\ket{x_0,\dots,x_{n-1}}_{\mathtt{M}}$. Use a $\mathtt{C}_{\mathtt{T}}$-$\mathtt{X}_{\rightarrow \mathtt{Tmp}}$ from register $\mathtt{T}$ to register $\mathtt{Tmp}$, and query again the $\mathsf{QRAG}$, followed by a $\mathtt{SWAP}_{\mathtt{T} \leftrightarrow \mathtt{Tmp}}$ gate, to obtain the desired state $\ket{i}_{\mathtt{A}}\ket{b \oplus x_i}_{\mathtt{T}}\ket{x_0,\dots,x_{n-1}}_{\mathtt{M}}$ after discarding the ancillary qubit. +``` -##### Memory compression in sparse QRAG models +```{exercise} +Assuming that single-qubit gates can be freely applied onto the memory register $\mathtt{M}$ of any $\mathsf{QRAM}$, then show that a $\mathsf{QRAG}$ of memory size $n$ can be simulated using $3$ queries to a $\mathsf{QRAM}$ of memory size $n$ and $2(n+1)$ Hadamard gates. +``` -It has been observed that the memory dependence of a few algorithms - which are sparse in certain sense which we will make more precise later - can be compressed. The sparsity of these algorithm consist in a memory of size $M$ which is used only in quantum states whose amplitude is non-zero only in computational basis of Hamming weight bounded by $m \lll M$. This idea was historically first proposed by Ambainis in [@ambainis2007quantumdistinctness], elaborated further in [@jeffery2014frameworks], [@bernstein2013quantum], and finally formalized as we present it here in [@buhrman2022memory]. + + -We split the qubits of our quantum computer as organized in two parts: $M$ memory qubits and $W=O(\log M)$ working qubits. We are only allowed to apply quantum gates in the working qubits only, and we apply the QRAG gate using always in a fixed position (for example, the first $\log M$ qubits), and the target register used for the swap is the $\log M+1$ qubit\footnote{Confusingly, the authros of [@buhrman2022memory] decided to call a machine that works under this model as QRAM: quantum random-access machine.}. + -The formal definition of an $m$-sparse algorithm is the following. +#### Memory compression in sparse QRAG models{#sec:memory-compression} +Assuming that the data is sparse is a common assumption when developing quantum algorithms since it significantly simplifies computations. Applying it to compress quantum algorithms with access to a $\mathsf{QRAG}$ was first proposed by [@ambainis2007quantumdistinctness], elaborated further in [@jeffery2014frameworks], [@bernstein2013quantum], and finally formalized in [@buhrman2022memory]. +Informally, a quantum algorithm is considered sparse if the number of queries to a $\mathsf{QRAG}$ of size $M$ are made with a small number of quantum states. More formally, we start by recalling that in a quantum computational model of definition \@ref(def:QPUQMD) we split the qubits in several registers including a $M$ qubit memory register and a $W$ qubit working register. If throughout the computation the queries to the $\mathsf{QRAG}$ are made using only a constant set of quantum states which have a maximum [Hamming weight](https://en.wikipedia.org/wiki/Hamming_weight)(which is the number of $1$'s in the bit string) of $m \lll M$, then the algorithm is said to be $m$-sparse. The trick to making this definition work is realizing that the $\mathtt{SWAP}$ gate can be used to exchange states between the working register and the states with low hamming weight of the target register. + +Confusingly, the authors of [@buhrman2022memory] decided to call a machine that works under this model as $\mathsf{QRAM}$: quantum random-access machine. The formal definition of an $m$-sparse quantum algorithm with a $\mathsf{QRAG}$ is the following: (ref:buhrman2022memory) [@buhrman2022memory] ```{definition, sparseQRAGalgorithm, name="Sparse QRAG algorithm (ref:buhrman2022memory)"} -Let $\mathcal{C} = (n,T, W, M, C_1, \ldots, C_T)$ be a QRAG algorithm using time $T$, $W$ work qubits, and $M$ memory qubits. Then, we say that $C$ is $m$-sparse, for some $m \le M$, if at every time-step $t \in \{0, \ldots, T\}$ of the algorithm, the state of the memory qubits is supported on computational basis vectors of Hamming weight $\le m$. I.e., we always have -\[ -\ket{\psi_t} \in \text{spam} \left( \ket{u}\ket{v} \;\middle|\; u \in \{0,1\}^W, v \in \binom{[M]}{\le m} \right) -\] +Let $\mathcal{C} = (n,T, W, M, C_1, \ldots, C_T)$ be a $\mathsf{QRAG}$ algorithm using time $T$, $W$ work qubits, and $M$ memory qubits. Then, we say that $C$ is $m$-sparse, for some $m \le M$, if at every time-step $t \in \{0, \ldots, T\}$ of the algorithm, the state of the memory qubits is supported on computational basis vectors of Hamming weight $\le m$. i.e., we always have + +\begin{equation} +\ket{\psi_t} \in \text{span} \left( \ket{u}\ket{v} \;\middle|\; u \in \{0,1\}^W, v \in \binom{[M]}{\le m} \right) +\end{equation} + In other words, if $\ket{\psi_t}$ is written in the computational basis: -\[ +\begin{equation} \ket{\psi_t}=\sum_{u \in \{0,1\}^W} \sum_{v \in \{0,1\}^M} \alpha^{(t)}_{u,v} \cdot \underbrace{\ket{u}}_{\text{Work qubits}}\otimes \underbrace{\ket{v}}_{\text{Memory qubits}}, -\] +\end{equation} + then $\alpha^{(t)}_{u,v} = 0$ whenever $|v| > m$, where $|v|$ is the Hamming weight of $v$. ``` +Now that we have seen sparse $\mathsf{QRAG}$ algorithms, we can look at how memory compression is performed. In particular, any $m$-sparse quantum algorithm running in time $T$ and utilizing $M$ memory qubits can be simulated up to an additional error $\epsilon$ by a quantum algorithm running in time $O(T \log (\frac{T}{\epsilon})\log(M))$ using $O(m\log(M))$ qubits. -The proof of the following theorem (which the reader can use withouth looking at the details of the proof) goes as follow: +```{theorem, name="Memory compression for m-sparse QRAG algorithms (ref:buhrman2022memory)"} +Let $T$, $W$, $m < M = 2^\ell$ be natural numbers, with $M$ and $m$ both powers of $2$, and let $\epsilon \in [0, 1/2)$. Suppose we are given an $m$-sparse $\mathsf{QRAG}$ algorithm using time $T$, $W$ work qubits and $M$ memory qubits, that computes a Boolean relation $F$ with error $\epsilon$. -- first we need to present a data structure, accessible through a QRAG gate, which -- then we need to show that through this data structure we can implement all the operations we need from a QRAG gate. +Then we can construct a $\mathsf{QRAG}$ algorithm which computes $F$ with error $\epsilon' > \epsilon$, and runs in time $O(T \cdot \log(\frac{ T}{\epsilon' - \epsilon}) \cdot \gamma)$, using $W + O(\log M)$ work qubits and $O(m \log M)$ memory qubits. +``` + - +with a maximum Hamming weight(number of $1$s) of $m \lll M$. - - +an algorithm is considered $m$-sparse --> +## Implementations{#sec:implementations} +In this section we'll be creating oracles that can perform the encodings that were presented in section \@ref(sec:representing-data). Of the presented oracles only 3 will make use of the quantum memory device introduced in definition \@ref(def:QPUQMD): the bucket brigade, KP-trees and the block encoding from data structure. It is interesting to note that these oracles actually aid each other. In fact, KP-trees rely on the existence of a $\mathsf{QMD}$ that can perform binary encoding and similarly block encoding from data structures requires the existence of a $\mathsf{QMD}$ that can perform amplitude encoding. The other oracles will either make use of specific properties of the input data, such as sparsity, or will encode a probability distribution as a quantum state. The key insight lies in the fact that all oracles, with or without $\mathsf{QMD}$, have a constant complexity which allows us to work in the quantum memory model of computation of definition \@ref(def:costing-of-quantum-memory-model). All the presented oracles with their interconnection can be seen in figure \@ref(fig:oracle-models), where the oracle which require a $\mathsf{QMD}$ have been indicated with a *. +```{r, oracle-models, echo=FALSE, fig.width=4, fig.cap="This figure shows the different types of data encoding techniques with the corresponding oracles. The vertical lines on the right hand side indicate (possible) dependencies between oracles."} +knitr::include_graphics("algpseudocode/oracle_models.png") +``` - - - - +### Binary encoding{#sec:implementation-binary} + + + +In this section we are discussing implementations a unitary giving query access to a list of $m$-bits values. A possible way of reading this section is throught the lenses of finding the "best" gate decomposition of that unitary, which has the following form: +\begin{align*} + U = \sum_{i=0}^{N-1} \ket{i}\bra{i} \otimes U_i = + \begin{bmatrix} + U_0 & & & \\ + & U_1 & & \\ + & & \ddots & \\ + & & & U_{N-1} +\end{bmatrix}, +\end{align*} +where $U_i\ket{0}=\ket{x_i}$ and $x_i \in \{0,1\}^m$. -### Circuits {#sec:accessmodel-circuits} -There are two cases when we can ease our requirements on having quantum access to a particular hardware device (the QRAM). If we have knowledge about the structure of the mapping, we can just build a circuit to perform $\ket{i}\ket{0}\mapsto \ket{i}\ket{x_i}$. We will see two cases. The first one is when we have an analytic formula for $x_i$, i.e. $x_i = f(i)$ for a function $f$ that we know. The second is when most of the $x_i$ are $0$, so we can leverage the sparsity to keep track of a limited amount of entries. -#### Functions +#### Circuits: oracle synthesis{#sec:implementation-oracle-synthesis} -If we have a function that maps $x_i = f(i)$ we can create a circuit for getting query access to the list of $x_i$ on a quantum computer, as we briefly anticipated in Section \@ref(measuring-complexity). Before discussing how to use this idea for data, we will recap a few concepts in quantum computing, which are useful to put things into perspective. The idea of creating a quantum circuit from a classical boolean function is relatively simple and can be found in standard texts in quantum computation ([@NC02] or the this section on the Lecture notes of [Dave Bacon](https://courses.cs.washington.edu/courses/cse599d/06wi/lecturenotes6.pdf)). There is a simple theoretical trick that we can use to see that for any (potentially irreversible) boolean circuit there is a reversible version for it. This observation is used to show that non-reversible circuits are *not* more powerful than reversible circuits. To recall, a reversible boolean circuit is just bijection between domain and image of the function. Let $f : \{0,1\}^m \mapsto \{0,1\}^n$ be a boolean function (which we assume is surjective, i.e. the range of $f$ is the whole $\{0,1\}^n$). We can build a circuit $f' : \{0,1\}^{m+n} \mapsto \{0,1\}^{m+n}$ by adding some ancilla qubits, as it is a necessary condition for reversibility that the dimension of the domain matches the dimension of the range of the function. We define $f'$ as the function performing the mapping $(x, y) \mapsto (x, y \oplus f(x))$. It is simple to see by applying twice $f'$ that the function is reversible (check it!). +As we briefly anticipated in Section \@ref(measuring-complexity), if we know a function that maps $x_i = f(i)$ we can create a circuit for getting query access to $x_i$. If our data is represented by the output of a function, we can consider these techniques for data loading. + -Now that we have shown that it is possible to obtain a reversible circuit from any classical circuit, we can ask: what is an (rather inefficient) way of getting a quantum circuit? Porting some code (or circuit) from two similar level of abstraction is often called *transpiling*. Again, this is quite straightforward (Section 1.4.1 [@NC02]). Every boolean circuit can be rewritten in any set of universal gates, and as we know, the NAND port is universal for classical computation. It is simple to see (check the exercise) that we can use a Toffoli gate to simulate a NAND gate, so this gives us a way to obtain a quantm circuit out of a boolean circuit made of NAND gates. With these two steps we described a way of obtaining a quantum circuit from any boolean function $f$. +The idea of creating a quantum circuit from a classical Boolean function is relatively simple and can be found in standard texts in quantum computation ([@NC02] or the this section on the Lecture notes of [Dave Bacon](https://courses.cs.washington.edu/courses/cse599d/06wi/lecturenotes6.pdf)). There is a simple theoretical trick that we can use to see that for any (potentially irreversible) Boolean circuit there is a reversible version for it. This observation is used to show that non-reversible circuits are *not* more powerful than reversible circuits. To recall, a reversible Boolean circuit is just bijection between domain and image of the function. Let $f : \{0,1\}^m \mapsto \{0,1\}^n$ be a Boolean function (which we assume is surjective, i.e. the range of $f$ is the whole $\{0,1\}^n$). We can build a circuit $f' : \{0,1\}^{m+n} \mapsto \{0,1\}^{m+n}$ by adding some ancilla qubits, as it is a necessary condition for reversibility that the dimension of the domain matches the dimension of the range of the function. We define $f'$ as the function performing the mapping $(x, y) \mapsto (x, y \oplus f(x))$. It is simple to see by applying twice $f'$ that the function is reversible (check it!). + +Now that we have shown that it is possible to obtain a reversible circuits from any classical circuit, we can ask: what is an (rather inefficient) way of getting a quantum circuit? Porting some code (or circuit) from two similar level of abstraction is often called *transpiling*. Again, this is quite straightforward (Section 1.4.1 [@NC02]). Every Boolean circuit can be rewritten in any set of universal gates, and as we know, the NAND port is universal for classical computation. It is simple to see (check the exercise) that we can use a Toffoli gate to simulate a NAND gate, so this gives us a way to obtain a quantum circuit out of a Boolean circuit made of NAND gates. With these two steps we described a way of obtaining a quantum circuit from any Boolean function $f$. ```{exercise, name="Toffoli as NAND"} -Can you prove that a Toffoli gate, along with an ancilla qubit, can be used to obtain a quantum version of the NAND gate? +Prove that a Toffoli gate, along with an ancilla qubit, can be used to obtain a quantum version of the NAND gate? ``` However, an application of the quantum circuit for $f$, will result in a garbage register of some unwanted qubits. To get rid of them we can use this trick: - \begin{equation} -\ket{x}\ket{0}\ket{0}\ket{0} \mapsto \ket{x}\ket{f(x)}\ket{k(f, x)}\ket{0}\mapsto \ket{x}\ket{f(x)}\ket{k(f, x)}\ket{f(x)} \mapsto \ket{x}\ket{f(x)} +\ket{x}\ket{0}\ket{0}\ket{0} \mapsto \ket{x}\ket{f(x)}\ket{k(f, x)}\ket{0}\mapsto \ket{x}\ket{f(x)}\ket{k(f, x)}\ket{f(x)} \mapsto \ket{x}\ket{f(x)}. +(\#eq:bennetstrick) \end{equation} -Let's explain what we did here. In the first step we apply the circuit that computes $f'$. In the second step we perform a controlled NOT operation (controlled on the third and targetting the fourth register), and in the last step we undo the application of $f'$, thus obtaining the state $\ket{x}\ket{f(x)}$ with no garbage register. +Let's explain what we did here. In the first step we apply the circuit that computes $f'$. In the second step we perform a controlled NOT operation (controlled on the third and targeting the fourth register), and in the last step we undo the application of $f'$, thus obtaining the state $\ket{x}\ket{f(x)}$ with no garbage register. -Importantly, the techniques described in the previous paragraph are far from being practical, and are only relvant didactically. The task of obtaining an efficient quantum circuit from a boolean function is called "oracle synthesis". Oracle synthesis is far from being a problem of only theoretical interest, and it has received a lot of attention in past years [@soeken2018epfl] [@schmitt2021boolean] [@shende2006synthesis]. Today software implementations can be easily found online in most of the quantum programming languages/library. For this problem we can consider different scenarios, as we might have access to the function in form of reversible Boolean functions, non-reversible Boolean function, or the description of a classical circuit. The problem of oracle syntheses is a particular case of quantum circuit synthesis (Table 2.2 of [@de2020methods] ) and is a domain of active ongoing research. +Importantly, the idea of obtaining a quantum circuit from a classical reversible circuit is not practical, and is only relevant didactically. The task of obtaining an efficient quantum circuit from a Boolean function is called "oracle synthesis". Oracle synthesis is far from being a problem of only theoretical interest, and it has received a lot of attention in past years [@soeken2018epfl] [@schmitt2021boolean] [@shende2006synthesis]. Today software implementations can be easily found online in most of the quantum programming languages/library. For this problem we can consider different scenarios, as we might have access to the function in form of reversible Boolean functions, non-reversible Boolean function, or the description of a classical circuit. The problem of oracle syntheses is a particular case of quantum circuit synthesis (Table 2.2 of [@de2020methods] ) and is a domain of active ongoing research. - + -Long story short, if we want to prove the runtime of a quantum algorithm in terms of gate complexity (and not only number of queries to an oracle computing $f$) we need to keep track of the gate complexity of the quantum circuits we use. For this we can use the following theorem. +If we want to prove the runtime of a quantum algorithm in terms of gate complexity (and not only number of queries to an oracle computing $f$) we need to keep track of the gate complexity of the quantum circuits we use. For this we can use the following theorem. (ref:buhrman2001time) [@buhrman2001time] @@ -260,17 +501,24 @@ Long story short, if we want to prove the runtime of a quantum algorithm in term For a probabilistic classical circuit with runtime $T(n)$ and space requirement $S(n)$ on an input of length $n$ there exists a quantum algorithm that runs in time $O(T(n)^{\log_2(3)}$ and requires $O(S(n)\log(T(n))$ qubits. ``` -What if we want to use a quantum circuit to have quantum access to a vector of data? It turns out that we can do that, but the simplest circuit that we can come up with, has a depth that is linear in the length of the vector. This circuit (which sometimes goes under the name QROM [@hann2021resilience] or multiplexer, is as follow: +#### Circuits: the multiplexer{#sec:implementation-multiplexer} +What if we want to use a quantum circuit to have quantum access to a vector of data? It turns out that we can do that, but the simplest circuit that we can come up with, has a depth that is linear in the length of the vector. This kind of circuit is often used in literature, e.g. for computing functions using space-time trade-offs [@krishnakumar2022aq;@gidney2021factor]. This circuit (which sometimes goes under the name QROM, or circuit for table lookups [@hann2021resilience]) or multiplexer, is as follow: -```{r, echo=FALSE, fig.width=3, fig.cap="This is the multiplexer circuit for the list of values x=[1,1,0,1]. Indeed, if we initialize the first two qubits with zeros, the output of the previous circuit will be a 1 in the third register, and so on.", } +```{r, multiplexer, echo=FALSE, fig.width=10, fig.cap="This is the example of a multiplexer circuit for the list of values x=[1,1,0,1]. Indeed, if we initialize the first two qubits with zeros, the output of the previous circuit will be a 1 in the third register, and so on."} knitr::include_graphics("images/multiplexer.png") ``` -The idea of the circuit is the following: controlled on the index register being in the state $\ket{0}$, we write (using CNOTS) in the output register the value of our vector in position $x_0$, controlled in the index register being $\ket{1}$, we write on the output register the value of our vector in position $x_1$, etc.. This will result in a circuit with a depth that is linear in the length of the vector that we are accessing, however this circuit won't require any ancilla qubit. We will discuss more some hybrid architecture that allows a tradeoff between depth and ancilla qubits in Section \@ref(sec:qramarchitectures). +```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]"} +knitr::include_graphics("images/decomposed-lookup.pdf") +``` + +The idea of the circuit is the following: controlled on the index register being in the state $\ket{0}$, we write (using CNOTS) in the output register the value of our vector in position $x_0$, controlled in the index register being $\ket{1}$, we write on the output register the value of our vector in position $x_1$, etc.. This will result in a circuit with a depth that is linear in the length of the vector that we are accessing, however this circuit won't require any ancilla qubit. We will discuss more some hybrid architecture that allows a trade off between depth and ancilla qubits in Section \@ref(sec:qramarchitectures). The Toffoli count of this circuit can be improved in various ways [@babbush2018encoding;@zhu2024unified]. Importantly, the depth of this circuit depends on the number of oracle entries $N$, and in simple implementations depends also linearly in $m$. + + -#### Sparse access model {#subsec:sparse-access-model} -The sparse access model is often used to work with matrices and graphs. Sparse matrices are very common in quantum computing and quantum physics, so it is important to formalize a quantum access for sparse matrices. This model is sometimes called in literature "sparse access" to a matrix, as sparsity is often the key to obtain an efficient circuit for encoding such structures without a QRAM. Of course, with a vector or a matrix stored in a QRAM, we can also have efficient (i.e. in time $O(\log(n))$ if the matrix is of size $n \times n$) query access to a matrix or a vector, even if they are not sparse. It is simple to see how we can generalize query access to a list or a vector to work with matrices by introducing another index register to the input of our oracle. For this reason, this sparse access is also called quite commonly "query access". +#### Circuits: sparse access{#sec:implementation-sparse-access} +Sparse matrices are very common in quantum computing and quantum physics, so it is important to formalize a quantum access for sparse matrices. This model is sometimes called in literature "sparse access" to a matrix, as sparsity is often the key to obtain an efficient circuit for encoding such structures without a $\mathsf{QRAM}$. Of course, with a vector or a matrix stored in a $\mathsf{QRAM}$, we can also have efficient (i.e. in time $O(\log(n))$ if the matrix is of size $n \times n$) query access to a matrix or a vector, even if they are not sparse. It is simple to see how we can generalize query access to a list or a vector to work with matrices by introducing another index register to the input of our oracle. For this reason, this sparse access is also called quite commonly "query access". ```{definition, oracle-access-adjacencymatrix, name="Query access to a matrix"} Let $V \in \mathbb{R}^{n \times d}$. There is a data structure to store $V$, (where each entry is stored with some finite bits of precision) such that, a quantum algorithm with access to the data structure can perform $\ket{i}\ket{j}\ket{z} \to \ket{i}\ket{j}\ket{z \oplus v_{ij}}$ for $i \in [n], j \in [d]$. @@ -283,146 +531,227 @@ Let $V \in \mathbb{R}^{n \times d}$, there is an oracle that allows to perform t - $\ket{i}\mapsto\ket{i}\ket{d(i)}$ where $d(i)$ is the number of non-zero entries in row $i$, for $i \in [n]$, and - $\ket{i,l}\mapsto\ket{i,l,\nu(i,l)}$, where $\nu(i,l)$ is the $l$-th nonzero entry of the $i$-th row of $V$, for $l \leq d(i)$. - ``` -The previous definition is also called *adiacency array* model. The emphasis is on the word *array*, contrary to the adjacency list model in classical algorithms (where we usually need to go through all the list of adjacency nodes for a given node, while here we can query the list as an array, and thus use superposition) [@Durr2004]. +The previous definition is also called *adjacency array* model. The emphasis is on the word *array*, contrary to the adjacency list model in classical algorithms (where we usually need to go through all the list of adjacency nodes for a given node, while here we can query the list as an array, and thus use superposition) [@Durr2004]. -It's important to recall that for Definition \@ref(def:oracle-access-adjacencymatrix) and \@ref(def:oracle-access-adjacencylist) we could use a QRAM, but we also expect **not** to use a QRAM, as there might be other efficient circuit for performing those mapping. For instance, when working with graphs (remember that a generic weighted and directed graph $G=(V,E)$ can be seen as its adjacency matrix $A\in \mathbb{R}^{|E| \times |E|}$), many algorithms call Definition \@ref(def:oracle-access-adjacencymatrix) **vertex-pair-query**, and the two mappings in Definition \@ref(def:oracle-access-adjacencylist) as **degree query** and **neighbor query**. When we have access to both queries, we call that **quantum general graph model** [@hamoudi2018quantum]. This is usually the case in all the literature for quantum algorithms for Hamiltonian simulation, graphs, or algorithms on sparse matrices. +It's important to recall that for Definition \@ref(def:oracle-access-adjacencymatrix) and \@ref(def:oracle-access-adjacencylist) we could use a $\mathsf{QRAM}$, but we also expect **not** to use a $\mathsf{QRAM}$, as there might be other efficient circuit for performing those mapping. For instance, when working with graphs (remember that a generic weighted and directed graph $G=(V,E)$ can be seen as its adjacency matrix $A\in \mathbb{R}^{|E| \times |E|}$), many algorithms call Definition \@ref(def:oracle-access-adjacencymatrix) **vertex-pair-query**, and the two mappings in Definition \@ref(def:oracle-access-adjacencylist) as **degree query** and **neighbor query**. When we have access to both queries, we call that **quantum general graph model** [@hamoudi2018quantum]. This is usually the case in all the literature for quantum algorithms for Hamiltonian simulation, graphs, or algorithms on sparse matrices. -The interested reader can watch [here](http://www.ipam.ucla.edu/abstract/?tid=17251&pcode=QL2022) how to create block-encodings from sparse access. -### Quantum sampling access {#q-sampling-access} +#### Bucket brigade circuits {#sec:implementation-bbrigade} +The Bucket brigade(BB) architecture (Fig 10 [@hann2021resilience]) is another possible implementation of binary encoding which, differently to the other presented methods, requires the $\mathsf{QMD}$ model of computation of definition \@ref(def:QPUQMD). This protocol was originally developed to be implemented with qutrits [@giovannetti2008quantum] but recent work has shown it can be implemented with qubits as well [@hann2021resilience]. We'll focus on the explanation with qutrits since it is more intuitive to understand. -Let's suppose now that we want to have an oracle that can be used to create quantum states proportional to a set of vectors that we have. In other words, we are considering an amplitude encoding of vectors, as discussed in Section \@ref(subsec-stateprep-matrices). We can have two similar models, that we call both *quantum sampling access*. This name comes from the fact that measuring the output state can be interpreted as sampling from a probability distribution. Historically, it was first discussed the procedure to create quantum state proportional to (discretized) probability distribution, and then this idea was reused in the context of creating quantum states proportional to vectors (the generalization to matrices follows very simply). We treat first the case where we want to create quantum sampling access to rows of a matrix, as it is much simpler to understand. +Using the terminology introduced in definition \@ref(def:QPUQMD), we'll have: an address register, a target register (which will be referred to as a bus register) and a memory register. The input will be a vector of binary numbers $X \in (\{0,1\}^m)^n$ and the aim is to load a specific entry $X_i \in \{0,1\}^m$ on the bus register. -#### Sampling access to vectors and matrices +The BB protocol will use the memory register in such a way that it has access to tree like structure. The tree saves the entries of $X$ in the leaves, which are referred to as memory cells. Each memory cell is connected to a parent node which form a set of intermediate nodes up until the root of the tree. Each intermediate node (up to the root) is called a quantum router (Figure 1b of [@hann2021resilience]) and is a qutrit (i.e., a three level quantum system), which can be in state $\ket{0}$ (route left), $\ket{1}$ (route right), and $\ket{W}$ (wait). -Let's recall that for a matrix $X \in \mathbb{R}^{n \times d}$ (where we assume that $n$ and $d$ are powers of $2$, otherwise we can just consider the matrix padded with zeros) with rows $x_i$, want to create the state +When we want to perform a query, we prepare the address register with the index of the memory cell that we want to reach and we set all the router registers to the $\ket{W}$ state. Conditioned on the first qubit of the address register, the root of the tree changes from $\ket{W}$ to either $\ket{0}$(left) or $\ket{1}$(right). This is followed by a similar operation which uses as control the second qubit of the address register to change the state of the next node in the tree to either $\ket{0}$ or $\ket{1}$. The process of changing the state of the routers is repeated until the last layers of the tree(i.e. the memory cell) is reached. Now, the memory register will be in the state of the binary number $X_i$. This can be copied to the bus register by simply applying a series of CNOT gates (and thus we do not violate the no-cloning theorem). + +Studying an error model of the BB architecture is hard. An attempt was first made in [@arunachalam2015robustness] which gave initial, but rather pessimistic result. More recently, a series of developments in [@hann2021resilience] and [@hann2021practicality] (accessible [here](https://www.proquest.com/openview/c5caf76bb490e4d3abbeca2cea16b450/1?pq-origsite=gscholar&cbl=18750&diss=y)) have shone light on the noise resilience of the BB $\mathsf{QRAM}$. The results presented in these more recent works are much more positive. Some resource estimations can be found in [@di2020fault], which do not take into account the new developements in the study of the error. + +The metric of choice to test whether a quantum procedure has faithfully recreated a desired state is the fidelity $F$, with the infidelity defined as $1-F$. Given a addressable memory of size $N$(i.e. $\log N$ layers in the binary tree) and a bucket brigade which requires $T$ time-steps with a probability of error per time step of $\epsilon$, the infidelity of the bucket brigade scales as: \begin{equation} -\frac{1}{\sqrt{\sum_{i=1}^n {\left \lVert x_i \right \rVert}^2 }} \sum_{i=1}^n {\left \lVert x_i \right \rVert}\ket{i}\ket{x_i} - (\#eq:matrix-state) +1-F \approx \sum_{l=1}^{\log N} (2^{-l}) \epsilon T2^{l} = \epsilon T \log N, +(\#eq:qramfidelity) \end{equation} -We will do it using two mappings: +```{exercise} +Calculate $\sum_{l=1}^{\log N} l$ +``` +The time required to perform a query, owing to the tree structure of the BB, is $T=O(\log N)$. This can be seen trivially from the fact that $T \approx \sum_{l=0}^{\log N -1 } l = \frac{1}{2}(\log N)(\log N +1)$, but can be decreased to $O(\log N)$ (Appendix A of [@hann2021resilience]). This leaves us with the sought-after scaling of the infidelity of $\widetilde{O}(\epsilon)$ where we are hiding in the asymptotic notation the terms that are polylogarithmic in $N$. The error that happen with probability $\epsilon$ can be modeled with Kraus operators makes this error analysis general and realistic (Appendix C [@hann2021resilience]), and is confirmed by simulations. For a proof of Equation \@ref(eq:qramfidelity) see Section 3 and Appendix D of [@hann2021resilience]. -\begin{equation} -\ket{i}\mapsto \ket{i}\ket{x_i} -\end{equation} -\begin{equation} -\ket{0}\mapsto \ket{N_X} -\end{equation} -where $N_X$ is the vector of $\ell_2$ norms of the rows of the matrix $X$, i.e. $\ket{N_X}=\frac{1}{\|X\|_F} \sum_{i=0}^n \|x_i\| \ket{i}$. Note that these two quantum states are just amplitude encodings of vectors of size $d$ and a vector of size $n$. It is very simple to see that if we are given two unitaries performing these two mappings, we can obtain equation \@ref(eq:matrix-state) by applying the two unitaries sequentially: +```{r, bb-qram-image, echo=FALSE, fig.width=5, fig.cap="A possible implementation of the bucket-brigade QRAM in the circuit model."} +knitr::include_graphics("algpseudocode/circuit_bb.png") +``` -\begin{equation} -\ket{0}\ket{0}\mapsto\ket{N_X}\ket{0}\mapsto \frac{1}{\|X\|_F} \sum_{i=1}^n {\left \lVert x_i \right \rVert}\ket{i}\ket{x_i} -\end{equation} +(ref:doriguello2024practicality) [@doriguello2024practicality] -This reduces our problem to create an amplitude encoding of a given vector. In the PhD thesis of Prakash [@PrakashPhD] we can find the first procedure to efficiently create superpositions corresponding to vectors, and the generalization on how to do this for the rows of the matrices, i.e. encoding the values of the components of a matrix' row in the amplitudes of a quantum state. This this data structure, which sometimes could go under the name KP-trees [@rebentrost2018quantum], but is more and more often called **quantum sampling access**, assumes and extends definition \@ref(def:qram). Confusingly, in some papers both are called QRAM, and both rely on two (different) tree data structure for their construction. One is a hardware circuit arranged as a tree that allows to perform the mapping in \@ref(def:qram), the other is a classical data structure arranged as a tree that stores the partial norms of the rows of the matrix, which we will discuss now. We will use the following as definition, but this is actually a theorem. For the original proof, we refer to [@PrakashPhD], the appendix A of [@KP16], and the proof of Theorem 1 of [@CGJ18]. -(ref:KP16) [@KP16] + + + -```{definition, KP-trees, name="Quantum access to matrices using KP-trees - Quantum sampling access (ref:KP16)"} -Let $V \in \mathbb{R}^{n \times d}$, there is a data structure (sometimes called KP-trees) to store the rows of $V$ such that, + -- The size of the data structure is $O(\|V\|_0 \log^(nd))$. -- The time to insert, update or delete a single entry $v_{ij}$ is $O(\log^{2}(n))$. -- A quantum algorithm with access to the data structure can perform the following unitaries in time $O(\log^{2}n)$. - - $\ket{i}\ket{0} \to \ket{i}\ket{v_{i}} \forall i \in [n].$ - - $\ket{0} \to \sum_{i \in [n]} \norm{v_{i}}\ket{i}.$ +The following statement gives a resource estimation for a QRAM of logarithmic depth using the quantum architecture proposed in [@litinski2022active]. +```{lemma, bb-qram-resources, name="Complexity of QRAM using (ref:doriguello2024practicality)"} +One bucket-brigade $\mathsf{QRAM}$ call of size $2^n$ and precision $\kappa$ requires (already including its uncomputation) $2^n - 2$ $\mathsf{Toffoli}$ gates, $2^{n+1} - n - 1$ dirty ancillae (plus $n+\kappa$ input/output qubits), and has $\mathsf{Toffoli}$-width of $2^{n-1}$, reaction depth of $2(n-1)$, and active volume of $(25 + 1.5\kappa + C_{|CCZ\rangle})2^n$. ``` -```{proof} -We start our proof by assuming that we have already given the whole matrix $V$, and at the end we comment on the second point of the theorem (i.e. the time needed to modify the data structure). -The data structure is composed of $n+1$ binary trees, one for each row of the matrix, and an additional one for the vectors of norms of the rows. Each tree is initialyl empty, and is constructed in a way so to store the so-called partial norms (squared) of a row of $V$. For the $i$-th row $v_i$ we build the binary tree $B_i$. Assume, w.l.o.g. that $d$ is a power of $2$, so that there are $\log(d)$ layers of a tree. In the leaves we store the tuple $(v_{ij}^2, \text{sign}(v_{ij}))$, and in each of the internal nodes we store the sum of the two childrens. It is simple to see that the root of the tree stores $\|v_i\|_2^2$. The layer of a tree is stored as a\footnote{ordered? typo in original paper?} list -We show how to perform the first unitary. For a tree $B_i$, the value stored in a node $k \in \{0,1\}^k$ at level $k$ is $\sum_{j \in [d], j_{1:t}=k} A_{ij}^2$. +### Amplitude encoding{#sec:implementation-amplitude} -The rotation can be performed by querying the values $B_{ik}$ from the QRAM as follows: - - \begin{align} -\ket{i}\ket{k}\mapsto\ket{i}\ket{k}\ket{\theta_{ik}}\mapsto \\ -\ket{i}\ket{j}\ket{\theta_{ik}}\left(\cos(\theta_{ik})\ket{0} + \sin(\theta_{ik})\ket{1} \right) \mapsto \\ -\ket{i}\ket{j}\left(\cos(\theta_{ik})\ket{0} + \sin(\theta_{ik})\ket{1} \right) -\end{align} +We now move our attention to amplitude encoding, which was first introduced in section \@ref(sec:amplitude-encoding). In amplitude encoding, we encode a vector of numbers in the amplitude of a quantum state. Implementing a quantum circuit for amplitude encoding can be seen as preparing a specific quantum states, for which we know the amplitudes. In other words, this is actually a *state preparation problem* in disguise, and we can use standard state preparation methods to perform amplitude encoding. However, note that amplitude encoding is a specific example of state preparation, when the amplitudes of the state are known classically or via an oracle. There are other state preparation problems that are not amplitude encoding, like ground state preparation, where the amplitudes of the quantum state is not known and only the Hamiltonian of the system is given. In the following, we briefly discuss the main techniques developed in the past decades for amplitude encoding. + + + + + +What are the lower bounds for the size and depth complexity of circuits performing amplitude encoding? Since amplitude encoding can be seen as a quantum state preparation, without assuming any kind of oracle access, we have a lower bound of $\Omega\left(2^n\right)$ [@plesch2011quantum;@shende2004minimal]. For the depth, we have a long history of results. For example, there is a lower bound of $\Omega(\log n)$ that holds for some states (and hence puts a lower bound on algorithms performing generic state preparation ) using techniques from algebraic topology [@aharonov2018quantum]. Without ancilla qubits [@plesch2011quantum] proposed a bound of $\Omega(\frac{2^n}{n})$. The bound on the depth has been refined to a $\Omega(n)$, but only when having arbitrarily many ancilla qubits [@zhang2021lowdepth]. The more accurate bound is of $\Omega\left( \max \{n ,\frac{4^n}{n+m} \} \right )$ (Theorem 3 of [@STY-asymptotically]), where $m$ is the number of ancilla qubits. The algorithms of [@yuan2023optimal], which we discuss later, saturates this bound. + + +We can also study the complexity of the problem in the oracle model. For example, if we assume an oracle access to $f : \{0,1\}^n \mapsto [0,1]$, using amplitude amplification techniques on the state $\sum_x \ket{x}\left(f(x)\ket{0} + \sqrt{1-f(x)}\ket{1} \right)$, there is a quadratic improvement in the number of queries to the oracle, yielding $\widetilde{O}(\sqrt{N})$ complexity [@grover2000synthesis], where $N = 2^n$. This can be seen if we imagine a vector with only one entry with the value $1$, where the number of queries to amplify the subspace associated with the rightmost qubit scales with $\sqrt{N}$. Few years later, we find another work by [@Grover2002] which, under some mildly stronger assumptions improved the complexity of the algorithms for a very broad class of states. This algorithm is better discussed in Section \@ref(sec:implementation-grover-rudolph). + + +Alternatively, we can assume a direct oracle access to the amplitudes [@sanders2019black]. Under this assumption, we have access to an oracle storing the $i$th amplitude $\alpha_i$ with $n$ bits, (actually, they use a slightly different model, where the oracle for the amplitude $\alpha_i$ is $\ket{i}\ket{z}\mapsto \ket{i}\ket{z \oplus \alpha_i^{(n)}}$ where $\alpha_i^{(n)}=\lfloor 2^n\alpha_i \rfloor$). Ordinarily, the circuit involves the mapping $\ket{i}\ket{\alpha_i^{(n)}}\ket{0} \mapsto \ket{i}\ket{\alpha_i} \left(\sin(\theta_i)\ket{0} + \cos(\theta_i)\ket{1}\right)$, which requires control rotations and arithmetic circuits to compute the angles $\theta_i = \arcsin(\alpha_i/2^n)$. However, by substituting the arithmetic circuit by a comparator operator [@gidney2018halving;@cuccaro2004new;@luongo2024measurement], the circuit can be implemented either with $2n$ non-Clifford gates or $n$ non-Clifford gates and $n$ ancilla qubits. This scheme can even be extended to encode complex amplitudes in both Cartesian and polar forms, or apply to the root coefficient problem of real amplitudes, where we have an oracle access to the square of the amplitude $\alpha_i^2$ instead of $\alpha_i$. For positive or complex amplitudes, this algorithm involves $\frac{\pi}{4}\frac{\sqrt{N}}{\|\alpha\|_2}$ exact amplitude amplifications, so it has a runtime of $\frac{\pi}{4}\frac{t\sqrt{N}}{\|\alpha\|_2} + O(1)$ non-Clifford gates, where $t$ is the number of bits of precision used to specify an amplitude (the authors preferred to count the number of non-Clifford gates, as they are the most expesive one to implement in (most of) the error corrected architectures, and serves as a lower bound for the size complexity of a circuit. For the root coefficient problem, the runtime becomes $\frac{\pi}{4} \frac{n\sqrt{N}}{\|\alpha\|_1} + O\left(n \log \left(\frac{1}{\epsilon}\right)\right)$ non-Clifford gates. For certain sets of coefficients, this model can further be improved to reduce the number of ancilla qubits needed per bits of precision from a linear dependence [@sanders2019black] to a log dependence (Table 2 of [@bausch2022fast]). Also the work of [@mcardle2022quantum] doesn't use arithmetic, and uses $O(\frac{n d_\epsilon}{\mathcal{F}_{\widetilde{f}^{[N]}} })$ (where $\widetilde{f}^{[N]}$ is called "discretized $\ell_2$-norm filling-fraction", and $d_\epsilon$ is the degree of a polynomial approximation that depends on $\epsilon$, the approximation error in the quantum state ) and uses only $4$ ancilla qubits. define $f$ before here. + + + + + + + +Instead of treating the problem as a state preparation problem, we can also perform amplitude encoding using multivariable quantum signal processing (M-QSP) (See Chapter \@ref(chap:5)). The principle behind this method is to interpret the amplitude of a quantum state as a function of a multivariable polynomial [@mcardle2022quantum;@mori2024efficient;@rosenkranz2024quantum]. Particularly, using Linear Combination of Unitaries techniques, we can approximate the quantum state as a multivariable function by a truncated Fourier or Chebyshev series [@rosenkranz2024quantum]. The truncated Fourier series approximation requires $O(d^D + Dn \log d)$ two-qubit gates, while the truncated Chebyshev series approximation requires $O(d^D + Ddn \log n)$ two-qubit gates, where $D$ is the number of dimensions and $d$ is the degree of the polynomial used in the approximation. The number of qubits in both techniques scales as $O(Dn + D \log d)$. The exponential dependence in $D$ can further be improved by the following theorems. -The second unitary can be obtained exactly as the first one, observing that we are just doing an amplitude encoing of a vector of norms. Hence, we just need to build the $i+1$-th binary tree storing the partial norms of the vector of the amplitudes, where the number of leaves is $n$. + + -We now focus on the modification of the data structure. -# TODO +(ref:mori2024efficient) [@mori2024efficient] +```{theorem, bivariate-sp, name="Bivariate state preparation (ref:mori2024efficient)"} +Given a Fourier series $f$ of degree $(d_1, d_2)$ that can be constructed with M-QSP, we can prepare a quantum state $\ket{\psi_f}$ using $O((n_1d_1 + n_2d_2)/\mathcal{F}_f)$ gates, where $\mathcal{F}_f = \mathcal{N}_f/( \sqrt{N_1N_2}|f|_{max})$, $\mathcal{N}_f = \sqrt{\sum_{i,j} (f(x_1^{(i)}), f(x_2^{(j)}) )}$, whereas $n_1$ and $n_2$ are the number of bits used to specify the value of the variable $x_1$ and $x_2$, respectively. +``` + +```{theorem, multivariate-sp, name="Multivariate state preparation (ref:mori2024efficient)"} +Given a Fourier series $f$ of degree $(d_1, \dots, d_D)$ that can be constructed with multivariate quantum signal processing, we can prepare a quantum state $\ket{\psi_f}$ using $O(n d D/\mathcal{F}_f)$ gates, where $n=\max (n_1, \dots, n_D)$ and $d=\max (d_1, \dots, d_D)$ ``` + +check asymptotics in following paragraph -The following exercise might be helpful to clarify the relation between quantum query access to a vector and quantum sampling access. +Meanwhile, if trade-offs are allowed for state preparation, we can further improve the complexity of the algorithm. For example, we can build a state over $n$ qubits with depth $\widetilde{O}\left(\frac{2^n}{m+n} +n\right)$ and size $\widetilde{O}\left(2^n \right)$ if we have $m$ available ancillas [@STY-asymptotically]. On the other hand, we can reduce the number of $T$-gates to $O(\frac{N}{\lambda} + \lambda \log \frac{N}{\epsilon}\log \frac{\log N}{\epsilon})$ if we allow a tunable number of $\lambda \frac{\log N}{\epsilon}$ dirty qubits [@low2018trading]. A dirty qubit is an auxiliary qubit that is left entangled with another register at the end of computation. It cannot be reused by subsequent computations without being disentangled. -```{exercise} -Suppose you have quantum access to a vector $x = [x_1, \dots, x_N]$, where each $x_i \in [0,1]$. What is the cost of creating quantum sampling access to $x$, i.e. the cost of preparing the state $\frac{1}{Z}\sum_{i=1}^N x_i \ket{i}$. Hint: query the state in superposition and perform a controlled rotation. Can you improve the cost using amplitude amplification? What if $x_i \in [0, B]$ for a $B > 1$? + + + + + + + + + +In addition to the algorithms [@STY-asymptotically;@rosenthal2021query], trade-offs can introduce additional circuits that can achieve the lower bound of the depth complexity. For example, using $O \left(2^n\right)$ ancilla qubits, we can perform amplitude encoding with circuit depth $\Theta \left( n \right)$, which further relaxes the connectivity requirements for M-QSP [@zhang2022quantum]. This technique also improves upon sparse state preparation, with a circuit depth $\Theta \left( \log k N \right)$, where $k$ is the sparsity. This represents an exponential improvement in circuit depth over previous works [@gleinig2021efficient;@de2022double]. This leads to a deterministic algorithm that achieves the lower bounds in circuit depth if we allow $m$ ancilla qubits, which is summarized in the following theorem. + + + +(ref:yuan2023optimal) [@yuan2023optimal] + + +```{theorem, circuit-csp, name="Circuit for controlled state preparation (Theorem 1 of (ref:yuan2023optimal)) "} +For any $k \in \mathbb{N}$ and quantum states $\{ \ket{\psi_i} | i \in \{0,1\}^k \}$ there is a circuit performing +$$ \ket{i}\ket{0} \mapsto \ket{i}\ket{\psi_i}, \forall i \in \{0,1\}^k, $$ + which can be implemented by a circuit of depth $O(n + k + \frac{2^{n+k}}{n+k+m})$ and size $O(2^{n+k})$ with $m$ ancillary qubits. These bounds are optimal for any $m,k \geq 0$. ``` -Lower bounds in query complexity can be used to prove that the worst case for performing state preparation with the technique used in the exercise (i.e. without KP-trees/quantum sampling access) are $O(\sqrt{N})$. +```{theorem, circuit-sp, name="Circuit for state preparation (Theorem 2 of (ref:yuan2023optimal)) "} +For any $m > 0$, any $n$-qubit quantum state $\ket{\psi_v}$ can be generated by a quantum circuit using single qubit gates and CNOT gates, of depth $O(n+ \frac{2^n}{n+m}$) and size $O(2^n)$ with $m$ ancillary qubits. These bounds are optimal for any $m \geq 0$. +``` -In [@PrakashPhD] Section 2.2.1, Prakash shows subroutines for generating $\ket{x}$ for a sparse $x$ in time $O(\sqrt{\|x\|_0})$. + +There are also other trade-off techniques that can be used, like probabilistic state preparation via measurements [@zhang2021lowdepth] or approximate state preparation problem [@zhang2024parallel]. However, these techniques are beyond the scope of this chapter and will not be discussed. Interested readers can refer to the respective articles. -#### Sampling access to a probability distribution +In summary, there are many methods to perform amplitude encoding, each with different complexities through various trade-offs. In general, the data set that can be encoded using amplitude encoding lies under two main categories: (i) those discrete data that come from a vector or a matrix, or (ii) those that come from a discretized probability distribution. In literature, amplitude encoding of vectors or matrices is called state preparation via a KP-tree, while amplitude encoding of discretized probability distribution is called Grover-Rudolph (GR) state preparation [@Grover2002]. The main difference between the KP-tree method and the GR state preparation is that the KP-tree method requires a quantum memory to store some precomputed values in a data structure or a tree, while the GR state preparation does not require a quantum memory. In fact, GR state preparation is designed such that there are efficient circuits to implement the oracle in the quantum computer using \@ref(sec:implementation-oracle-synthesis). -We start with a very simple idea of state preparation, that can be traced back to two pages paper by Lov Grover and Terry Rudolph [@Grover2002]. There, the authors discussed how to efficiently create quantum states proportional to functions satisfying certain integrability condition. Let $p$ be a probability distribution. We want to create the state -\begin{equation} -\ket{\psi} = \sum_{i\in \{0,1\}^n} \sqrt{p_i}\ket{i} -\end{equation} -where the value of $p_i$ is obtained from discretizing the distribution $p_i$. (the case when $p$ is discrete can be solved with the circuits described in the previous section). We discretize the sample space $\Omega$ (check Definition \@ref(def:measure-space) ) in $N$ intervals, so that we can identify the samples $\omega$ of our random variable with the set $[N]$. To create the state $\ket{\psi}$ we proceed in $M$ steps from initial state $\ket{0}$ to a state $\ket{\psi_M}= \ket{\psi}$ that approximates $\psi$ with $2^M = N$ discretizing intervals. + + + + -To go from $\ket{\psi_m} = \sum_{i=0}^{2^m-1} \sqrt{p_i^{(m)}}\ket{i}$ to $\ket{\psi_{m+1}} = \sum_{i=0}^{2^{m+1}-1} \sqrt{p_i^{(m+1)}}\ket{i}$ + -We proceed as in the previous section, i.e. we query an oracle that gives us the angle $\theta_i$, that are used to perform the controlled rotation: +: Table of different methods to implement amplitude encoding, together with the their gate count and ancilla complexity, along with the function type needed. This table is adapted from [@mori2024efficient], + to integrate with Table 1 of (https://arxiv.org/pdf/1812.00954.. first 3 rows). 1 [@mori2024efficient], 2 [@Grover2002], 3 [@rattew2022preparing-arbitrary] 4 [@sanders2019black;@bausch2022fast] 5 [@moosa2023linear] 6 [@rosenkranz2024quantum] 7 [@shende2006synthesis] 8 [@STY-asymptotically]. + + +| | Method | Gate count | Ancilla | Depth | Function type | +|:-:|:-----------:|:--------------------------------------:|:---------------:|:-------------------:|:---:| +| 1 | M-SQP | $O(\frac{ndD}{\mathcal{F}})$ | 1 | | | +| 2 | GR | $O(nT_{oracle})$ | $O(t_{oracle})$ | log | Eff. int. | +| 3 | Adiabatic | $O(\frac{T_{oracle}}{\mathcal{F}^4})$ | $O(t_{oracle})$ | - | Arb. | +| 4 | Black-box | $O(\frac{T_{oracle}}{\mathcal{F}})$ | $O(t_{oracle})$ | - | Arb. | +| 5 | FSL | $O(d^D + Dn^2)$ | 0 | - | Arb. | +| 6 | LCU-based | $O(d^D + Dn\log d)$ | $O(D \log d)$ | - | Arb. | +| 7 | Circuit | $N\log\left(\frac{N}{\epsilon}\right)$ | $O(n)$ | - | Arb. | +| 8 | Circuit | $O\left(...\right)$ | $O(m)$ | - | | + + +By looking at different models of quantum computation, we find that state preparation can be performed in constant depth assuming unbounded Fan-Out circuits (Corollary 4.2) [@rosenthal2021query]. The key idea behind this work was to link state preparation to a DNF (disjunctive normal form) boolean formula, which is evaluated in the quantum algorithm. Compiling Fan-Out gates using CNOT gates, this leads to a circuit of depth $O(n)$ and $O(n2^n)$ ancillas. State preparation can also be studied under a different lens in complexity theory, leading to new interesting insights. +For example, people studied the complexity of generating quantum states [@rosenthal2021interactive;@metger2023stateqip]. For example, the states that can be generated by a (space-uniform) polynomial-sized quantum circuit, forms the class of $\mathsf{StatePSPACE}$. This class has been proven to be equivalent to $\mathsf{StateQIP}$ (the class of states that a polynomial-time quantum verifier can generate with interactions with a all-powerful and untrusted quantum prover), echoing the equivalence between the complexity classes $\mathsf{QIP}$ and $\mathsf{PSPACE}$. + +There are many other works in state preparation, and we refer the interested reader to [@bergholm2005quantum;@plesch2011quantum;@araujo2021divide;@bausch2022fast;@rattew2022preparing-arbitrary;@plesch2011quantum;@rosenthal2021query;@zhang2022quantum;@bouland2023state;@rosenthal2023efficient;@gleinig2021efficient;@holmes2020efficient;@moosa2023linear;@zhao2021smooth]. Now we consider two very didactic and general models of quantum state preparation. The former is known as Grover-Rudolph state preparation [@Grover2002] whilst the latter is known as a state prepration via a precomputed data structure that is quantum accessible, called KP-tree. A difference between the Grover-Rudolph and the KP-tree method is that GR is assuming a query access to an oracle which does not need to be necessarily needs to be implemented with a quantum memory. While the KP-tree method assumes some precomputation of a data structure (a tree) which is specifically stored into the QRAM. In fact, for the kinds of quantum states that GR was designed to create, there are efficient circuits for the implementing the oracle, that can be implemented in a quantum computer using Section\@ref(sec:implementation-oracle-synthesis). For both, the total depth of the circuit (considering the QMD as part of the quantum computer) is $O(\log^2(N))$, while the size of the circuit is $O(N\log N)$. -\begin{equation} -\ket{i}\ket{\theta_i}\ket{0}\mapsto \ket{i}\ket{\theta_i}\left(\cos \theta_i\ket{0} + \sin \theta_i \ket{1}\right) -(\#eq:grover-rudolph) -\end{equation} -In this case, the value $\theta_i$ is obtained as $\arccos \sqrt{ f(i)}$, where $f : [2^m] \mapsto [0,1]$ is defined as: +Finally we note that in [@PrakashPhD] (Section 2.2.1), Prakash shows subroutines for generating $\ket{x}$ for a sparse $x$ in time $O(\sqrt{\|x\|_0})$. + + + + + + + + +#### Grover-Rudolph{#sec:implementation-grover-rudolph} +In [@Grover2002] the authors discussed how to efficiently create quantum states proportional to functions satisfying certain integrability condition, i.e. the function considered must be square-integrable. An example of functions with this properties are [log-concave probability distributions](https://sites.stat.washington.edu/jaw/RESEARCH/TALKS/Toulouse1-Mar-p1-small.pdf). Let $p(x)$ be a probability distribution over $\mathbb{R}$. We denote by $x_i^n$ is the points of the discretization over the domain, i.e $x_i^{(n)} = -w + 2w \frac{i}{2^n}$ for $i=0,\dots,2^n$, and $[-w,w]$ is the window of discretization, for a constant $w\in\mathbb{R}_+$. In this case, $n$ acts as the parameter that controls how coarse or fine is the discretization. Consider referencing the appendix for more informations about measure theory and probability distributions. We want to create the quantum state + +\begin{align} + |\psi_n\rangle = \sum_{i=0}^{2^n-1}\sqrt{p^{(n)}_i}|i\rangle +\end{align} +with + +\begin{align} + p_i^{(n)} = \int_{x_i^{(n)}}^{x_{i+1}^{(n)}}p(x)\text{d}x. +\end{align} + +Actually, the probabilities $p_i^{(n)}$ will be normalized by $\int_{-w}^w p(x)\text{d}x$. This is equivalent to discretizing the sample space $\Omega$ in $N=2^n$ intervals with $N+1$ points, so that we can identify the samples $\omega$ of our discretized random variable with the elements of the set $[N]$. To create the state $\ket{\psi_n}$ we proceed recursiveliy in $n$, starting from initial state $\ket{0}$. To go from $\ket{\psi_m} = \sum_{i=0}^{2^m-1} \sqrt{p_i^{(m)}}\ket{i}$ to $\ket{\psi_{m+1}} = \sum_{i=0}^{2^{m+1}-1} \sqrt{p_i^{(m+1)}}\ket{i}$ we proceed by performing a query to an oracle that gives us an angle $\theta_i$, for $i \in [2^m]$, which is used to perform the following rotation: \begin{equation} -f(i) = \frac{\int_{x^i_L}^{\frac{x_L^i+x^i_R}{2} } p(x)dx} {\int_{x^i_L}^{x^i_R} p(x)dx} +\ket{i}\ket{\theta_i}\ket{0}\mapsto \ket{i}\ket{\theta_i}\left(\cos \theta_i\ket{0} + \sin \theta_i \ket{1}\right), +(\#eq:grover-rudolph-rotation) \end{equation} -After the rotation, we undo the mapping that gaves us the $\theta_i$, i.e. we perform $\ket{i}\ket{\theta_i}\mapsto \ket{i}$. These operations resulted in the following state: +In this case, the value $\theta_i$ is defined as $\arccos \sqrt{f(i)}$, where the function $f : [2^m] \mapsto [0,1]$ is defined as: \begin{equation} -\sum_{i=0}^{2^m-1} \sqrt{p_i^{(m)}}\ket{i}\left(\cos \theta_i\ket{0} + \sin \theta_i \ket{1}\right) = \ket{\psi_{m+1}} +f(i) = \frac{\int_{x^i_L}^{\frac{x_L^i+x^i_R}{2} } p(x)dx} {\int_{x^i_L}^{x^i_R} p(x)dx}, +(\#eq:doubleintegral) \end{equation} The value of $f(i)$ is the probability that the $i$-th sample $x^i$ (which lies in the interval $[x^i_L, x^i_R]$) lines in the leftmost part of this interval (i.e. $[x^i_L, x^i_R+x^i_L/2]$). +After the rotation, we undo the mapping that gives us the $\theta_i$. These operations resulted in the following state: + +\begin{equation} +\sum_{i=0}^{2^m-1} \sqrt{p_i^{(m)}}\ket{i}\left(\cos \theta_i\ket{0} + \sin \theta_i \ket{1}\right) = \ket{\psi_{m+1}}, +(\#eq:partial-state) +\end{equation} -This method works only for efficiently integrable probability distributions, i.e. for probabiliy distribution for which the integral in Equation \@ref(eq:grover-rudolph) can be approximated efficiently. A broad class of probability distributions is the class of [log-concave probability distributions](https://sites.stat.washington.edu/jaw/RESEARCH/TALKS/Toulouse1-Mar-p1-small.pdf). +Computing the mapping for the angles $\theta_i$ can be done efficiently only for square-integrable probability distributions, i.e. for probability distribution for which the integral in Equation \@ref(eq:grover-rudolph-rotation) can be approximated efficiently. Fortunately, this is the case for most of the probability distribution that we care about. -##### The problem with Grover-Rudolph. +##### The problem (and solutions) with Grover-Rudolph{#sec:implementation-problem-gr} Creating quantum sample access to a probability distribution is a task often used to obtain quadratic speedups. A recent work [@herbert2021no] pointed out that in certain cases, the time needed to prepare the oracle used to create $\ket{\psi}$ might cancel the benefits of the speedup. This is the case when we don't have an analytical formulation for integrals of the form $\int_a^b p(x)dx$, and we need to resort to numerical methods. -Often quantum algorithms we want to estimate expected values of integrals of this form $\mathbb{E}[x] := \int_x x p(x) dx$ (e.g. see Chapter \@ref(chap-montecarlo)), Following a garbage-in-garbage-out argument, [@herbert2021no] was able to show that if we require a precision $\epsilon$ in $\mathbb{E}[x]$, we also need to require the same kind of precision for the state preparation of our quantum computer. In particular, in our quantum Monte Carlo algorithms we have to create a state $\ket{\psi}$ encoding a (discretized) version of $p(x)$ as $\ket{\psi}=\sum_{i=0}^{2^n-1} \sqrt{p(i)}\ket{i}$. +Often in quantum algorithms we want to estimate expected values of integrals of the form $\mathbb{E}[x] := \int_x x p(x) dx$ (e.g. see Chapter \@ref(chap-montecarlo)), Following a garbage-in-garbage-out argument, [@herbert2021no] was able to show that if we require a precision $\epsilon$ in $\mathbb{E}[x]$, we also need to require the same kind of precision for the state preparation of our quantum computer. In particular, in our quantum Monte Carlo algorithms we have to create a state $\ket{\psi}$ encoding a (discretized) version of $p(x)$ as $\ket{\psi}=\sum_{i=0}^{2^n-1} \sqrt{p(i)}\ket{i}$. Let's define $\mu$ as the mean of a probability distribution $p(x)$ and $\widehat{\mu}=\mathbb{E(x)}$ be an estimate of $\mu$. The error of choice for this kind of problem (which comes from applications that we will see in Section \@ref(chap-montecarlo) ) is called the Root Mean Square Error (RMSE), i.e. $\widehat{\epsilon} = \sqrt{\mathbb{E}(\widehat{\mu}- \mu)}$. -The proof shows that an error of $\epsilon$ in the first rotation of the GR algorithm, due to an error in the computation of the first $f(i)$, would propagate in the final error of the expected value of $\mu$. To avoid this error, we should compute $f(i)$ with accuracy at least $\epsilon$. The best classical algorithms allows us to perform this step at a cost of $O(\frac{1}{\epsilon^2})$, thus canceling the benefits of a quadratic speedup. +The proof shows that an error of $\epsilon$ in the first rotation of the GR algorithm, due to an error in the computation of the first $f(i)$, would propagate in the final error of the expected value of $\mu$. To avoid this error, we should compute $f(i)$ with accuracy at least $\epsilon$. The best classical algorithms allows us to perform this step at a cost of $O(\frac{1}{\epsilon^2})$, thus canceling the benefits of a quadratic speedup. Mitigating this problem is currently active area of research. @@ -430,138 +759,455 @@ The proof shows that an error of $\epsilon$ in the first rotation of the GR algo + -Mitigating this problem is currently active area of research. - +If we resrict ourselves to considering loading probabilities from a Gaussian distributions then we can use the following approaches. +##### The solution: Pre-computation +TODO SAY THAT WE DO GAUSSIAN THINGS. +We must compute integrals of the form +\begin{align*} + \int_{x_i^{(m)}}^{x_{i+1}^{(m)}}\frac{1}{\sigma\sqrt{\pi}}e^{-x^2/\sigma^2}\text{d}x = \int_{x_i^{(m)}/\sigma}^{x_{i+1}^{(m)}/\sigma}\frac{1}{\sqrt{\pi}}e^{-x^2}\text{d}x +\end{align*} -## Block encodings +for $x_i^{(m)} = -w\sigma + 2w\sigma\frac{i}{2^m}$ with $i=0,\dots,2^m$ and $m=1,\dots,n$. But this is equivalent to computing $\int_{x_i^{(m)}}^{x_{i+1}^{(m)}}\frac{1}{\sqrt{\pi}}e^{-x^2}\text{d}x$ for $x_i^{(m)} = -w + 2w\frac{i}{2^m}$, i.e., for $\sigma=1$, which can be done beforehand with high precision and classically stored. The above iterative construction is thus efficient. -In this section we discuss another kind of model for working with a matrix in a quantum computer. More precisely, we want to encode a matrix into a unitary (for which we have a quantum circuit). As it will become clear in the next chapters, being able to perform such encoding unlocks many possibilities in terms of new quantum algorithms. + + + + + + + -```{definition, name="Block encodings"} -Let $A \in \mathbb{R}^{N \times N}$ be a square matrix for $N = 2^n$ for $n\in\mathbb{N}$, and let $\alpha \geq 1$. For $\epsilon > 0$, we say that a $(n+a)$-qubit unitary $U_A$ is a $(\alpha, a, \epsilon)$-block-encoding of $A$ if + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#### KP-Trees{#sec:implementation-KPtrees} +TODO need some introduction + +Let's recall that for a matrix $X \in \mathbb{R}^{n \times d}$ (where we assume that $n$ and $d$ are powers of $2$, otherwise we can just pad the matrix with zeros) with rows $x_i$, an amplitude encoding is the state: + +\begin{equation} +\ket{X} = \frac{1}{\sqrt{\sum_{i=1}^n {\left \lVert x_i \right \rVert}^2 }} \sum_{i=1}^n {\left \lVert x_i \right \rVert}\ket{i}\ket{x_i}, + (\#eq:matrix-state) +\end{equation} + +Where $\sqrt{\sum_{i=1}^n \left \lVert x_i \right \rVert^2} = \left \lVert X \right \rVert$. + + + -$$\| A - \alpha ( \bra{0} \otimes I)U_A (\ket{0} \otimes I) \| \leq \epsilon$$ + +Note that equation \@ref(eq:matrix-state) is just an amplitude encodings of vectors of size $d$ and a vector of size $n$, which reduces the problem of creating an amplitude encoding of a matrix to creating the amplitude encoding of a series of vectors. The PhD thesis by Prakash [@PrakashPhD] introduced the first procedure to efficiently perform the amplitude encoding of a matrix using a tree like classical data structure. Given an incoming matrix $V \in \mathbb{R}^{n \times d}$ the procedure, which was named KP-trees by Rebentrost in [@rebentrost2018quantum] after the authors Kerenidis and Prakash, creates a data structure with size scaling $\widetilde{O}(|V|_0)$ and where the time to update the tree with a new entry scales as $O(\text{poly} \log(nd))$. In addition, an algorithm to perform the amplitude encoding of a vector is given and scales as $O(\log(nd))$. The proof will make use of the following lemma on cascades of rotations: + + + + +```{lemma, cascade-controlled-rotations, name="Implementing Rotations with Cascades of Controlled Unitary Gates"} +Given: a register $\mathtt{A}$ composed of $t$ qubits with the binary encoding of the fixed-point representation of a number $\theta \in (0,2\pi]$, a target qubit $\mathtt{b}$, and a single qubit rotation parameterized by a single angle $\mathtt{R}(\theta) \in \mathbb{C}^{2 \times 2}$, then the unitary +$$\mathtt{C}_{\mathtt{A}}\mathtt{R}_{\mapsto \mathtt{b}}(\theta) = \prod_{i = 0}^{t-1} \mathtt{C}_i \mathtt{R}_{\mapsto \mathtt{b}}\left( 2^{\lfloor\log_2(\theta)\rfloor-i} \right)$$ +is equivalent to applying $\mathtt{R}(\theta)$ on the target qubit if the rotation holds the property $R(\theta_1 + \theta_2) = R(\theta_1)R(\theta_2)$. ``` -Note an important (but simple) thing. An $(\alpha, a, \epsilon)$-block encoding of $A$ is just a $(1, a, \epsilon)$-block-encoding of $A/\alpha$. - +```{proof} +For a number $\theta \in (0, 2\pi]$ on $t$ qubits, the fixed point representation will be of the form $\mathcal{Q}(a, b, 0):= \mathcal{Q}(z, 0)$, with $c_1 = \lfloor\log_2(\theta)\rfloor + 1$ and $c_2 = t - c_1$. \\ +The application of $\mathtt{C}_{\mathtt{A}}\mathtt{R}_{\mapsto \mathtt{b}}(\theta)$ is equivalent to $t$ single qubit application of $\mathtt{R}(\theta)$ on the target qubit $\mathtt{b}$, with the identity on all other qubits, where the angles have to be adjusted. +%with parameters $z_i2^{\lfloor\log(\theta)\rfloor-i}$. +In particular: +\begin{equation*} + \prod_{i = 0}^{t-1} \mathtt{C}_i \mathtt{R}_{\mapsto \mathtt{b}}\left( 2^{\lfloor\log_2(\theta)\rfloor-i} \right) = \prod_{i = 0}^{t-1} \mathtt{R}_{\mapsto \mathtt{b}}\left( z_i 2^{\lfloor\log_2(\theta)\rfloor-i} \right) +\end{equation*} +where $z_i \in \{ 0,1 \}$ is the state of qubit $i$ and we have omitted the tensor product with the identity on all other qubits of register $\mathtt{A}$ for simplicity. Then: +\begin{equation*} +\prod_{i = 0}^{t-1} \mathtt{R}_{\mapsto \mathtt{b}}\left( z_i 2^{\lfloor\log_2(\theta)\rfloor-i} \right) = R_{\mapsto \mathtt{b}}\left( \sum_{i=0}^{t-1} z_i 2^{\lfloor\log_2(\theta)\rfloor-i} \right) = R_{\mapsto \mathtt{b}}(\theta), +\end{equation*} +where we have used that $R(\phi_1 + \phi_2) = R(\phi_1)R(\phi_2)$ and +observing that +$\sum\limits_{i=0}^{t-1} z_i2^{\lfloor\log(\theta)\rfloor-i}$ is +the fixed-point encoding of $\theta$.\\ +Since the proof only makes use of the fact that the parameterized gate +needs to have the property $R_n(\phi_1 + \phi_2) = R_n(\phi_1)R_n(\phi_2)$, +we can easily extend it to the Phase gate $P$ and the y rotation gate $R_y$. +``` -We report this result from [@gilyen2019quantum]. -(ref:gilyen2019quantum) [@gilyen2019quantum] + + + + + + + + + + + + +```{exercise, compositionofrotations} +Prove that $\sigma_y(\theta + \phi) = \sigma_y(\theta)\sigma_y(\phi)$ for the $\sigma_y$ rotation given by + +\begin{equation} +\sigma_y(\theta) = +\begin{pmatrix} +\cos(\frac{\theta}{2})& -\sin(\frac{\theta}{2})\\ +\sin(\frac{\theta}{2}) & \cos(\frac{\theta}{2}) +\end{pmatrix} +\end{equation} + +Prove the same property for the phase gate $P(\theta + \phi) = P(\theta)P(\phi)$ defined by +\begin{equation} +P(\theta) = +\begin{pmatrix} +1 & 0\\ +0 & e^{i \theta} +\end{pmatrix} +\end{equation} +``` -```{definition, name="Block encoding from sparse access (ref:gilyen2019quantum)"} -Let $A \in \mathbb{C}^{2^w \times 2^w}$ be a matrix that is $s_r$-row-sparse and $s_c$-column-sparse, and each element of $A$ has abolute value at most $1$. Suppose that we have access to the following sparse access oracles acting on two $(w+1)$ qubit registers: - $$O_r: \ket{i}\ket{k} \mapsto \ket{i}\ket{r_{ik}} \forall i \in [2^w] - 1, k \in [s_r], \text{and}$$ +The original work developed a procedure to perform the amplitude encoding of a matrix $V \in \mathbb{R}^{n \times d}$ with KP-trees in 2 steps: a pre-processing step and circuit implementation. In the data pre-processing step, for each row $v_i \in \mathbb{R}^{n}$, which is composed of elements $v_{ij} \in \mathbb{R}$, a binary tree is created where the leaves contain the values $v_{ij}^2$ and the sign of $v_{ij}$. Each intermediate node contains the sum of the leaves of the sub tree rooted at that node. The circuit implementation makes use of the $\mathsf{QMD}$ to access the next layer of the desired tree $v_i$ until the leaves are reach. - $$O_c: \ket{l}\ket{j} \mapsto \ket{c_lj}\ket{j} \forall l \in [s_c], j \in [2^w]-1, \text{where}$$ +Here we'll present an optimized version of KP-trees for state preparation of complex matrices. In this version each tree is pruned such that it only saves the angles that are required for the state preparation rather than the partial norms, which halves the size of the memory. Furthermore, we clearly lay out the circuits for the implementation of the state preparation, which can be seen in \@ref(fig:KP-trees-ry). In addition the complex matrices are handled by storing the phase of each complex number. The circuit implementation of the phase makes use of a circuit as depicted in figures \@ref(fig:KP-trees-phase). -$r_{ij}$ is the index of the $j$-th non-zero entry of the $i$-th row of $A$, or if there are less than $i$ non-zero entries, than it is $j+2^w$, and similarly $c_ij$ is the index for the $i$-th non-zero entry of the $j-th$ column of $A$, or if there are less than $j$ non-zero entries, than it is $i+2^w$. Additionally assume that we have access to an oracle $O_A$ that returns the entries of $A$ in binary description: - $$O_A : \ket{i}\ket{j}\ket{0}^{\otimes b} \mapsto \ket{i}\ket{j}\ket{a_{ij}} \forall i,j \in [2^w]-1 \text{where}$$ + - $a_{ij}$ is a $b$-bit description of the $ij$-matrix element of $A$. Then we can implement a $(\sqrt{s_rs_c}, w+3, \epsilon)$-block-encoding of $A$ with a single use of $O_r$, $O_c$, two uses of $O_A$ and additionally using $O(w + \log^{2.5(\frac{s_rs_c}{\epsilon})})$ one and two qubit gates while using $O(b,\log^{2.5}\frac{s_rs_c}{\epsilon})$ ancilla qubits. +```{theorem,KP-tree-state-preparation,name="Optimized KP-trees for complex vectors"} +Let $V \in \C^{n \times d}$, where we assume that $n$ and $d$ are powers of $2$, then there is a data structure to store the rows of $V$ such that: + * The size of the data structure is $O(\|V\|_0 \log^2(nd))$. + * The time to insert, update or delete a single entry $v_{ij}$ is $O(\log^{2}(nd))$. + * A quantum algorithm that has quantum access to the data structure can perform the mapping $\tilde{U}: \ket{i}\ket{0} \rightarrow \ket{i}\ket{V_i}$ for $i \in [m]$, corresponding to the rows of the matrix currently stored in memory and the mapping $\tilde{V}: \ket{0}\ket{j} \rightarrow \ket{\tilde{V}}\ket{j}$, for $j \in [n]$, where $\tilde{V} \in \mathbb{R}^{m}$ has entries $\tilde{V}_i = ||V_i||$, in time $(2+t)\log(nd) + 2t$, where $t$ is the precision of the result. ``` -The previous theorems can be read more simply as: "under reasonable assumptions (**quantum general graph model** for rows and for columns - see previous section), we can build $(\sqrt{s_rs_c}, w+3, \epsilon)$-block-encodings of matrices $A$ with circuit complexity of $O(\log^{2.5(\frac{s_rs_c}{\epsilon})})$ gates and constant queries to the oracles". +```{proof} +The data structure is composed of $n+1$ binary trees, one for each row of the matrix, and an additional one for the vector of norms of the rows. For the $i^{th}$ row of $V$(i.e. $V_i$) we build the binary tree $B_i$. Given that that $d$ is a power of 2, there will be $\log(d)$ layers to a tree $B_i$. -Now we turn our attention to another way of creating block-encodings, namely leveraging the quantum data structure that we discussed in Section \@ref(q-sampling-access). In the following, we use the shortcut notation to define the matrix $A^{(p)}$ to be a matrix where each entry $A^{(p)}_{ij} = (A_{ij})^p$. +For an incoming element $j$ of the vector $V_i$ of the form $v_{ij}e^{i\theta_{ij}}$, the $j^{\text{th}}$ leaf of the $i^{th}$ tree will store the tuple $(v_{ij}^2, \theta_{ij})$. Once a leaf is updated, the internal nodes will also be updated such that an internal node $l$ will store the sum of the moduli $v_{ij}$ of the leaves of a sub tree rooted at $l$. This procedure continues until all the matrix is loaded. -```{definition, mu, name="Possible parameterization of μ for the KP-trees"} -For $s_{p}(A) = \max_{i \in [n]} \sum_{j \in [d]} A_{ij}^{p}$, we chose $\mu_p(A)$ to be: -$$\mu_p(A)=\min_{p\in [0,1]} (\norm{A}_{F}, \sqrt{s_{2p}(A)s_{(1-2p)}(A^{T})}).$$ +At the end of the procedure, we represent an internal node $l$ in the $i^{th}$ tree at depth $d$ as $B_{id}^{l}$. If $j_b$ represents the $b^{th}$ bit of $j$ then: + +\begin{equation} + B_{id}^{l} = \sum\limits_{\substack{j_1,...,j_d=l\\j_{d+1},...,j_{\log(n)} \in \{0,1\}}} v_{ij}^2, +\end{equation} + +This implies that the first $d$ bits of $j$ written in binary are fixed to $l$, indicating that we are at depth $d$. This procedure requires $O (\log^2(nd))$ time. + +After the tree has been filled it will be pruned. The pruning involves changing the values in the internal nodes such that they store the angle required to perform the state preparation. This will allow to remove $v_{ij}^2$ from the leaves which will now only store the phases ${\theta_{ij}}$. + +Given a node $B_{id}^{l}$, the pruned tree will have nodes given by: + +\begin{equation} +B_{i,d}^{' l} = + \begin{cases} + 2\arccos \left( \sqrt{\frac{B_{i,d+1}^{2l}}{B_{i,d}^{l}}}\right), & \text{if } d < \log(n)\\ + \theta_{i,\log(n)}^l, & \text{if } d=\log(n) + \end{cases}, +\end{equation} + +The size of the data structure scales as $O(|V|_0\log^2(nd))$. + +Since the first $\log(n)-1$ layers are concerned with preparing the real amplitudes, $B_{i,k}^{' l} \in [0, \pi]$ for $k \in [\log(n)-1]$, whilst the last layer will be bounded by $B_{i,\log(n)}^{' l} \in [0, 2\pi]$. +Each angle in the tree will be stored in its fixed-point representation. Since the first $\log(n)-1$ layers are concerned with preparing the real amplitudes, $B_{i,k}^{' l} \in [0, \pi]$ for $k \in [\log(n)-1]$ meaning their fixed-point representation $\mathcal{Q(z)}$ will have $c_1 = 1$ and $c_2 = t$ for some precision $t$. The last layer contains the phases which are bounded by $B_{i,\log(n)}^{' l} \in [0, 2\pi]$, meaning their fixed-point representation $\mathcal{Q(z)}$ will have $c_1 = 2$ and $c_2 = t-1$ for some precision $t$ . This means that for some precision $t$ the address register will require $t'=t+1$ qubits. + +The circuit will require quantum access to the data structure $B_{i,d}^{'}$ as well as 3 registers: an index register $\ket{i}$ which contains $\lceil \log(i) \rceil$ qubits and the binary representation of $i$; a $t'$-qubit address(angle) register which will load the fixed-point representation of the angles up to a precision $t$; and the main register composed of $\log(n)$ qubits. + +A quantum query to the data structure will load from $B_{i}^{'}$ the fixed-point representation of the angle on the address register which will be followed by a cascade of controlled rotations, as seen in lemma \@ref(lem:Rotations), in order to produce the next layer of the data structure $B_{i}$. Given the first $k$ qubits of the register being in a state $\Psi_k$, then the action on the $k+1$ qubit be as follows: + +\begin{equation} +\ket{i}\ket{0}^{\otimes t'}\ket{\Psi_k}\ket{0} \xrightarrow{\text{QMD}} +\ket{i}\ket{B_{i,d}^{'}}\ket{\Psi_k}\ket{0}\xrightarrow{\sigma_y(B_{i,d}^{'})} +\ket{i}\ket{B_{i,d}^{'}}\ket{\Psi_k}\frac{1}{\sqrt{B_{i,d}^{l}}}\left(\sqrt{B_{i,d+1}^{2l}}\ket{0} + \sqrt{B_{i,d+1}^{2l+1}}\ket{1}\right), +\end{equation} + +Where $\xrightarrow{\sigma_y(B_{i,k}^{'})}$ indicates a cascade of $\sigma_y$ rotations controlled on the address register and targeted on the $k+1$ qubit of the main register. + +Repeating this procedure for the first $n-1$ layers of the tree $B_i^{'}$ will leave the main register in the state $\ket{\Psi_{\log(n)}}$, i.e. the amplitude encoding of the moduli of the vector $V_i$. The addition of the phases will require a quantum query to the classical data structure to access the final layer of the binary tree. Following the query, a cascade of phase gates on the $\log(n)^{th}$ qubit is performed. This is followed by a $\sigma_x$ gate and then another cascade of phase rotations and finally another $\sigma_x$ gate. The $\sigma_x$ gate is required since the phase gates only acts on the state where the last bit is a $1$. The transformation will then be: + +\begin{equation} +\ket{i}\ket{0}^{\otimes t'}\ket{\Psi_{\log(n)}} \xrightarrow{\text{QMD}} +\ket{i}\ket{B_{i,\log(n)}^{'}}\ket{\Psi_{\log(n)}}\xrightarrow{\text{CP}(B_{i,\log(n)}^{'})} +\ket{i}\ket{B_{i,\log(n)}^{'}}e^{i\theta_{il}}\ket{\Psi_{\log(n)}}, +\end{equation} + +Where $\theta_{il}$ is the phase saved in the leaf $l$. From this we can see that performing $\tilde{U}: \ket{i}\ket{0} \rightarrow \ket{i}\ket{V_i}$ for $i \in [m]$ requires $2\log(n) + 2$ queries to the classical data structure. In addition, a precision of $t$ will require at most $t'(\log(n) + 2)$ controlled rotations. + +The final tree is for the implementation of $\tilde{V}: \ket{0}\ket{j} \rightarrow \ket{\tilde{V}}\ket{j}$, for $j \in [n]$. As before we construct the tree such the leaves store $||V_i||^2$ and an internal node $l$ stores the entries of the subtree rooted at $l$. It is important to note that in this case the node does not need to store the phases since we are interesting in the moduli of the rows, which halves the dimension of this tree. Following an analogous procedure of pruning, a circuit of controlled $\sigma_y$ rotations will grant the application of the unitary $\tilde{V}$ to the main register. ``` -(ref:CGJ18) [@CGJ18] +```{r, KP-trees-ry, echo=FALSE, fig.width=10, fig.cap="A section of the circuit for state preparation with pruned KP-trees. For a vector $V_i \\in \\mathbb{C}^{n}$ we require 3 register: an index register $\\ket{i}$; a $t$-qubit address register which will load the angles up to a precision $t$; and the main register composed of $\\log(n)$ qubits. At a intermediate step of the procedure the main register will hold a state which represents the $k$-th layer of the KP-tree $\\Psi_k$ and the aim of the circuit will be to prepare the $k+1$ layer of the tree, $\\Psi_{k+1}$. This starts with a quantum query to the data structure which loads the angles to the address register. This is followed by a cascade of controlled rotations and finally an inverse call to the data structure. Repeating this circuit $\\log(n)$ times produces the state $\\Psi_{\\log(n)}$ which is a vector which hold the moduli of the components of $V_i$. In total the circuit will have a depth of $t\\log(n)$ and will require $2\\log(n)$ queries to the data structure."} +knitr::include_graphics("images/KP_Trees_RY.png") +``` +```{r, KP-trees-phase, echo=FALSE, fig.width=10, fig.cap="The circuit that adds the phase in state preparation with pruned KP-trees. This starts with a quantum query to the data structure which loads the angles to the address register, which is followed by a cascade of phase rotation, a NOT gate and another cascade. The requirmenet of 2 cascades is that the controlled phase rotations only acts on the quantum states with a $1$ as the last bit. The application of this circuit produces the desired vector $V_i$."} +knitr::include_graphics("images/KP_Trees_RPhase.png") +``` -```{lemma, kp-block-encodings, name="Block encodings from quantum data structures (ref:CGJ18)"} -Let $A\in\mathbb{C}^{M\times N}$, and $\overline{A}\in\mathbb{C}^{(M+N)\times (M+N)}$ be the symmetrized matrix defined as -$$\overline{A}=\left[\begin{array}{cc}0 & A\\ A^\dagger & 0 \end{array}\right].$$ +We now show an example of the state preparation with pruned KP-trees of a vector of size 4. Figure \@ref(fig:KP-trees-example) shows the difference between an original KP-tree and a pruned version, whilst \@ref(fig:example-circuit) shows the full circuit implementation to load the vector. +```{example} +As a worked example we will take a $4$ element vector for which we will construct a data structure and then, using a $\mathsf{QMD}$, we will load it into a quantum circuit. The vector is: - - Fix $p\in [0,1]$. If $A\in\mathbb{C}^{M\times N}$, and $A^{(p)}$ and $(A^{(1-p)})^\dagger$ are both stored in quantum-accessible data structures with sufficient precision, then there exist unitaries $U_R$ and $U_L$ that can be implemented in time $O\left(polylog(MN/\epsilon)\right)$ such that -$U_R^\dagger U_L$ is a $(\mu_p(A),\lceil\log (N+M+1)\rceil,\epsilon)$-block-encoding of $\overline{A}$. +\begin{equation} +V^{T} = \left( 0.4e^{i\frac{\pi}{4}}, 0.4e^{i\frac{\pi}{12}} , 0.8e^{i\frac{\pi}{3}}, 0.2e^{i\frac{\pi}{6}} \right), +\end{equation} + +In particular our aim is to produce the state: + +\begin{equation} + \ket{\phi} = 0.4e^{i\frac{\pi}{4}}\ket{00} + 0.4e^{i\frac{\pi}{12}}\ket{01} + 0.8e^{i\frac{\pi}{3}}\ket{10} + 0.2e^{i\frac{\pi}{6}}\ket{11}, +\end{equation} + +The first step is the construction of the data structure. Figure \@ref(fig:KP-trees-example) shows the initial tree and the pruned tree. The difference between the two is that the initial tree stores the partial norms of the entries, whilst the pruned tree stores the angles required to implement the partial norms as $\sigma_y$ rotations. + +Since we are working with a vector we will only have 1 qubit in the index register which will be set to the state $\ket{0}$. The angle will be stored with a precision of $t$ which we will assume is a large number. This will require the angle(address) register to be composed of $t$ qubits. Finally, since the vector has 4 elements, we will require 2 qubits in the main register. + +An initial call to the $\mathsf{QMD}$ will load the angle on the address register, this will be followed by a cascade of $\sigma_y$ rotations on the first qubit and an inverse call to the $\mathsf{QMD}$ to remove the angle from the address register. This will produce the state: + +\begin{equation} + \ket{0}\ket{0}^{\otimes t}\left( \sqrt{0.32}\ket{0} + \sqrt{0.68}\ket{1}\right)\ket{0}, +\end{equation} + +A similar process is done is the second step where in this case the call to the $\mathsf{QMD}$ is made using the index register and the first qubit and will access the second row of the pruned KP-tree. This will be followed by a similar cascade of $\sigma_y$ rotations on the second qubit of the main register and inverse call to the $\mathsf{QMD}$ to remove the angle from the address register. This will produce the state: + +\begin{equation} + \ket{0}\ket{0}^{\otimes t}\left(\sqrt{0.32}\ket{0} \left( \sqrt{\frac{0.16}{0.32}}\ket{0} + \sqrt{\frac{0.16}{0.32}}\ket{1} \right) + \sqrt{0.68}\ket{1} \left( \sqrt{\frac{0.64}{0.68}}\ket{0} + \sqrt{\frac{0.2}{0.68}}\ket{1} \right)\right), +\end{equation} + +\begin{equation} + = \ket{0}\ket{0}^{\otimes t}\left(0.4\ket{00} + 0.4\ket{01} + 0.8\ket{10} + 0.2\ket{11}\right), +\end{equation} + +Now we need to add the phases. As already seen, this will be done with a query to the $\mathsf{QMD}$ to access the final row of the pruned KP-tree, then a cascade of phase rotations $P$. This will produce the state: + +\begin{equation} + \ket{0}\ket{\theta}\left(0.4\ket{00} + 0.4e^{i\frac{\pi}{12}}\ket{01} + 0.8\ket{10} + 0.2e^{i\frac{\pi}{6}}\ket{11}\right), +\end{equation} + +Where the state $\ket{\theta}$ is some superposition containing the binary representation of all the leaves of the pruned KP-tree. Because the nature of the phase gate, a $\sigma_x$ gate followed by another cascade of phase rotations is required to load the remaining phases. Finally, a $\sigma_x$ gate and a inverse query to the $\mathsf{QMD}$ will produce the desired state! -- On the other hand, if $A$ is stored in a quantum-accessible data structure with sufficient precision, then there exist unitaries $U_R$ and $U_L$ that can be implemented in time $O(polylog(MN)/\epsilon)$ such that $U_R^\dagger U_L$ is a $(\|A\|_F,\lceil\log(M+N)\rceil,\epsilon)$-block-encoding of $\overline{A}$. +\begin{equation} + \ket{0}\ket{0}^{\otimes t} \left(0.4e^{i\frac{\pi}{4}}\ket{00} + 0.4e^{i\frac{\pi}{12}}\ket{01} + 0.8e^{i\frac{\pi}{3}}\ket{10} + e^{i\frac{\pi}{6}}0.2\ket{11}\right), +\end{equation} +The full circuit for this can be seen in the figure \@ref(fig:example-circuit). ``` -The second point of the previous theorem is just our good old Definition \@ref(def:KP-trees). + + +```{r, KP-trees-example, echo=FALSE, fig.width=10, fig.cap="The original and pruned tree used for the example. The difference between the two is that the initial tree stores the partial norms of the vector entries, whilst the pruned tree only stores the angles required to implement the required $\\sigma_y$ and phase rotations."} +knitr::include_graphics("images/KP-trees-example.png") +``` +```{r, example-circuit, echo=FALSE, fig.width=10, fig.cap="The circuit to perform state preparation of the vector reported in the worked example. An initial call to the $\\mathsf{QMD}$ loads the angle on the address register, which is followed by a cascade of $\\sigma_y$ rotations on the first qubit and an inverse call to the $\\mathsf{QMD}$ to remove the angle from the address register. A similar process is done for the second step where the call to the $\\mathsf{QMD}$ is made using the index register and the first qubit and will access the first layer of the pruned KP-tree. This will be followed by a similar cascade of $\\sigma_y$ rotations on the second qubit of the main register and inverse call to the $\\mathsf{QMD}$. The final step requires adding the phases. This will be done with a query to the $\\mathsf{QMD}$ to access the final row of the pruned KP-tree, then a cascade of phase rotation $P$. Because the nature of the phase gate, a $\\sigma_x$ gate followed by another cascade of phase rotations is required to load the remaining phases. Finally, a $\\sigma_x$ gate and a inverse query to the $\\mathsf{QMD}$ will produce the amplitude encoding."} +knitr::include_graphics("images/Example_circuit.png") +``` - +The following exercise might be helpful to clarify the relation between quantum query access to a vector and quantum sampling access. - +```{exercise} +Suppose you have quantum access to a vector $x = [x_1, \dots, x_N]$, where each $x_i \in [0,1]$. What is the cost of creating quantum sampling access to $x$, i.e. the cost of preparing the state $\frac{1}{Z}\sum_{i=1}^N x_i \ket{i}$. Hint: query the state in superposition and perform a controlled rotation. Can you improve the cost using amplitude amplification? What if $x_i \in [0, B]$ for a $B > 1$? +``` - +Lower bounds in query complexity can be used to prove that the worst case for performing state preparation with the technique used in the exercise (i.e. without KP-trees/quantum sampling access) are $O(\sqrt{N})$. + + +### Block encoding {#sec:implementation-block-encoding} + +We first turn our attention to creating block encodings from oracles doing amplitude encoding. In the following, we use the shortcut notation to define the matrix $A^{(p)}$ to be a matrix where each entry $A^{(p)}_{ij} = (A_{ij})^p$. + +```{exercise, creationstatematrix} +Let $X \in \mathbb{R}^{n \times d}$. Suppose you have access to $U_R$ and $U_L$ defined as: + + - $U_R\ket{i}\ket{0} = \ket{i}\ket{x_i} = \ket{i} \sum_{j} (x_i)_j \ket{j}$; + - $U_L\ket{0}\ket{i} = \ket{\widetilde{x}}\ket{i}$ where $\widetilde{x}$ is the vector of the norms of the rows of the matrix $x$. -## Importance of quantum memory models +Using once $U_R$ and $U_L$, build a unitary $U_X$ that performs the mapping $\ket{0} \mapsto \frac{1}{\|X\|_F}\sum_{i,j}x_{ij} \ket{i,j}$. +``` -To grasp the importance of this model we have to discuss the bottlenecks of doing data analysis on massive datasets in current classical architectures. When the data that needs to be processed surpass the size of the available memory, the dataset can only be analyzed with algorithms whose runtime is almost linear with respect to the size of the dataset. Super-linear computations (like most algorithms based on linear-algebra, which are qubic in the worst case) are too expensive from a computational point of view, as the size of the data is too big to fit in live memory. Under this settings, quantum computers can offer significant advantages. In fact, the runtime of the whole process of performing a data analysis on a matrix $A$ using quantum computers is given by the time of the preprocessing and constructing quantum access to the data, plus the runtime of the quantum procedure. This means that the runtime of data analysis processing has a total computational complexity of $\tilde{O}(\norm{A}_0) + O(poly(f(A)), poly(1/\epsilon), poly(\log(mn)) )$, where $\epsilon$ the error in the approximation factor in the quantum randomized algorithm, and $f(A)$ represent some other function of the matrix that depends on properties of the data, but not on its size (for instance, $\kappa(A)$, the condition number of the matrix). This runtime represents an improvement compared to the runtime of the best classical algorithms in machine learning, which is $O(poly(\norm{A}_0) \times poly(f(A),1/\epsilon))$. As we saw, preparing quantum access to a matrix $A$ is computationally easy to implement, (it requires a single or few passes over the dataset, that we can do when we receive it, and it is can be made in parallel), and thus a quantum data analysis can be considerably faster than the classical one. Needless to say that even if the scaling of the quantum algorithm is sub-linear in the matrix size, if we consider the cost to build quantum access we "lose" the exponential gap between the classical and the quantum runtime. Nevertheless, the overall computational cost can still largely favor the quantum procedure. Moreover, the preprocessing can be made once, when the data is received. - + -The past few years saw a trend of works proposing "dequantizations" of quantum machine learning algorithms. These algorithms explored and sharpened the ingenious idea of Ewin Tang to leverage a classical data structure to perform importance sampling on input data to have classical algorithm with polylogarithmic runtimes in the size of the input. The consequence is that quantum algorithms have now (in the worst scenarios) at most a polynomial speedup compared to the classical dequantizations in the variables of interested (which, in machine larning problems is the size of the input matrix). Hoewver, these classical algorithms have much worsened dependece in other parameters (like condition number, Frobenius norm, rank, and so on) that will make them not advantageous in practice (i.e. they are slower than the fastest classical randomized algorithms [@arrazola2020quantum]). Having said that, even having a good old quadratic speedup is not something to be fussy about. +```{theorem, creation-be-from, name="Creation of state matrix"} +Assume to have the unitaries $U_L$ and $U_R$ for a matrix $X \in \mathbb{R}^{n \times n}$. Then $U_R^\dagger U_L$ is a $(\|X\|_F, 0)$-block encoding of $X$. +``` -## QRAM architecures and noise resilience {#sec:qramarchitectures} +```{proof} +Define the matrix $P \in \mathbb{R}^{nm}$ by the column vectors $\ket{i}\ket{x_i}$ for $i \in [m]$, and the matrix $Q$ by $Q \in \mathbb{R}^{nn \times nn}$ defined by the column vectors $\ket{\overline{x}}\ket{i}$. +One can verify that +$$(P^\dagger Q)_{ij} = \braket{i, x_i|\overline{x}, j} = \frac{X_{ij}}{\|X\|_F}. $$ +To conclude the proof, it suffices to recall the definition of block encoding: + \[ + \|X - \|X\|_F(\bra{0} \otimes I)U_R^\dagger U_L (\ket{0} \otimes I) \| = \|X - \|X\|_F P^\dagger Q \| = 0. +\] +``` -While building a QRAM is something that has nothing to deal with computer science at first sight, the reason why we discuss this subject here is twofold. First, we think it is a good idea to disseminate the knowledge on the state of the art of QRAM, as in the past few works spread (perhaps rightly) some skepticism on the feasibility of the QRAM. -Historically, we have two concrete proposed architectures for implementing a QRAM. The bucket brigade (BB), from [@giovannetti2008quantum], [@giovannetti2008architectures] and the Fanout architecture. In this document we will neglect to discuss much about the Fanout architecutre (Fig 1 and Fig 2 of [@giovannetti2008architectures] ), as it does not have many of the nice properties of the BB architecture, and thus will never be used in practice, and we will focus on the BB architecture. Hybrid architecture, interpolating between the multiplexer and the bucket-brigade architecture exists [@di2020fault], [@paler2020parallelizing], [@low2018trading], [@berry2019qubitization]. These architecture allow to move from a quantum circuit of log-depth with no ancilla qubits, to circuits with no ancilla qubits and linear depth (as we saw in Section \@ref(sec:accessmodel-circuits) with the multiplexer). -This unpretentious section is here for pinpointing a few keywords and give the reader just an intuition on how a BB QRAM works. The BB architecture (Fig 10 [@hann2021resilience], ) could be either implemented with qutrits or (as recently shown in [@hann2021resilience] ) with qubits. For now, we focus on the explanation with qutrits, as it's relatively simpler. In the QRAM terminology, we have an address register (which we previously call index register), and a bus register (which we previously called target register, which was just a empty $\ket{0}$ register). +```{definition, mu, name="Possible parameterization of μ for the KP-trees"} +For $s_{p}(A) = \max_{i \in [n]} \sum_{j \in [d]} A_{ij}^{p}$, we chose $\mu_p(A)$ to be: -The BB is a binary tree, where at the leaves we find the content of the memory. Each of the leaves is connected to a parent node. Each internal node (up to the root) is called a quantum router (Figure 1b of [@hann2021resilience]). Each router is a qutrit (i.e. a three level quantum system), which can be in state $\ket{0}$ (route left), $\ket{1}$ (route right), and $\ket{W}$ i.e. (wait). When we want to perform a query, we prepare and index register with the address of the memory cell that we want to query, and we set all the router registers to $\ket{W}$. Then, the first qubit of the address register is used to change the state of the root of the tree from $\ket{W}$ to either $\ket{0}$ or $\ket{1}$. Then, the second address register is routed left or right, conditioned on the state of the quantum router in the root. Then, the state of this router in the first layer is changed according to the value of the second qubit of the address register, from $\ket{W}$ to either $\ket{0}$ or $\ket{1}$. This process of changing the state of the routers and routing the qubits of the address register is repeated until the last layers of the tree. Now, all the qubits of the bus register are routed untill the chosen leaf, and the value of the memory is copied in the bus register. Note that, as the value of the target register is a classical value, to perform a copy is simply necessary to apply a CNOT gate (and thus we do not violate the no-cloning theorem). +\begin{equation} +\mu_p(A)=\min_{p\in [0,1]} (\norm{A}_{F}, \sqrt{s_{2p}(A)s_{(1-2p)}(A^{T})}). +\end{equation} +``` -We are left to study the impact of errors in our QRAM. Studying a realistic error model of the BB architecture has been a topic of research for long time. Among the first works, [@arunachalam2015robustness] gave initial, but rather pessimistic results, under a not-so-realistic error model, with some resource estimations that can be found in [@di2020fault]. More recently, a series of works by which (IMHO) culminated in [@hann2021resilience] and [@hann2021practicality] (accessible [here](https://www.proquest.com/openview/c5caf76bb490e4d3abbeca2cea16b450/1?pq-origsite=gscholar&cbl=18750&diss=y)) shed more light on the noise resilience of QRAM of the bucket brigate architecture. The results presented there are much more postive, and we report some of the conclusions here. As already discussed, the metric of choice to show how much a quantum procedure prepares a state close to another desired state is the fidelity $F$, with the infidelity defined as $1-F$. The infidelity of the bucket brigade, for an addressable memory of size $N$ (and thus with $\log N$ layers in the tree), where $\epsilon$ is the probability of an error per time step, and $T$ is the time required to perform a query, scales as: +(ref:CGJ18) [@CGJ18] +```{lemma, kp-block-encodings, name="Block encodings from quantum data structures (ref:CGJ18)"} +Let $A\in\mathbb{C}^{M\times N}$, and $\overline{A}\in\mathbb{C}^{(M+N)\times (M+N)}$ be the symmetrized matrix defined as: + \begin{equation} -1-F \approx \sum_{l=1}^{\log N} (2^{-l}) \epsilon T2^{l} = \epsilon T \log N -(\#eq:qramfidelity) +\overline{A}=\left[\begin{array}{cc}0 & A\\ A^\dagger & 0 \end{array}\right]. \end{equation} -```{exercise} -Can you recall from calcolus what is the value of $\sum_{l=1}^{\log N} l$ + - Fix $p\in [0,1]$. If $A\in\mathbb{C}^{M\times N}$, and $A^{(p)}$ and $(A^{(1-p)})^\dagger$ are both stored in quantum-accessible data structures with sufficient precision, then there exist unitaries $U_R$ and $U_L$ that can be implemented in time $O\left(polylog(MN/\epsilon)\right)$ such that +$U_R^\dagger U_L$ is a $(\mu_p(A),\lceil\log (N+M+1)\rceil,\epsilon)$-block encoding of $\overline{A}$. + +- On the other hand, if $A$ is stored in a quantum-accessible data structure with sufficient precision, then there exist unitaries $U_R$ and $U_L$ that can be implemented in time $O(polylog(MN)/\epsilon)$ such that $U_R^\dagger U_L$ is a $(\|A\|_F,\lceil\log(M+N)\rceil,\epsilon)$-block encoding of $\overline{A}$. + ``` -The time required to perform a query, owing to the tree structure of the BB is $T=O(\log N)$. This can be seen trivially from the fact that $T \approx \sum_{l=0}^{\log N -1 } l = \frac{1}{2}(\log N)(\log N +1)$, but can be decreased to $O(\log N)$ using simple tricks (Appendix A of [@hann2021resilience]). This leaves us with the sought-after scaling of the infidelity of $\widetilde{O}(\epsilon)$ where we are hiding in the asymptotic notation the terms that are polylogarithmic in $N$. The error that happen with probability $\epsilon$ can be modelled with Kraus operators makes this error analysis general and realistic (Appendix C [@hann2021resilience]), and is confirmed by simulations. For a proof of Equation \@ref(eq:qramfidelity) see Section 3 and Appendix D of [@hann2021resilience]. +The second point of the previous theorem is equivalent to what we saw in \@ref(sec:implementation-KPtrees). -For completeness, we recall that there are proposal for "random access quantum memories", which are memories for quantum data that do not allow to address the memory cells in superposition. For the sake of clarity, we won't discuss these results here. -## Working with classical probability distributions +#### Block encoding from sparse access +Using this we can then see how to perform a block encoding. We start by reporting this result from [@gilyen2019quantum]. -We have 4 ways of working with classical probability distributions in a quantum computer: +(ref:gilyen2019quantum) [@gilyen2019quantum] + +```{theorem, name="Block-Encoding from sparse access (ref:gilyen2019quantum)"} +Let $A \in \mathbb{C}^{2^w \times 2^w}$ be a matrix that is $s_r$-row-sparse and $s_c$-column-sparse, and each element of $A$ has absolute value at most $1$. Suppose that we have access to the following sparse access oracles acting on two $(w+1)$ qubit registers: + +\begin{equation} + O_r: \ket{i}\ket{k} \mapsto \ket{i}\ket{r_{ik}} \forall i \in [2^w] - 1, k \in [s_r], \text{and} +\end{equation} + +\begin{equation} + O_c: \ket{l}\ket{j} \mapsto \ket{c_lj}\ket{j} \forall l \in [s_c], j \in [2^w]-1, \text{where} +\end{equation} + +$r_{ij}$ is the index of the $j$-th non-zero entry of the $i$-th row of $A$, or if there are less than $i$ non-zero entries, than it is $j+2^w$, and similarly $c_ij$ is the index for the $i$-th non-zero entry of the $j-th$ column of $A$, or if there are less than $j$ non-zero entries, than it is $i+2^w$. Additionally assume that we have access to an oracle $O_A$ that returns the entries of $A$ in binary description: + +\begin{equation} + O_A : \ket{i}\ket{j}\ket{0}^{\otimes b} \mapsto \ket{i}\ket{j}\ket{a_{ij}} \forall i,j \in [2^w]-1 \text{where} +\end{equation} + + $a_{ij}$ is a $b$-bit description of the $ij$-matrix element of $A$. Then we can implement a $(\sqrt{s_rs_c}, w+3, \epsilon)$-block encoding of $A$ with a single use of $O_r$, $O_c$, two uses of $O_A$ and additionally using $O(w + \log^{2.5}(\frac{s_rs_c}{\epsilon}))$ one and two qubit gates while using $O(b,\log^{2.5}\frac{s_rs_c}{\epsilon})$ ancilla qubits. + +``` + +The previous theorems can be read more simply as: "under reasonable assumptions (**quantum general graph model** for rows and for columns - see previous section), we can build $(\sqrt{s_rs_c}, w+3, \epsilon)$-block encodings of matrices $A$ with circuit complexity of $O(\log^{2.5}(\frac{s_rs_c}{\epsilon}))$ gates and constant queries to the oracles". + + + + + + + + + +The interested reader can read [@camps2024explicit] to learn how to create block encodings from sparse access. + + +## Use case: working with classical probability distributions + +We have $4$ ways of working with classical probability distributions in a quantum computer [@gur2021sublinear]: - Purified query access - Sample access - Query access to a frequency vector of a distribution - Drawing samples classically and perform some computation on a quantum computer -Let's start with a formal definition of the frequency vector model. +Let's start with a formal definition of the frequency vector model. This is a kind of query access, but since it is used only for probability distrubtions we decided to include it in this section. ```{definition, query-access-frequency-vector, name="Quantum query access to a probability distribution in the frequency vector model"} Let $p=(p_1, p_2, \dots p_n)$ be a probability distribution on $\{1, 2, \dots, n\}$, and let $n\geq S \in \mathbb{N}$ be such that there is a set of indices $S_i \subseteq [S]$ for which $p_i = \frac{\left|S_i\right|}{S}.$ We have quantum access to a probability distribution in the frequency vector model if there is an quantum oracle that, for $\forall s \in [S_i]$ performs the mapping $O_p \ket{s} \mapsto \ket{s}\ket{i}$. +``` + + +```{exercise} +Given a matrix $M := \sum\limits_{j=0}^{n-1} a_{j}U_{j}$, which is a linear combination of unitary matrices $U_j$, consider the unitary transformation + +\begin{equation} + U_M = (U_{\text{PREP}}^{\dagger} \otimes I) U_{\text{SEL}} ( U_{\text{PREP}} \otimes I) +\end{equation} + +where $U_{\text{PREP}}\ket{0} = \ket{a} = \sum\limits_{j=0}^{n-1} a_{j}\ket{j}$ and $U_{\text{SEL}} = \sum\limits_{j=0}^{n-1} \ket{j}\bra{j} \otimes U_{j}$. Then show that $U_M$ is a block encoding of $M$: + +\begin{equation} + \left(\bra{0}\otimes I \right) U_M \left(\ket{0}\otimes I \right) = M = |a_j|^2 \sum\limits_{j=0}^{n-1} b_{j}U_{j} +\end{equation} ``` -## Retrieving data -In order to retrieve information from a quantum computer, we are going to use some efficient procedures that allow to reconstruct classically the information stored in a quantum state. These procedures can be thought of as ways of sampling from a pure state $\ket{x}$. The idea for an efficient quantum tomography is that we want to minimize the number of times that the sate $\ket{x}$ is created. +## Retrieving Data + +In order to retrieve information from a quantum computer, we are going to use some efficient procedures that allow to reconstruct classically the information stored in a quantum state. These procedures can be thought of as ways of sampling from a pure state $\ket{x}$. The idea for an efficient quantum tomography is that we want to minimize the number of times that the state $\ket{x}$ is created. Most of the quantum algorithms discussed here will work with pure quantum states. We assume to have access to the unitary that creates the quantum state that we would like to retrieve, and that we have access to the unitary that creates the state (and that we can control it). Under these conditions, the process of performing tomography is greatly simplified. According to the different error guarantees that we require, we can chose among two procedures. @@ -569,23 +1215,31 @@ Most of the quantum algorithms discussed here will work with pure quantum states (ref:KP18) [@KP18] ```{theorem, tomelle2, name="Vector state tomography with L2 guarantees (ref:KP18)"} -Given access to unitary $U$ such that $U\ket{0} = \ket{x}$ and its controlled version in time $T(U)$, there is a tomography algorithm with time complexity $O(T(U) \frac{ d \log d }{\epsilon^{2}})$ that produces unit vector $\widetilde{x} \in \R^{d}$ such that $\norm{\widetilde{x} - \ket{x} }_{2} \leq \epsilon$ with probability at least $(1-1/poly(d))$. +Given access to unitary $U$ such that $U\ket{0} = \ket{x}$ and its controlled version, there is a tomography algorithm with calls $U$ and its controlled version for $\frac{ d \log d }{\epsilon^{2}})$ times, that produces a unit vector $\widetilde{x} \in \R^{d}$ such that $\norm{\widetilde{x} - \ket{x} }_{2} \leq \epsilon$ with probability at least $(1-1/poly(d))$. ``` (ref:jonal2019convolutional) [@jonal2019convolutional] ```{theorem, tomellinfinity, name="Vector state tomography with L∞ guarantees (ref:jonal2019convolutional)"} -Given access to unitary $U$ such that $U\ket{0} = \ket{x}$ and its controlled version in time $T(U)$, there is a tomography algorithm with time complexity $O(T(U) \frac{ \log d }{\epsilon^{2}})$ that produces unit vector $\widetilde{x} \in \R^{d}$ such that $\norm{\widetilde{x} - \ket{x} }_{\ell_\infty} \leq \epsilon$ with probability at least $(1-1/poly(d))$. +Given access to unitary $U$ such that $U\ket{0} = \ket{x}$ and its controlled version, there is a tomography algorithm with calls $U$ and its controlled version $\frac{ \log d }{\epsilon^{2}})$ that produces a unit vector $\widetilde{x} \in \R^{d}$ such that $\norm{\widetilde{x} - \ket{x} }_{\ell_\infty} \leq \epsilon$ with probability at least $(1-1/poly(d))$. ``` -Note that in both kinds of tomography, dependence on the error in the denominator is quadratic, and this is because of the Hoeffding inequality, i.e. lemma \@ref(lem:Hoeffding). Another remark on the hypothesis of the algorithms for tomography is that they require a unitary $U$ such that $U\ket{0}\mapsto\ket{x}$ for the $\ket{x}$ in question. Oftentimes, due to the random error in the quantum subroutines used inside the algorithms, this state $\ket{x}$ might slightly change every time. +Note that in both kinds of tomography the dependence on the error in the denominator is quadratic, and this is because of the Hoeffding inequality. Another remark on the hypothesis of the algorithms for tomography is that they require a unitary $U$ such that $U\ket{0}\mapsto\ket{x}$ for the $\ket{x}$ in question. Often times, due to the random error in the quantum subroutines used inside the algorithms, this state $\ket{x}$ might slightly change every time. ```{exercise, fromellinftoell2} Can you obtain $\ell_2$ tomography with error $\epsilon$ on a $d$ dimensional state if you have have only access to an algorithm that perform $\ell_\infty$ tomography with error $\epsilon^\ast$ on the same state? (I.e. what should you set the value of $\epsilon^{\ast}$?). ``` -### Denisty matrices + + +```{exercise, tomellep} +Consider Theorem \@ref(thm:tomelle2) and Theorem \@ref(thm:tomellinfinity). What is the sample complexity of a tomography algorithm returning error in norm $\ell_p$? In other words, find the sample complexity to return a vector such that $\norm{\widetilde{x} - \ket{x} }_{\ell_p} \leq \epsilon$ with probability at least $(1-1/poly(d))$. +``` + + + +### Density matrices Much of the current literature in quantum tomography is directed towards reconstructing a classical description of density matrices. This problem is considerably harder than reconstructing a pure state. @@ -600,5 +1254,30 @@ Different techniques have been recently developed in [@zhang2020efficient]. Ther (ref:zhang2020efficient) [@zhang2020efficient] ```{theorem, tomography-trick, name="Improved quantum tomography (ref:zhang2020efficient)"} -For the state $\ket{v}$ lies in the row space of a matrix $A \in \R^{n \times d}$ with rank $r$ and condition number $\kappa(A)$, the classical form of $\ket{v}$ can be obtained by using $O(r^3\epsilon^2)$ queries to the state $\ket{v}$, $O(r^{11}\kappa^{5r}\epsilon^{-2}\log(1/\delta))$ queries to QRAM oracles of $A$ and $O(r^2)$ additional inner product operations between rows, such that the $\ell_2$ norm error is bounded in $\epsilon$ with probability at least $1-\delta$. +For the state $\ket{v}$ lies in the row space of a matrix $A \in \R^{n \times d}$ with rank $r$ and condition number $\kappa(A)$, the classical form of $\ket{v}$ can be obtained by using $O(r^3\epsilon^2)$ queries to the state $\ket{v}$, $O(r^{11}\kappa^{5r}\epsilon^{-2}\log(1/\delta))$ queries to $\mathsf{QRAM}$ oracles of $A$ and $O(r^2)$ additional inner product operations between rows, such that the $\ell_2$ norm error is bounded in $\epsilon$ with probability at least $1-\delta$. ``` + + + + + + + + + + + + + + + + + + + + + + + + + From beda6adc063eaafd4eca0f07e940399bb7f2badc Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 10:51:35 +0100 Subject: [PATCH 02/22] Add quantum_architectures.tex --- algpseudocode/quantum_architecture.tex | 65 ++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 algpseudocode/quantum_architecture.tex diff --git a/algpseudocode/quantum_architecture.tex b/algpseudocode/quantum_architecture.tex new file mode 100644 index 0000000..ffd65cd --- /dev/null +++ b/algpseudocode/quantum_architecture.tex @@ -0,0 +1,65 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} + +\usepackage{multirow} +\usepackage{multicol} +\usepackage{array} +\usepackage{graphicx} + +\usepackage{tikz} + +\usetikzlibrary{decorations.pathreplacing} +\usetikzlibrary{shapes.misc} +\definecolor{RoyalBlue}{RGB}{65, 105, 225} + +\usetikzlibrary{quantikz} + +\usepackage[landscape, paperwidth=15cm, paperheight=30cm, margin=0mm]{geometry} + +\title{\vspace{-5ex}} +\date{\vspace{-5ex}} + +\begin{document} + +\begin{tikzpicture} + % Outer box + \draw[thick] (0,1) rectangle (6,10); + + % Quantum processing unit + \draw[dashed, thick] (0.2,4.45) rectangle (5.8, 9.6); + \node at (3,9.2) {\textbf{Quantum processing unit}}; + + % Input + \draw (0.6,8.0) rectangle (5.4,8.9); + \node at (3,8.45) {Input $\left|\psi\right\rangle_\mathtt{I}$}; + + % Workspace + \draw (0.6,6.9) rectangle (5.4,7.8); + \node at (3,7.35) {Workspace $\left|0\right\rangle_\mathtt{W}^{\otimes \text{poly}(\log n)}$}; + + % Inner box for address and target + % \draw[dashed] (1,5.5) rectangle (5,7.5); + + % Address + \draw (0.6,5.7) rectangle (5.4,6.6); + \node at (3,6.15) {Address $\left|i\right\rangle_\mathtt{A}$}; + + % Target + \draw (0.6,4.6) rectangle (5.4,5.5); + \node at (3,5.05) {Target $\left|b\right\rangle_\mathtt{T}$}; + + % Quantum memory device + \draw[dashed, thick] (0.4,1.4) rectangle (5.6, 6.75); + \node at (3,1.8) {\textbf{Quantum memory device}}; + + % Ancillae + \draw (0.6,3.4) rectangle (5.4,4.3); + \node at (3,3.85) {Ancillae $\left|0\right\rangle_{\mathtt{Aux}}^{\otimes \text{poly}(n)}$}; + + % Memory + \draw (0.6, 2.3) rectangle (5.4,3.2); + \node at (3, 2.75) {Memory $\left|x_0, x_1, \ldots, x_{n-1}\right\rangle_\mathtt{M}$}; + +\end{tikzpicture} + +\end{document} From 761d4e8a23713a85365a57118171f3d4c4f07d6e Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 10:53:17 +0100 Subject: [PATCH 03/22] Add oracle-models.tex --- algpseudocode/oracle-models.tex | 64 ++++++++++++++++----------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/algpseudocode/oracle-models.tex b/algpseudocode/oracle-models.tex index 21ee9e8..579fdd1 100644 --- a/algpseudocode/oracle-models.tex +++ b/algpseudocode/oracle-models.tex @@ -1,32 +1,32 @@ -\documentclass{article} -\usepackage[utf8]{inputenc} - -\usepackage{multirow} -\usepackage{multicol} -\usepackage{array} -\usepackage{graphicx} - - -\usepackage[landscape, paperwidth=15cm, paperheight=30cm, margin=0mm]{geometry} - -\title{\vspace{-5ex}} -\date{\vspace{-5ex}} - -\begin{document} - -\maketitle - - -\begin{table}[] -\centering -\begin{tabular}{ccclclcl} -\cline{2-7} -\multicolumn{1}{c|}{Oracle} & \multicolumn{3}{c|}{Numbers} & \multicolumn{3}{c|}{Quantum sampling access} & \\ \cline{2-7} -\multicolumn{1}{c|}{\multirow{2}{*}{Implementation}} & \multicolumn{1}{c|}{\multirow{2}{*}{QRAM}} & \multicolumn{2}{c|}{Circuits} & \multicolumn{1}{c|}{KP-trees} & \multicolumn{1}{c|}{Grover-Rudolph} & \multicolumn{1}{c|}{Other} & \\ \cline{3-6} -\multicolumn{1}{c|}{} & \multicolumn{1}{c|}{} & \multicolumn{1}{c|}{Sparse access} & \multicolumn{1}{c|}{Functions} & \multicolumn{2}{c|}{Oracle for numbers} & \multicolumn{1}{c|}{} & \\ \cline{2-7} -\multicolumn{1}{l}{} & \multicolumn{1}{l}{} & \multicolumn{1}{l}{} & & \multicolumn{1}{l}{} & & \multicolumn{1}{l}{} & -\end{tabular} -\end{table} - - -\end{document} +\documentclass{article} +\usepackage[utf8]{inputenc} + +\usepackage{multirow} +\usepackage{multicol} +\usepackage{array} +\usepackage{graphicx} + + +\usepackage[landscape, paperwidth=15cm, paperheight=30cm, margin=0mm]{geometry} + +\title{\vspace{-5ex}} +\date{\vspace{-5ex}} + +\begin{document} + +\maketitle + + +\begin{table}[] +\centering +\begin{tabular}{ccclclcl} +\cline{2-7} +\multicolumn{1}{c|}{Oracle} & \multicolumn{3}{c|}{Numbers} & \multicolumn{3}{c|}{Quantum sampling access} & \\ \cline{2-7} +\multicolumn{1}{c|}{\multirow{2}{*}{Implementation}} & \multicolumn{1}{c|}{\multirow{2}{*}{QRAM}} & \multicolumn{2}{c|}{Circuits} & \multicolumn{1}{c|}{KP-trees} & \multicolumn{1}{c|}{Grover-Rudolph} & \multicolumn{1}{c|}{Other} & \\ \cline{3-6} +\multicolumn{1}{c|}{} & \multicolumn{1}{c|}{} & \multicolumn{1}{c|}{Sparse access} & \multicolumn{1}{c|}{Functions} & \multicolumn{2}{c|}{Oracle for numbers} & \multicolumn{1}{c|}{} & \\ \cline{2-7} +\multicolumn{1}{l}{} & \multicolumn{1}{l}{} & \multicolumn{1}{l}{} & & \multicolumn{1}{l}{} & & \multicolumn{1}{l}{} & +\end{tabular} +\end{table} + + +\end{document} From ddb15076a9412144fd4421a0e1b035604a1ea482 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 10:59:23 +0100 Subject: [PATCH 04/22] Swapped oracle-models for oracle_modles (the right image) --- algpseudocode/oracle-models.png | Bin 17825 -> 0 bytes algpseudocode/oracle-models.tex | 32 ----------- algpseudocode/oracle_models.tex | 98 ++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 32 deletions(-) delete mode 100644 algpseudocode/oracle-models.png delete mode 100644 algpseudocode/oracle-models.tex create mode 100644 algpseudocode/oracle_models.tex diff --git a/algpseudocode/oracle-models.png b/algpseudocode/oracle-models.png deleted file mode 100644 index b53acdc8b4e3d81176d95a0acca4f827cc7de38d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17825 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 diff --git a/algpseudocode/oracle-models.tex b/algpseudocode/oracle-models.tex deleted file mode 100644 index 579fdd1..0000000 --- a/algpseudocode/oracle-models.tex +++ /dev/null @@ -1,32 +0,0 @@ -\documentclass{article} -\usepackage[utf8]{inputenc} - -\usepackage{multirow} -\usepackage{multicol} -\usepackage{array} -\usepackage{graphicx} - - -\usepackage[landscape, paperwidth=15cm, paperheight=30cm, margin=0mm]{geometry} - -\title{\vspace{-5ex}} -\date{\vspace{-5ex}} - -\begin{document} - -\maketitle - - -\begin{table}[] -\centering -\begin{tabular}{ccclclcl} -\cline{2-7} -\multicolumn{1}{c|}{Oracle} & \multicolumn{3}{c|}{Numbers} & \multicolumn{3}{c|}{Quantum sampling access} & \\ \cline{2-7} -\multicolumn{1}{c|}{\multirow{2}{*}{Implementation}} & \multicolumn{1}{c|}{\multirow{2}{*}{QRAM}} & \multicolumn{2}{c|}{Circuits} & \multicolumn{1}{c|}{KP-trees} & \multicolumn{1}{c|}{Grover-Rudolph} & \multicolumn{1}{c|}{Other} & \\ \cline{3-6} -\multicolumn{1}{c|}{} & \multicolumn{1}{c|}{} & \multicolumn{1}{c|}{Sparse access} & \multicolumn{1}{c|}{Functions} & \multicolumn{2}{c|}{Oracle for numbers} & \multicolumn{1}{c|}{} & \\ \cline{2-7} -\multicolumn{1}{l}{} & \multicolumn{1}{l}{} & \multicolumn{1}{l}{} & & \multicolumn{1}{l}{} & & \multicolumn{1}{l}{} & -\end{tabular} -\end{table} - - -\end{document} diff --git a/algpseudocode/oracle_models.tex b/algpseudocode/oracle_models.tex new file mode 100644 index 0000000..8970468 --- /dev/null +++ b/algpseudocode/oracle_models.tex @@ -0,0 +1,98 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage{algorithm} +\usepackage{algpseudocode} +\usepackage{amsmath, amsfonts, amssymb} +\usepackage[braket, qm]{qcircuit} +\usepackage{tikz} +\usetikzlibrary{calc} + +\algrenewcommand\algorithmicrequire{\textbf{Input:}} +\algrenewcommand\algorithmicensure{\textbf{Output:}} + +\makeatletter +\renewcommand{\fnum@algorithm}{\fname@algorithm} +\makeatother + +\begin{document} +\pagestyle{empty} + +\begin{tikzpicture} + +% Encoding +\node[draw, minimum width=3cm, minimum height=2cm] (encbox) at (0,-5) { +\begin{tabular}{l} + \; \\ + \; \\ + Binary\\ + \; \\ + \; \\ + \; \\ + \; \\ + \; \\ + Amplitude\\ + \; \\ + \; \\ + \; \\ + \; \\ + \; \\ + Block \\ + \; \\ + \; \\ + \end{tabular} +}; +\node[above] at (encbox.north) {\textbf{Representation}}; + +% Binary +\node[draw, minimum width=3cm, minimum height=2cm] (numbox) at (7,-2.5) { +\begin{tabular}{l} + Oracle synthesis (multiplexer, sparse access, ...) \\ + QMD (QRAM, QRAG, ...) + \end{tabular} +}; +\node[above] at (numbox.north) {\textbf{Implementation}}; + +% Vector +\node[draw, minimum width=3cm, minimum height=2cm] (vecbox) at (7,-5) { +\begin{tabular}{l} + Grover-Rudolph, KP-trees + \end{tabular} +}; + +% Matrices +\node[draw, minimum width=3cm, minimum height=2cm] (matbox) at (7,-7.5) { +\begin{tabular}{l} + Applications of amplitude encodings\\ + \end{tabular} +}; + +% Calculate midpoint of the second arrow +\coordinate (midup) at ($(encbox.east)!0.7!(encbox.north east)$); +\coordinate (middown) at ($(encbox.east)!0.7!(encbox.south east)$); + +% Arrows +\draw[->, >=stealth] (vecbox.south) -- (matbox.north) node[midway, above] {}; +\draw[->, >=stealth] (numbox.south) -- (vecbox.north) node[midway, above] {}; + +\draw[->, >=stealth] (midup) -- (numbox.west) node[midway, above] {}; +\draw[->, >=stealth] (encbox.east) -- (vecbox.west) node[midway, above] {}; +\draw[->, >=stealth] (middown) -- (matbox.west) node[midway, above] {}; + +% Horizontal Line Numbers +\def\lineheightNumbers{42} +%\draw[dashed] ([xshift=-1.5cm,yshift=\lineheightNumbers]encbox.west) node[right, above] {\;\;\;\;\;\;\;\;\;\;\;\;\;Numbers}-- ([xshift=0cm,yshift=0]numbox.south west); +\draw[dashed] ([yshift=\lineheightNumbers]encbox.west) node[right, above] {}-- ([xshift=0cm,yshift=0]numbox.south west); + + +% Horizontal Line Vectors +\def\lineheightVectors{72} +%\draw[dashed] ([xshift=-1.5cm,yshift=\lineheightVectors]encbox.south west)node[right, above] {\;\;\;\;\;\;\;\;\;\;\;\;\;Vectors} -- ([xshift=0cm]vecbox.south west); +\draw[dashed] ([yshift=\lineheightVectors]encbox.south west)node[right, above] {} -- ([xshift=0cm]vecbox.south west); + +% Horizontal Line Matrices +\def\lineheightMatrices{0} +%\draw[dashed] ([xshift=-1.5cm,yshift=\lineheightMatrices]encbox.south west)node[right, above] {\;\;\;\;\;\;\;\;\;\;\;\;\;Matrices} -- ([xshift=0cm,yshift=\lineheightMatrices]matbox.south west); +\draw[dashed] ([yshift=\lineheightMatrices]encbox.south east)node[right, above] {} -- ([xshift=0cm,yshift=\lineheightMatrices]matbox.south west); +\end{tikzpicture} + +\end{document} From e52ad8e2c115e230464bac5de0e08296fbb3d442 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:04:45 +0100 Subject: [PATCH 05/22] Add circuit of bucket brigade --- algpseudocode/circuit_bb.tex | 334 +++++++++++++++++++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 algpseudocode/circuit_bb.tex diff --git a/algpseudocode/circuit_bb.tex b/algpseudocode/circuit_bb.tex new file mode 100644 index 0000000..3675751 --- /dev/null +++ b/algpseudocode/circuit_bb.tex @@ -0,0 +1,334 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} + +\usepackage{multirow} +\usepackage{multicol} +\usepackage{array} +\usepackage{graphicx} + +\usepackage{tikz} + +\usetikzlibrary{decorations.pathreplacing} +\usetikzlibrary{shapes.misc} +\definecolor{RoyalBlue}{RGB}{65, 105, 225} + +\usetikzlibrary{quantikz} + +\usepackage[landscape, paperwidth=15cm, paperheight=30cm, margin=0mm]{geometry} + +\title{\vspace{-5ex}} +\date{\vspace{-5ex}} + +\begin{document} + +\scalebox{0.7}{ +\begin{tikzpicture} + % Define drawing element styles + \tikzstyle{conn}=[-] + \tikzstyle{connThick}=[-, line width = 2] + \tikzstyle{whiteCirc}=[circle, draw, fill = white, inner sep = 5] + \tikzstyle{grayCirc}=[circle, draw, fill = gray!50, inner sep = 5] + \tikzstyle{every node}=[font=\Large] + \tikzstyle{swap}=[-, line width = 2, mark = x, mark size = 5pt] + \tikzstyle{connSwap}=[-, line width = 1.5] + \tikzstyle{wc}=[circle, draw, fill=white, inner sep = 2] + \tikzstyle{bc}=[circle, draw, fill=black, inner sep = 2] + \tikzstyle{orangeRec}=[orange, thick] + \tikzstyle{grayRec}=[gray!30] + \tikzstyle{op}=[draw, fill = white, text width = 2em, align = center] + \tikzstyle{blueLine}=[-, line width = 3, RoyalBlue] + + % Define variables + \def\xend{16.0} % The end of x-coordinate + + % Thick lines that connect the nodes + \draw[connThick] (0,0) -- (0.5,3.5) ; + \draw[connThick] (0,0) -- (0.5,-3.5) ; + \draw[connThick] (0.5,3.5) -- (1.0, 5.25) ; + \draw[connThick] (0.5,3.5) -- (1.0, 1.75) ; + \draw[connThick] (0.5,-3.5) -- (1.0, -5.25) ; + \draw[connThick] (0.5,-3.5) -- (1.0, -1.75) ; + \draw[connThick] (1.0,1.75) -- (1.4, 2.25) ; + \draw[connThick] (1.0,1.75) -- (1.4, 1.25) ; + \draw[connThick] (1.0,5.25) -- (1.4, 5.75) ; + \draw[connThick] (1.0,5.25) -- (1.4, 4.75) ; + \draw[connThick] (1.0,-1.75) -- (1.4, -2.25) ; + \draw[connThick] (1.0,-1.75) -- (1.4, -1.25) ; + \draw[connThick] (1.0,-5.25) -- (1.4, -5.75) ; + \draw[connThick] (1.0,-5.25) -- (1.4, -4.75) ; + + % Orange Rectangle 1 + \fill[grayRec] (4.0, -6.0) rectangle (4.8, 7.3); + \draw[orangeRec] (3.2, -6.0) rectangle (4.8, 7.3); + + % Orange Rectangle 2 + \fill[grayRec] (7.6, -6.0) rectangle (8.4, 7.3); + \draw[orangeRec] (6.8, -6.0) rectangle (8.4, 7.3); + + % Orange Rectangle 3 + \fill[grayRec] (10.4, -6.0) rectangle (11.2, 7.3); + \draw[orangeRec] (9.6, -6.0) rectangle (11.2, 7.3); + + % Orange Rectangle 4 + \fill[grayRec] (13.0, -6.0) rectangle (13.8, 7.3); + \draw[orangeRec] (12.2, -6.0) rectangle (13.8, 7.3); + + % Blue Line + \draw[blueLine] (1.4, 9.25) -- (9.0, 9.25) -- (9.0, 7.0) -- (10.2, 7.0) -- (10.2, 0.5) -- (10.6, 0.5) -- (10.6, 3.0) -- (12.8, 3.0) -- (12.8, 2.25) -- (\xend, 2.25); + + + % White node at the centre + \draw[conn] (0.05, -0.5) -- (\xend, -0.5); + \draw[conn] (0., 0) -- (\xend, 0); + \draw[conn] (0.05, 0.5) -- (\xend, 0.5); + \node[whiteCirc] at (0,0) {}; + + % Gray nodes upper + \draw[conn] (0.63, 3.0) -- (\xend, 3.0); + \draw[conn] (0.5, 3.5) -- (\xend, 3.5); + \draw[conn] (0.63, 4.0) -- (\xend, 4.0); + \node[grayCirc] at (0.5,3.5) {}; + + % Gray nodes lower + \draw[conn] (0.63, -3.0) -- (\xend, -3.0); + \draw[conn] (0.5, -3.5) -- (\xend, -3.5); + \draw[conn] (0.63, -4.0) -- (\xend, -4.0); + \node[grayCirc] at (0.5,-3.5) {}; + + % white nodes upper upper + \draw[conn] (1.4, 5.75) -- (\xend, 5.75); + \draw[conn] (1.0, 5.25) -- (\xend, 5.25); + \draw[conn] (1.4, 4.75) -- (\xend, 4.75); + \node[whiteCirc] at (1.0,5.25) {}; + + % white nodes upper lower + \draw[conn] (1.4, 1.25) -- (\xend, 1.25); + \draw[conn] (1.0, 1.75) -- (\xend, 1.75); + \draw[conn] (1.4, 2.25) -- (\xend, 2.25); + \node[whiteCirc] at (1.0,1.75) {}; + + % white nodes lower lower + \draw[conn] (1.4, -5.75) -- (\xend, -5.75); + \draw[conn] (1.0, -5.25) -- (\xend, -5.25); + \draw[conn] (1.4, -4.75) -- (\xend, -4.75); + \node[whiteCirc] at (1.0,-5.25) {}; + + % white nodes lower upper + \draw[conn] (1.4, -1.25) -- (\xend, -1.25); + \draw[conn] (1.0, -1.75) -- (\xend, -1.75); + \draw[conn] (1.4, -2.25) -- (\xend, -2.25); + \node[whiteCirc] at (1.0,-1.75) {}; + + % Router rectangle + \node at (0.45, 6.0) {Routers}; + \draw[dashed] (-0.5, -5.9) rectangle (1.4, 6.3); + + % Input + \draw[conn] (1.4, 7.0) -- (\xend, 7.0); + \node at (0.25, 7.0) {Input}; + + % Address + \draw[conn] (1.4, 7.75) -- (\xend, 7.75); + \draw[conn] (1.4, 8.25) -- (\xend, 8.25); + \draw[conn] (1.4, 8.75) -- (\xend, 8.75); + \draw[decorate, decoration = {brace, amplitude = 5pt, raise = 1ex}] (1.4, 7.75) -- (1.4, 8.75); + \node at (0.0, 8.25) {Address}; + + % Bus + \draw[conn] (1.4, 9.25) -- (\xend, 9.25); + \node at (0.45, 9.25) {Bus}; + + % Column 1 + \draw[connSwap] (1.8, 7.0) -- (1.8, 7.75); + \draw plot[swap] (1.8, 7.0); + \draw plot[swap] (1.8, 7.75); + + % Column 2 + \draw[connSwap] (2.2, 7.0) -- (2.2, 0.0); + \draw plot[swap] (2.2, 7.0); + \draw plot[swap] (2.2, 0.0); + + % Column 3 + \draw[connSwap] (2.6, 7.0) -- (2.6, 8.25); + \draw plot[swap] (2.6, 7.0); + \draw plot[swap] (2.6, 8.25); + + % Column 4 + \draw[connSwap] (3.4, 7.0) -- (3.4, -0.5); + \draw plot[swap] (3.4, 7.0); + \draw plot[swap] (3.4, -0.5); + \node[wc] at (3.4, 0.0) {}; + + % Column 5 + \draw[connSwap] (3.8, 7.0) -- (3.8, 0.0); + \draw plot[swap] (3.8, 7.0); + \draw plot[swap] (3.8, 0.5); + \node[bc] at (3.8, 0.0) {}; + + % Column 6 + \draw[connSwap] (5.8, 7.0) -- (5.8, 8.75); + \draw plot[swap] (5.8, 8.75); + \draw plot[swap] (5.8, 7.0); + + \draw[connSwap] (5.8, 3.5) -- (5.8, 0.5); + \draw plot[swap] (5.8, 3.5); + \draw plot[swap] (5.8, 0.5); + + \draw[connSwap] (5.8, -0.5) -- (5.8, -3.5); + \draw plot[swap] (5.8, -3.5); + \draw plot[swap] (5.8, -0.5); + + % Column 7 + \draw[connSwap] (7.0, 7.0) -- (7.0, -0.5); + \draw plot[swap] (7.0, 7.0); + \draw plot[swap] (7.0, -0.5); + \node[wc] at (7.0, 0.0) {}; + + % Column 8 + \draw[connSwap] (7.4, 7.0) -- (7.4, 0.0); + \draw plot[swap] (7.4, 7.0); + \draw plot[swap] (7.4, 0.5); + \node[bc] at (7.4, 0.0) {}; + + % Column 9 + \draw[connSwap] (7.8, 3.5) -- (7.8, 0.5); + \draw plot[swap] (7.8, 3.0); + \draw plot[swap] (7.8, 0.5); + \node[wc] at (7.8, 3.5) {}; + + \draw[connSwap] (7.8, -0.5) -- (7.8, -4.0); + \draw plot[swap] (7.8, -4.0); + \draw plot[swap] (7.8, -0.5); + \node[wc] at (7.8, -3.5) {}; + + % Column 10 + \draw[connSwap] (8.2, 0.5) -- (8.2, 4.0); + \draw plot[swap] (8.2, 0.5); + \draw plot[swap] (8.2, 4.0); + \node[bc] at (8.2, 3.5) {}; + + \draw[connSwap] (8.2, -0.5) -- (8.2, -3.5); + \draw plot[swap] (8.2, -0.5); + \draw plot[swap] (8.2, -3.0); + \node[bc] at (8.2, -3.5) {}; + + % Column 11 + \draw[connSwap] (9.0, 7.0) -- (9.0, 9.25); + \draw plot[swap] (9.0, 7.0); + \draw plot[swap] (9.0, 9.25); + + \draw[connSwap] (9.0, 5.25) -- (9.0, 4.0); + \draw plot[swap] (9.0, 5.25); + \draw plot[swap] (9.0, 4.0); + + \draw[connSwap] (9.0, 3.0) -- (9.0, 1.75); + \draw plot[swap] (9.0, 1.75); + \draw plot[swap] (9.0, 3.0); + + \draw[connSwap] (9.0, -5.25) -- (9.0, -4.0); + \draw plot[swap] (9.0, -5.25); + \draw plot[swap] (9.0, -4.0); + + \draw[connSwap] (9.0, -3.0) -- (9.0, -1.75); + \draw plot[swap] (9.0, -1.75); + \draw plot[swap] (9.0, -3.0); + + % Column 12 + \draw[connSwap] (9.8, 7.0) -- (9.8, -0.5); + \draw plot[swap] (9.8, 7.0); + \draw plot[swap] (9.8, -0.5); + \node[wc] at (9.8, 0.0) {}; + + % Column 13 + \draw[connSwap] (10.2, 7.0) -- (10.2, 0.0); + \draw plot[swap] (10.2, 7.0); + \draw plot[swap] (10.2, 0.5); + \node[bc] at (10.2, 0.0) {}; + + % Column 14 + \draw[connSwap] (10.6, 3.5) -- (10.6, 0.5); + \draw plot[swap] (10.6, 3.0); + \draw plot[swap] (10.6, 0.5); + \node[wc] at (10.6, 3.5) {}; + + \draw[connSwap] (10.6, -0.5) -- (10.6, -4.0); + \draw plot[swap] (10.6, -4.0); + \draw plot[swap] (10.6, -0.5); + \node[wc] at (10.6, -3.5) {}; + + % Column 15 + \draw[connSwap] (11.0, 0.5) -- (11.0, 4.0); + \draw plot[swap] (11.0, 0.5); + \draw plot[swap] (11.0, 4.0); + \node[bc] at (11.0, 3.5) {}; + + % Column 16 + \draw[connSwap] (12.4, 4.0) -- (12.4, 5.25); + \draw plot[swap] (12.4, 4.0); + \draw plot[swap] (12.4, 4.75); + \node[wc] at (12.4, 5.25) {}; + + \draw[connSwap] (12.4, 3.0) -- (12.4, 1.25); + \draw plot[swap] (12.4, 3.0); + \draw plot[swap] (12.4, 1.25); + \node[wc] at (12.4, 1.75) {}; + + \draw[connSwap] (12.4, -1.75) -- (12.4, -3.0); + \draw plot[swap] (12.4, -2.25); + \draw plot[swap] (12.4, -3.0); + \node[wc] at (12.4, -1.75) {}; + + \draw[connSwap] (12.4, -4.0) -- (12.4, -5.75); + \draw plot[swap] (12.4, -4.0); + \draw plot[swap] (12.4, -5.75); + \node[wc] at (12.4, -5.25) {}; + + % Column 17 + \draw[connSwap] (12.8, 5.75) -- (12.8, 4.0); + \draw plot[swap] (12.8, 5.75); + \draw plot[swap] (12.8, 4.0); + \node[bc] at (12.8, 5.25) {}; + + \draw[connSwap] (12.8, 3.0) -- (12.8, 1.75); + \draw plot[swap] (12.8, 3.0); + \draw plot[swap] (12.8, 2.25); + \node[bc] at (12.8, 1.75) {}; + + \draw[connSwap] (12.8, -1.25) -- (12.8, -3.0); + \draw plot[swap] (12.8, -1.25); + \draw plot[swap] (12.8, -3.0); + \node[bc] at (12.8, -1.75) {}; + + \draw[connSwap] (12.8, -4.0) -- (12.8, -5.25); + \draw plot[swap] (12.8, -4.0); + \draw plot[swap] (12.8, -4.75); + \node[bc] at (12.8, -5.25) {}; + + % Text Column + \node[op] at (14.8, 5.75) {$x_7$}; + \node[op] at (14.8, 4.75) {$x_6$}; + \node[op] at (14.8, 2.25) {$x_5$}; + \node[op] at (14.8, 1.25) {$x_4$}; + \node[op] at (14.8, -1.25) {$x_3$}; + \node[op] at (14.8, -2.25) {$x_2$}; + \node[op] at (14.8, -4.75) {$x_1$}; + \node[op] at (14.8, -5.75) {$x_0$}; + + % The row of U + \draw[decorate, decoration = {brace, amplitude = 5pt, raise = 1ex, mirror}] (1.4, -6.0) -- (3.0, -6.0); + \node at (2.2, -6.8) {$U_1$}; + \draw[decorate, decoration = {brace, amplitude = 5pt, raise = 1ex, mirror}] (3.2, -6.0) -- (6.4, -6.0); + \node at (4.8, -6.8) {$U_2$}; + \draw[decorate, decoration = {brace, amplitude = 5pt, raise = 1ex, mirror}] (6.6, -6.0) -- (9.3, -6.0); + \node at (7.95, -6.8) {$U_3$}; + \draw[decorate, decoration = {brace, amplitude = 5pt, raise = 1ex, mirror}] (9.5, -6.0) -- (11.6, -6.0); + \node at (10.55, -6.8) {$U_4$}; + \draw[decorate, decoration = {brace, amplitude = 5pt, raise = 1ex, mirror}] (11.8, -6.0) -- (14.1, -6.0); + \node at (12.95, -6.8) {$U_5$}; + + +\end{tikzpicture} +} + + +\end{document} From 5bf241c7a6a052870baa8f7e5a981f81a833e910 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:16:06 +0100 Subject: [PATCH 06/22] Add images of Francesco --- algpseudocode/KP-trees-example.tex | 58 ++++++++++++++++++++++++++++++ algpseudocode/KP-trees_RPhase.tex | 42 ++++++++++++++++++++++ algpseudocode/KP-trees_RY.tex | 44 +++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 algpseudocode/KP-trees-example.tex create mode 100644 algpseudocode/KP-trees_RPhase.tex create mode 100644 algpseudocode/KP-trees_RY.tex diff --git a/algpseudocode/KP-trees-example.tex b/algpseudocode/KP-trees-example.tex new file mode 100644 index 0000000..6b0a793 --- /dev/null +++ b/algpseudocode/KP-trees-example.tex @@ -0,0 +1,58 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage{algorithm} +\usepackage{algpseudocode} +\usepackage{amsmath, amsfonts, amssymb} +\usepackage[braket, qm]{qcircuit} +\usepackage{tikz} +\usepackage[a4paper, total={7in, 10in}]{geometry} + +\algrenewcommand\algorithmicrequire{\textbf{Input:}} +\algrenewcommand\algorithmicensure{\textbf{Output:}} + +\makeatletter +\renewcommand{\fnum@algorithm}{\fname@algorithm} +\makeatother + +\begin{document} +\pagestyle{empty} + +\begin{figure} +\begin{tikzpicture}[ + every node/.style={rectangle, draw}, + level 1/.style={sibling distance=50mm, level distance=10mm}, + level 2/.style={sibling distance=30mm, level distance=20mm} +] +\node {1} + child {node {0.32} + child {node {(0.16, $\frac{\pi}{4}$)}} + child {node {(0.16, $\frac{\pi}{12}$)}} + } + child {node {0.68} + child {node {(0.64, $\frac{\pi}{3}$)}} + child {node {(0.04, $\frac{\pi}{6}$)}} + }; +\end{tikzpicture} +\hspace{1cm} % Adjust horizontal space between trees here +\begin{tikzpicture}[ + every node/.style={rectangle, draw}, + level 1/.style={sibling distance=30mm, level distance=15mm}, + level 2/.style={sibling distance=15mm, level distance=15mm} +] +\node {$2\text{cos}^{-1}\left(\sqrt{\frac{0.32}{1}} \right)$} + child {node {$2\text{cos}^{-1}\left(\sqrt{\frac{0.16}{0.32}} \right)$} + child {node {$\frac{\pi}{4}$}} + child {node {$\frac{\pi}{12}$}} + } + child {node {$2\text{cos}^{-1}\left(\sqrt{\frac{0.64}{0.68}} \right)$} + child {node {$\frac{\pi}{3}$}} + child {node {$\frac{\pi}{6}$}} + }; +\end{tikzpicture} + +\begin{tikzpicture}[overlay, remember picture] + \draw[->,thick] (8,2.5) -- (10,2.5); +\end{tikzpicture} +\end{figure} + +\end{document} diff --git a/algpseudocode/KP-trees_RPhase.tex b/algpseudocode/KP-trees_RPhase.tex new file mode 100644 index 0000000..b0bc36d --- /dev/null +++ b/algpseudocode/KP-trees_RPhase.tex @@ -0,0 +1,42 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage{algorithm} +\usepackage{algpseudocode} +\usepackage{amsmath, amsfonts, amssymb} +\usepackage[braket, qm]{qcircuit} + +\algrenewcommand\algorithmicrequire{\textbf{Input:}} +\algrenewcommand\algorithmicensure{\textbf{Output:}} + +\makeatletter +\renewcommand{\fnum@algorithm}{\fname@algorithm} +\makeatother + +\begin{document} +\pagestyle{empty} + +\Qcircuit @C=0.6em @R=1em { +%Index register +\lstick{} & \multigate{12}{QMD} & \qw & \qw & \qw & \hdots && \qw & \qw & \qw & \qw & \qw & \hdots && \qw & \qw & \multigate{12}{QMD^{\dagger}} & \qw \\ +\lstick{} & \ghost{QMD} & \qw & \qw & \qw & \hdots && \qw & \qw & \qw & \qw & \qw & \hdots && \qw & \qw & \ghost{QMD^{\dagger}} & \qw \\ +& \nghost{QMD} &&&& \vdots &&&&&&& \vdots \\ +\lstick{} & \ghost{QMD} & \qw & \qw & \qw & \hdots && \qw & \qw & \qw & \qw & \qw & \hdots && \qw & \qw & \ghost{QMD^{\dagger}} & \qw + \inputgroupv{1}{4}{0.5em}{2.5em}{\ket{i}} \\ +%Angle register +\lstick{} & \ghost{QMD} & \ctrl{8} & \qw & \qw & \hdots && \qw & \qw & \ctrl{8} & \qw & \qw & \hdots && \qw & \qw & \ghost{QMD^{\dagger}} & \qw\\ +\lstick{} & \ghost{QMD} & \qw & \ctrl{7} & \qw & \hdots && \qw & \qw & \qw & \ctrl{7} & \qw & \hdots && \qw & \qw & \ghost{QMD^{\dagger}} & \qw\\ +& \nghost{QMD} &&&& \vdots &&&&&&& \vdots\\ +\lstick{} & \ghost{QMD} & \qw & \qw & \qw & \hdots && \ctrl{5} & \qw & \qw & \qw & \qw & \hdots && \ctrl{5} & \qw & \ghost{QMD^{\dagger}} & \qw + \inputgroupv{5}{8}{0.5em}{2.5em}{\ket{0}^{\otimes t'}}\\ +%Main register +\lstick{} & \ghost{QMD} & \qw & \qw & \qw & \hdots && \qw & \qw & \qw & \qw & \qw & \hdots && \qw & \qw & \ghost{QMD^{\dagger}} & \qw \\ +\lstick{} & \ghost{QMD} & \qw & \qw & \qw & \hdots && \qw & \qw & \qw & \qw & \qw & \hdots && \qw & \qw & \ghost{QMD^{\dagger}} & \qw \\ +\lstick{\ket{\Psi_{\log(n)}}} &&&&& \vdots &&&&&&& \vdots &&&&&&& \ket{V_i}\\ +\lstick{} & \ghost{QMD} & \qw & \qw & \qw & \hdots && \qw & \qw & \qw & \qw & \qw & \hdots && \qw & \qw & \ghost{QMD^{\dagger}} & \qw \\ +\lstick{} & \ghost{QMD} & \gate{P(2^2)} & \gate{P(2^1)} & \qw & \hdots && \gate{P(2^{1-t})} & \gate{X} & \gate{P(2^2)} & \gate{P(2^1)} & \qw & \hdots && \gate{P(2^{1-t})} & \gate{X} & \ghost{QMD^{\dagger}} & \qw + %\inputgroup{9}{13}{3.5em}{\ket{\Psi_{\log(n)}}} + \gategroup{9}{1}{13}{1}{0.5em}{\{} + \gategroup{9}{17}{13}{17}{1em}{\}} +} + +\end{document} diff --git a/algpseudocode/KP-trees_RY.tex b/algpseudocode/KP-trees_RY.tex new file mode 100644 index 0000000..d10d287 --- /dev/null +++ b/algpseudocode/KP-trees_RY.tex @@ -0,0 +1,44 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage{algorithm} +\usepackage{algpseudocode} +\usepackage{amsmath, amsfonts, amssymb} +\usepackage[braket, qm]{qcircuit} + +\algrenewcommand\algorithmicrequire{\textbf{Input:}} +\algrenewcommand\algorithmicensure{\textbf{Output:}} + +\makeatletter +\renewcommand{\fnum@algorithm}{\fname@algorithm} +\makeatother + +\begin{document} +\pagestyle{empty} + +\Qcircuit @C=0.6em @R=1em { +%Index register +\lstick{} & \qw & \multigate{11}{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \multigate{11}{QMD^{\dagger}} & \qw \\ +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw\\ +&& \nghost{QMD} &&&&&&& \vdots &&& \nghost{QMD^{\dagger}}\\ +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw + \inputgroupv{1}{4}{0.5em}{2.75em}{\ket{i}} \\ +%Angle register +\lstick{} & \qw & \ghost{QMD} & \qw & \ctrl{8} & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw\\ +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \ctrl{7} & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw\\ +&& \nghost{QMD} &&&&&&& \vdots &&& \nghost{QMD^{\dagger}}\\ +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \ctrl{5} & \ghost{QMD^{\dagger}} & \qw + \inputgroupv{5}{8}{0.5em}{2.75em}{\ket{0}^{\otimes t'}}\\ +%Main register +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw & \rstick{}\\ +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw & \rstick{}\\ +&& \nghost{QMD} &&&&&&& \vdots &&& \nghost{QMD^{\dagger}} && \rstick{\ket{\Psi_{k+1}}} \\ +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw & \rstick{}\\ +\lstick{\ket{0}} & \qw & \qw & \qw & \gate{R_y(2^1)} & \qw & \gate{R_y(2^0)} & \qw && \hdots &&& \gate{R_y(2^{-t})} & \qw & \qw & \rstick{}\\ +&&&&&&&&& \vdots \\ +\\ +\lstick{\ket{0}} & \qw & \qw & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \qw & \qw & \qw + \inputgroupv{9}{12}{0.5em}{2.75em}{\ket{\Psi_k}} + \gategroup{9}{15}{13}{15}{.8em}{\}} +} + +\end{document} From 858079ef949063656da1c969dfb0d47acaa4416e Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:21:26 +0100 Subject: [PATCH 07/22] Add example of Ghisoni --- algpseudocode/state-prep-example.tex | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 algpseudocode/state-prep-example.tex diff --git a/algpseudocode/state-prep-example.tex b/algpseudocode/state-prep-example.tex new file mode 100644 index 0000000..5231c11 --- /dev/null +++ b/algpseudocode/state-prep-example.tex @@ -0,0 +1,35 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage{algorithm} +\usepackage{algpseudocode} +\usepackage{amsmath, amsfonts, amssymb} +\usepackage[braket, qm]{qcircuit} +\usepackage{tikz} +\usepackage[landscape, a2paper]{geometry} + +\algrenewcommand\algorithmicrequire{\textbf{Input:}} +\algrenewcommand\algorithmicensure{\textbf{Output:}} + +\makeatletter +\renewcommand{\fnum@algorithm}{\fname@algorithm} +\makeatother + +\begin{document} +\pagestyle{empty} + +\Qcircuit @C=0.6em @R=2.5em { +%Index register +\lstick{\ket{0}} & \qw & \multigate{4}{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \multigate{4}{QMD^{\dagger}} & \qw & \multigate{5}{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \multigate{5}{QMD^{\dagger}} & \qw & \multigate{6}{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \qw & \multigate{6}{QMD^{\dagger}} & \qw\\ +%Angle register +\lstick{} & \qw & \ghost{QMD} & \qw & \ctrl{4} & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw & \ghost{QMD} & \qw & \ctrl{5} & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw & \ghost{QMD} & \qw & \ctrl{5} & \qw & \qw & \qw && \hdots &&& \qw & \qw & \ctrl{5} & \qw & \qw & \qw && \hdots &&& \qw & \qw & \ghost{QMD^{\dagger}} & \qw\\ +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \ctrl{3} & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw & \ghost{QMD} & \qw & \qw & \qw & \ctrl{4} & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw & \ghost{QMD} & \qw & \qw & \qw & \ctrl{4} & \qw && \hdots &&& \qw & \qw & \qw & \qw & \ctrl{4} & \qw && \hdots &&& \qw & \qw & \ghost{QMD^{\dagger}} & \qw\\ +&& \nghost{QMD} &&&&&&& \vdots &&&& \nghost{QMD^{\dagger}} && \nghost{QMD} &&&&&&& \vdots &&&& \nghost{QMD^{\dagger}} && \nghost{QMD} &&&&&&& \vdots &&&& &&&&&& \vdots &&&& \nghost{QMD^{\dagger}}\\ +\lstick{} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \ctrl{1} & \ghost{QMD^{\dagger}} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \ctrl{2} & \ghost{QMD^{\dagger}} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \ctrl{2} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \ctrl{2} & \qw & \ghost{QMD^{\dagger}} & \qw + \inputgroupv{2}{5}{0.5em}{3.75em}{\ket{0}^{\otimes t'}}\\ +%Main register +\lstick{\ket{0}} & \qw & \qw & \qw & \gate{R_{y}(2^{1})} & \qw & \gate{R_{y}(2^{0})} & \qw && \hdots &&& \gate{R_{y}(2^{-t})} & \qw & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \ghost{QMD^{\dagger}} & \qw & \ghost{QMD} & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \qw & \ghost{QMD^{\dagger}} & \qw\\ +\lstick{\ket{0}} & \qw & \qw & \qw & \qw & \qw & \qw & \qw && \hdots &&& \qw & \qw & \qw & \qw & \qw & \gate{R_{y}(2^{1})} & \qw & \gate{R_{y}(2^{0})} & \qw && \hdots &&& \gate{R_{y}(2^{-t})} & \qw & \qw & \ghost{QMD} & \qw & \gate{P(2^{2})} & \qw & \gate{P(2^{1})} & \qw && \hdots &&& \gate{P(2^{1-t})} & \gate{X} & \gate{P(2^{2})} & \qw & \gate{P(2^{1})} & \qw && \hdots &&& \gate{P(2^{1-t})} & \gate{X} & \ghost{QMD^{\dagger}} & \qw\\ +} + + +\end{document} From 30f7e0069fe9bef1168d1347912df04ab61000e5 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 11:22:59 +0100 Subject: [PATCH 08/22] Add bibliography --- book.bib | 422 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 422 insertions(+) diff --git a/book.bib b/book.bib index 2d0a5db..72c0bde 100644 --- a/book.bib +++ b/book.bib @@ -15,6 +15,20 @@ @article{giurgica2022low year={2022}, publisher={APS} } +@article{aharonov2018quantum, + title={Quantum circuit depth lower bounds for homological codes}, + author={Aharonov, Dorit and Touati, Yonathan}, + journal={arXiv preprint arXiv:1810.03912}, + year={2018} +} + +@article{mori2024efficient, + title={Efficient state preparation for multivariate Monte Carlo simulation}, + author={Mori, Hitomi and Mitarai, Kosuke and Fujii, Keisuke}, + journal={arXiv preprint arXiv:2409.07336}, + year={2024} +} + @article{callison2022improved, title={Improved maximum-likelihood quantum amplitude estimation}, @@ -167,6 +181,24 @@ @article{markov1890ineq year = 1890, journal = {Zap. Imp. Akad. Nauk. St. Petersburg}, } +@inproceedings{gleinig2021efficient, + title={An efficient algorithm for sparse quantum state preparation}, + author={Gleinig, Niels and Hoefler, Torsten}, + booktitle={2021 58th ACM/IEEE Design Automation Conference (DAC)}, + pages={433--438}, + year={2021}, + organization={IEEE} +} +@article{shende2004minimal, + title={Minimal universal two-qubit controlled-NOT-based circuits}, + author={Shende, Vivek V and Markov, Igor L and Bullock, Stephen S}, + journal={Physical Review A—Atomic, Molecular, and Optical Physics}, + volume={69}, + number={6}, + pages={062321}, + year={2004}, + publisher={APS} +} @inproceedings{paturi1992degbound, title = {On the Degree of Polynomials That Approximate Symmetric Boolean Functions (Preliminary Version)}, author = {Paturi, Ramamohan}, @@ -837,6 +869,28 @@ @inproceedings{schmitt2021boolean pages = {1044--1049}, organization = {IEEE}, } +@inproceedings{krishnakumar2022aq, + title={AQ\# implementation of a quantum lookup table for quantum arithmetic functions}, + author={Krishnakumar, Rajiv and Soeken, Mathias and Roetteler, Martin and Zeng, William}, + booktitle={2022 IEEE/ACM Third International Workshop on Quantum Computing Software (QCS)}, + pages={75--82}, + year={2022}, + organization={IEEE} +} + +@article{gur2021sublinear, + title={Sublinear quantum algorithms for estimating von Neumann entropy}, + author={Gur, Tom and Hsieh, Min-Hsiu and Subramanian, Sathyawageeswar}, + journal={arXiv preprint arXiv:2111.11139}, + year={2021} +} + +@article{luongo2024measurement, + title={Measurement-based uncomputation of quantum circuits for modular arithmetic}, + author={Luongo, Alessandro and Miti, Antonio Michele and Narasimhachar, Varun and Sireesh, Adithya}, + journal={arXiv preprint arXiv:2407.20167}, + year={2024} +} @inproceedings{kerenidis2019qmeans, title = {q-means: A quantum algorithm for unsupervised machine learning}, author = {Kerenidis, Iordanis and Landman, Jonas and Luongo, Alessandro and Prakash, Anupam}, @@ -1009,6 +1063,129 @@ @article{harrow2009quantum number = 15, pages = 150502, } +@ARTICLE{STY-asymptotically, + author={Sun, Xiaoming and Tian, Guojing and Yang, Shuai and Yuan, Pei and Zhang, Shengyu}, + journal={IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems}, + title={Asymptotically Optimal Circuit Depth for Quantum State Preparation and General Unitary Synthesis}, + year={2023}, + volume={42}, + number={10}, + pages={3301-3314}, + doi={10.1109/TCAD.2023.3244885}} + +@article{plesch2011quantum, + title = {Quantum-state preparation with universal gate decompositions}, + author = {Plesch, Martin and Brukner, \v{C}aslav}, + journal = {Phys. Rev. A}, + volume = {83}, + issue = {3}, + pages = {032302}, + numpages = {5}, + year = {2011}, + month = {Mar}, + publisher = {American Physical Society}, + doi = {10.1103/PhysRevA.83.032302} +} +@article{zhao2021smooth, + title={Smooth input preparation for quantum and quantum-inspired machine learning}, + author={Zhao, Zhikuan and Fitzsimons, Jack K and Rebentrost, Patrick and Dunjko, Vedran and Fitzsimons, Joseph F}, + journal={Quantum Machine Intelligence}, + volume={3}, + number={1}, + pages={14}, + year={2021}, + publisher={Springer} +} +@article{zhu2024unified, + title={Unified architecture for a quantum lookup table}, + author={Zhu, Shuchen and Sundaram, Aarthi and Low, Guang Hao}, + journal={arXiv preprint arXiv:2406.18030}, + year={2024} +} +@article{gidney2021factor, + title={How to factor 2048 bit RSA integers in 8 hours using 20 million noisy qubits}, + author={Gidney, Craig and Eker{\aa}, Martin}, + journal={Quantum}, + volume={5}, + pages={433}, + year={2021}, + publisher={Verein zur F{\"o}rderung des Open Access Publizierens in den Quantenwissenschaften} +} +@article{gidney2018halving, + title={Halving the cost of quantum addition}, + author={Gidney, Craig}, + journal={Quantum}, + volume={2}, + pages={74}, + year={2018}, + publisher={Verein zur F{\"o}rderung des Open Access Publizierens in den Quantenwissenschaften} +} +@inproceedings{rosenthal2023efficient, +author = {Rosenthal, Gregory}, +title = {Efficient Quantum State Synthesis with One Query}, +booktitle = {Proceedings of the 2024 Annual ACM-SIAM Symposium on Discrete Algorithms (SODA)}, +chapter = {}, +year={2024}, +pages = {2508-2534}, +doi = {10.1137/1.9781611977912.89}, +} +@article{cuccaro2004new, + title={A new quantum ripple-carry addition circuit}, + author={Cuccaro, Steven A and Draper, Thomas G and Kutin, Samuel A and Moulton, David Petrie}, + journal={arXiv preprint quant-ph/0410184}, + year={2004} +} +@article{bouland2023state, + title={State preparation by shallow circuits using feed forward}, + author={Harry Buhrman and Marten Folkertsma and Bruno Loff and Niels M. P. Neumann}, + journal={arXiv preprint arXiv:2307.14840}, + year={2023}, + doi={10.48550/arXiv.2307.14840} +} +@article{de2022double, + title={Double sparse quantum state preparation}, + author={de Veras, Tiago ML and da Silva, Leon D and da Silva, Adenilton J}, + journal={Quantum Information Processing}, + volume={21}, + number={6}, + pages={204}, + year={2022}, + publisher={Springer} +} +@article{doriguello2024practicality, + title={On the practicality of quantum sieving algorithms for the shortest vector problem}, + author={Doriguello, Joao F and Giapitzakis, George and Luongo, Alessandro and Morolia, Aditya}, + journal={arXiv preprint arXiv:2410.13759}, + year={2024} +} +@article{camps2024explicit, + title={Explicit quantum circuits for block encodings of certain sparse matrices}, + author={Camps, Daan and Lin, Lin and Van Beeumen, Roel and Yang, Chao}, + journal={SIAM Journal on Matrix Analysis and Applications}, + volume={45}, + number={1}, + pages={801--827}, + year={2024}, + publisher={SIAM} +} + +@article{rosenthal2021query, + title={Query and depth upper bounds for quantum unitaries via {G}rover search}, + author={Rosenthal, Gregory}, + journal={arXiv preprint arXiv:2111.07992}, + year={2021}, + doi={10.48550/arXiv.2111.07992} +} +@article{babbush2018encoding, + title={Encoding electronic spectra in quantum circuits with linear T complexity}, + author={Babbush, Ryan and Gidney, Craig and Berry, Dominic W and Wiebe, Nathan and McClean, Jarrod and Paler, Alexandru and Fowler, Austin and Neven, Hartmut}, + journal={Physical Review X}, + volume={8}, + number={4}, + pages={041015}, + year={2018}, + publisher={APS} +} @article{VBE96, title = {Quantum networks for elementary arithmetic operations}, author = {Vedral, Vlatko and Barenco, Adriano and Ekert, Artur}, @@ -1442,6 +1619,12 @@ @article{Dikranjan2003 year = 2003, pages = {1--77}, } +@article{litinski2022active, + title={Active volume: An architecture for efficient fault-tolerant quantum computers with limited non-local connections}, + author={Litinski, Daniel and Nickerson, Naomi}, + journal={arXiv preprint arXiv:2211.15465}, + year={2022} +} @book{Feynman, title = {{Feynman lectures on Computation}}, author = {Feynman, Richard P.}, @@ -1694,6 +1877,16 @@ @article{Burges2002 doi = {MSR-TR-2002-83}, url = {http://research.microsoft.com/apps/pubs/default.aspx?id=67122}, } +@article{moosa2023linear, + title={Linear-depth quantum circuits for loading Fourier approximations of arbitrary functions}, + author={Moosa, Mudassir and Watts, Thomas W and Chen, Yiyou and Sarma, Abhijat and McMahon, Peter L}, + journal={Quantum Science and Technology}, + volume={9}, + number={1}, + pages={015002}, + year={2023}, + publisher={IOP Publishing} +} @article{Peng2008, title = {{Quantum adiabatic algorithm for factorization and its experimental implementation}}, author = {Peng, Xinhua and Liao, Zeyang and Xu, Nanyang and Qin, Gan and Zhou, Xianyi and Suter, Dieter and Du, Jiangfeng}, @@ -1784,6 +1977,28 @@ @article{kannan2017randomized volume = 26, pages = {95--135}, } +@inproceedings{metger2023stateqip, + title={stateQIP= statePSPACE}, + author={Metger, Tony and Yuen, Henry}, + booktitle={2023 IEEE 64th Annual Symposium on Foundations of Computer Science (FOCS)}, + pages={1349--1356}, + year={2023}, + organization={IEEE} +} +@article{rosenthal2021interactive, + title={Interactive proofs for synthesizing quantum states and unitaries}, + author={Rosenthal, Gregory and Yuen, Henry}, + journal={arXiv preprint arXiv:2108.07192}, + year={2021} +} +@inproceedings{holmes2020efficient, + title={Efficient quantum circuits for accurate state preparation of smooth, differentiable functions}, + author={Holmes, Adam and Matsuura, Anne Y}, + booktitle={2020 IEEE International Conference on Quantum Computing and Engineering (QCE)}, + pages={169--179}, + year={2020}, + organization={IEEE} +} @article{bausch2019quantum, title = {A Quantum Search Decoder for Natural Language Processing}, author = {Bausch, Johannes and Subramanian, Sathyawageeswar and Piddock, Stephen}, @@ -5474,6 +5689,50 @@ @incollection{buchi1990decision publisher = {Springer}, pages = {425--435}, } +@article{bergholm2005quantum, + title = {Quantum circuits with uniformly controlled one-qubit gates}, + author = {Bergholm, Ville and Vartiainen, Juha J. and M\"ott\"onen, Mikko and Salomaa, Martti M.}, + journal = {Phys. Rev. A}, + volume = {71}, + issue = {5}, + pages = {052330}, + numpages = {7}, + year = {2005}, + month = {May}, + publisher = {American Physical Society}, + doi = {10.1103/PhysRevA.71.052330} +} +@article{rattew2022preparing-arbitrary, + title={Preparing arbitrary continuous functions in quantum registers with logarithmic complexity}, + author={Rattew, Arthur G. and Koczor, B{\'a}lint}, + journal={arXiv preprint arXiv:2205.00519}, + year={2022}, + doi={10.48550/arXiv.2205.00519} +} +@article{mcardle2022quantum, + title={Quantum state preparation without coherent arithmetic}, + author={McArdle, Sam and Gily{\'e}n, Andr{\'a}s and Berta, Mario}, + journal={arXiv preprint arXiv:2210.14892}, + year={2022}, + doi={10.48550/arXiv.2210.14892} +} + +@Article{araujo2021divide, +author={Araujo, Israel F. +and Park, Daniel K. +and Petruccione, Francesco +and da Silva, Adenilton J.}, +title={A divide-and-conquer algorithm for quantum state preparation}, +journal={Scientific Reports}, +year={2021}, +month={Mar}, +day={18}, +volume={11}, +number={1}, +pages={6329}, +issn={2045-2322}, +doi={10.1038/s41598-021-85474-1} +} @phdthesis{lenvco2015verification, title = {Verification of Name Service Cache Daemon with DIVINE Model Checker}, author = {LEN{\v{C}}O, Milan}, @@ -5935,6 +6194,62 @@ @inproceedings{grover1996fast pages = {212--219}, organization = {ACM}, } +@article{grover2000synthesis, + title={Synthesis of quantum superpositions by quantum computation}, + author={Grover, Lov K}, + journal={Physical review letters}, + volume={85}, + number={6}, + pages={1334}, + year={2000}, + publisher={APS} +} +@article{rosenkranz2024quantum, + title={Quantum state preparation for multivariate functions}, + author={Rosenkranz, Matthias and Brunner, Eric and Marin-Sanchez, Gabriel and Fitzpatrick, Nathan and Dilkes, Silas and Tang, Yao and Kikuchi, Yuta and Benedetti, Marcello}, + journal={arXiv preprint arXiv:2405.21058}, + year={2024} +} +@article{bausch2022fast, + title={Fast black-box quantum state preparation}, + author={Bausch, Johannes}, + journal={Quantum}, + volume={6}, + pages={773}, + year={2022}, + publisher={Verein zur F{\"o}rderung des Open Access Publizierens in den Quantenwissenschaften} +} +@article{yuan2023optimal, + title={Optimal (controlled) quantum state preparation and improved unitary synthesis by quantum circuits with any number of ancillary qubits}, + author={Yuan, Pei and Zhang, Shengyu}, + journal={Quantum}, + volume={7}, + pages={956}, + year={2023}, + publisher={Verein zur F{\"o}rderung des Open Access Publizierens in den Quantenwissenschaften} +} +@article{zhang2024parallel, + title={Parallel quantum algorithm for hamiltonian simulation}, + author={Zhang, Zhicheng and Wang, Qisheng and Ying, Mingsheng}, + journal={Quantum}, + volume={8}, + pages={1228}, + year={2024}, + publisher={Verein zur F{\"o}rderung des Open Access Publizierens in den Quantenwissenschaften} +} +@article{zhang2021lowdepth, + title = {Low-depth quantum state preparation}, + author = {Zhang, Xiao-Ming and Yung, Man-Hong and Yuan, Xiao}, + journal = {Phys. Rev. Res.}, + volume = {3}, + issue = {4}, + pages = {043200}, + numpages = {14}, + year = {2021}, + month = {Dec}, + publisher = {American Physical Society}, + doi = {10.1103/PhysRevResearch.3.043200}, +} @article{wiebe2018quantum, title = {Quantum nearest-neighbor algorithms for machine learning}, author = {Wiebe, Nathan and Kapoor, Ashish and Svore, Krysta M}, @@ -5942,6 +6257,16 @@ @article{wiebe2018quantum journal = {Quantum information and computation}, volume = 15, } +@article{sanders2019black, + title={Black-box quantum state preparation without arithmetic}, + author={Sanders, Yuval R and Low, Guang Hao and Scherer, Artur and Berry, Dominic W}, + journal={Physical review letters}, + volume={122}, + number={2}, + pages={020502}, + year={2019}, + publisher={APS} +} @misc{sanderthesis, title = {Applications of optimization to factorization ranks and quantum information theory}, author = {Gribling, Sander}, @@ -6068,3 +6393,100 @@ @book{Iske2018 publisher = {Springer}, url = {https://link.springer.com/book/10.1007/978-3-030-05228-7}, } + +@article{mottonen2004transformation, + title={Transformation of quantum states using uniformly controlled rotations}, + author={Mikko Mottonen and Juha J. Vartiainen and Ville Bergholm and Martti M. Salomaa}, + year={2004}, + eprint={quant-ph/0407010}, + archivePrefix={arXiv}, + primaryClass={quant-ph} +} + +@misc{mathur2022medical, + title={Medical image classification via quantum neural networks}, + author={Natansh Mathur and Jonas Landman and Yun Yvonna Li and Martin Strahm and Skander Kazdaghli and Anupam Prakash and Iordanis Kerenidis}, + year={2022}, + eprint={2109.01831}, + archivePrefix={arXiv}, + primaryClass={quant-ph} +} + +@article{graph_encoding, + title={Fast graph operations in quantum computation}, + volume={93}, + ISSN={2469-9934}, + url={http://dx.doi.org/10.1103/PhysRevA.93.032314}, + DOI={10.1103/physreva.93.032314}, + number={3}, + journal={Physical Review A}, + publisher={American Physical Society (APS)}, + author={Zhao, Liming and Pérez-Delgado, Carlos A. and Fitzsimons, Joseph F.}, + year={2016}, + month=mar } + +@inproceedings{optimalstoppingtime, + doi = {10.4230/LIPICS.TQC.2022.2}, + url = {https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.TQC.2022.2}, + author = {Doriguello, João F. and Luongo, Alessandro and Bao, Jinge and Rebentrost, Patrick and Santha, Miklos}, + keywords = {Quantum computation complexity, optimal stopping time, stochastic processes, American options, quantum finance, Mathematics of computing → Stochastic processes, Mathematics of computing → Markov-chain Monte Carlo methods, Theory of computation → Quantum computation theory}, + language = {en}, + title = {Quantum Algorithm for Stochastic Optimal Stopping Problems with Applications in Finance}, + publisher = {Schloss Dagstuhl – Leibniz-Zentrum für Informatik}, + year = {2022}, + copyright = {Creative Commons Attribution 4.0 International license} +} + +@article{alphatron, + title={Quantum Alphatron: quantum advantage for learning with kernels and noise}, + volume={7}, + ISSN={2521-327X}, + url={http://dx.doi.org/10.22331/q-2023-11-08-1174}, + DOI={10.22331/q-2023-11-08-1174}, + journal={Quantum}, + publisher={Verein zur Forderung des Open Access Publizierens in den Quantenwissenschaften}, + author={Yang, Siyi and Guo, Naixu and Santha, Miklos and Rebentrost, Patrick}, + year={2023}, + month=nov, pages={1174} } + +@misc{allcock2023quantum, + title={Constant-depth circuits for Uniformly Controlled Gates and Boolean functions with application to quantum memory circuits}, + author={Jonathan Allcock and Jinge Bao and João F. Doriguello and Alessandro Luongo and Miklos Santha}, + year={2023}, + eprint={2308.08539}, + archivePrefix={arXiv}, + primaryClass={quant-ph} +} + +@book{schuld2021machine, + title={Machine Learning with Quantum Computers}, + author={Schuld, M. and Petruccione, F.}, + isbn={9783030830984}, + series={Quantum Science and Technology}, + url={https://books.google.jo/books?id=-N5IEAAAQBAJ}, + year={2021}, + publisher={Springer International Publishing} +} + +@inproceedings{Tang_2019, series={STOC ’19}, + title={A quantum-inspired classical algorithm for recommendation systems}, + url={http://dx.doi.org/10.1145/3313276.3316310}, + DOI={10.1145/3313276.3316310}, + booktitle={Proceedings of the 51st Annual ACM SIGACT Symposium on Theory of Computing}, + publisher={ACM}, + author={Tang, Ewin}, + year={2019}, + month=jun, collection={STOC ’19} } + +@article{Beals_2013, + title={Efficient distributed quantum computing}, + volume={469}, + ISSN={1471-2946}, + url={http://dx.doi.org/10.1098/rspa.2012.0686}, + DOI={10.1098/rspa.2012.0686}, + number={2153}, + journal={Proceedings of the Royal Society A: Mathematical, Physical and Engineering Sciences}, + publisher={The Royal Society}, + author={Beals, Robert and Brierley, Stephen and Gray, Oliver and Harrow, Aram W. and Kutin, Samuel and Linden, Noah and Shepherd, Dan and Stather, Mark}, + year={2013}, + month=may, pages={20120686} } \ No newline at end of file From 974fbfe56fbe6f875a920a9717ec2ace278f4f09 Mon Sep 17 00:00:00 2001 From: Alessandro Luongo <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 18:29:18 +0800 Subject: [PATCH 09/22] Update index.Rmd with command poly --- index.Rmd | 1 + 1 file changed, 1 insertion(+) diff --git a/index.Rmd b/index.Rmd index 3873ba2..34d989e 100644 --- a/index.Rmd +++ b/index.Rmd @@ -46,6 +46,7 @@ github-repo: "scinawa/quantumalgorithms.org" \newcommand{\tOrd}[1]{\widetilde{\mathcal{O}}\left( #1 \right)} +\newcommand{\poly}{\text{poly}} From 309b55aa746f7800cc54210c02904504dbfce876 Mon Sep 17 00:00:00 2001 From: Alessandro Luongo <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 18:31:53 +0800 Subject: [PATCH 10/22] Update index.Rmd with definition of symbol for complex numbers --- index.Rmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.Rmd b/index.Rmd index 34d989e..4436e06 100644 --- a/index.Rmd +++ b/index.Rmd @@ -33,6 +33,8 @@ github-repo: "scinawa/quantumalgorithms.org" \newcommand{\Z}{\mathbb{Z}} \newcommand{\Q}{\mathbb{Q}} \newcommand{\E}{\mathbb{E}} +\newcommand{\C}{\mathbb{C}} + \newcommand{\ket}[1]{|#1\rangle} \newcommand{\bra}[1]{\langle#1|} From 747ee168c320fd8c180ace600c1aa19304d74695 Mon Sep 17 00:00:00 2001 From: Alessandro Luongo <2940017+Scinawa@users.noreply.github.com> Date: Thu, 21 Nov 2024 02:44:57 +0800 Subject: [PATCH 11/22] Update data.Rmd with Alex's GRwork --- data.Rmd | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/data.Rmd b/data.Rmd index 127299b..1ddb032 100644 --- a/data.Rmd +++ b/data.Rmd @@ -535,7 +535,7 @@ Let $V \in \mathbb{R}^{n \times d}$, there is an oracle that allows to perform t The previous definition is also called *adjacency array* model. The emphasis is on the word *array*, contrary to the adjacency list model in classical algorithms (where we usually need to go through all the list of adjacency nodes for a given node, while here we can query the list as an array, and thus use superposition) [@Durr2004]. -It's important to recall that for Definition \@ref(def:oracle-access-adjacencymatrix) and \@ref(def:oracle-access-adjacencylist) we could use a $\mathsf{QRAM}$, but we also expect **not** to use a $\mathsf{QRAM}$, as there might be other efficient circuit for performing those mapping. For instance, when working with graphs (remember that a generic weighted and directed graph $G=(V,E)$ can be seen as its adjacency matrix $A\in \mathbb{R}^{|E| \times |E|}$), many algorithms call Definition \@ref(def:oracle-access-adjacencymatrix) **vertex-pair-query**, and the two mappings in Definition \@ref(def:oracle-access-adjacencylist) as **degree query** and **neighbor query**. When we have access to both queries, we call that **quantum general graph model** [@hamoudi2018quantum]. This is usually the case in all the literature for quantum algorithms for Hamiltonian simulation, graphs, or algorithms on sparse matrices. +It is important to recall that for Definition \@ref(def:oracle-access-adjacencymatrix) and \@ref(def:oracle-access-adjacencylist) we could use a $\mathsf{QRAM}$, but we also expect **not** to use a $\mathsf{QRAM}$, as there might be other efficient circuit for performing those mapping. For instance, when working with graphs (remember that a generic weighted and directed graph $G=(V,E)$ can be seen as its adjacency matrix $A\in \mathbb{R}^{|E| \times |E|}$), many algorithms call Definition \@ref(def:oracle-access-adjacencymatrix) **vertex-pair-query**, and the two mappings in Definition \@ref(def:oracle-access-adjacencylist) as **degree query** and **neighbor query**. When we have access to both queries, we call that **quantum general graph model** [@hamoudi2018quantum]. This is usually the case in all the literature for quantum algorithms for Hamiltonian simulation, graphs, or algorithms on sparse matrices. #### Bucket brigade circuits {#sec:implementation-bbrigade} @@ -592,19 +592,16 @@ One bucket-brigade $\mathsf{QRAM}$ call of size $2^n$ and precision $\kappa$ req We now move our attention to amplitude encoding, which was first introduced in section \@ref(sec:amplitude-encoding). In amplitude encoding, we encode a vector of numbers in the amplitude of a quantum state. Implementing a quantum circuit for amplitude encoding can be seen as preparing a specific quantum states, for which we know the amplitudes. In other words, this is actually a *state preparation problem* in disguise, and we can use standard state preparation methods to perform amplitude encoding. However, note that amplitude encoding is a specific example of state preparation, when the amplitudes of the state are known classically or via an oracle. There are other state preparation problems that are not amplitude encoding, like ground state preparation, where the amplitudes of the quantum state is not known and only the Hamiltonian of the system is given. In the following, we briefly discuss the main techniques developed in the past decades for amplitude encoding. - - - What are the lower bounds for the size and depth complexity of circuits performing amplitude encoding? Since amplitude encoding can be seen as a quantum state preparation, without assuming any kind of oracle access, we have a lower bound of $\Omega\left(2^n\right)$ [@plesch2011quantum;@shende2004minimal]. For the depth, we have a long history of results. For example, there is a lower bound of $\Omega(\log n)$ that holds for some states (and hence puts a lower bound on algorithms performing generic state preparation ) using techniques from algebraic topology [@aharonov2018quantum]. Without ancilla qubits [@plesch2011quantum] proposed a bound of $\Omega(\frac{2^n}{n})$. The bound on the depth has been refined to a $\Omega(n)$, but only when having arbitrarily many ancilla qubits [@zhang2021lowdepth]. The more accurate bound is of $\Omega\left( \max \{n ,\frac{4^n}{n+m} \} \right )$ (Theorem 3 of [@STY-asymptotically]), where $m$ is the number of ancilla qubits. The algorithms of [@yuan2023optimal], which we discuss later, saturates this bound. We can also study the complexity of the problem in the oracle model. For example, if we assume an oracle access to $f : \{0,1\}^n \mapsto [0,1]$, using amplitude amplification techniques on the state $\sum_x \ket{x}\left(f(x)\ket{0} + \sqrt{1-f(x)}\ket{1} \right)$, there is a quadratic improvement in the number of queries to the oracle, yielding $\widetilde{O}(\sqrt{N})$ complexity [@grover2000synthesis], where $N = 2^n$. This can be seen if we imagine a vector with only one entry with the value $1$, where the number of queries to amplify the subspace associated with the rightmost qubit scales with $\sqrt{N}$. Few years later, we find another work by [@Grover2002] which, under some mildly stronger assumptions improved the complexity of the algorithms for a very broad class of states. This algorithm is better discussed in Section \@ref(sec:implementation-grover-rudolph). -Alternatively, we can assume a direct oracle access to the amplitudes [@sanders2019black]. Under this assumption, we have access to an oracle storing the $i$th amplitude $\alpha_i$ with $n$ bits, (actually, they use a slightly different model, where the oracle for the amplitude $\alpha_i$ is $\ket{i}\ket{z}\mapsto \ket{i}\ket{z \oplus \alpha_i^{(n)}}$ where $\alpha_i^{(n)}=\lfloor 2^n\alpha_i \rfloor$). Ordinarily, the circuit involves the mapping $\ket{i}\ket{\alpha_i^{(n)}}\ket{0} \mapsto \ket{i}\ket{\alpha_i} \left(\sin(\theta_i)\ket{0} + \cos(\theta_i)\ket{1}\right)$, which requires control rotations and arithmetic circuits to compute the angles $\theta_i = \arcsin(\alpha_i/2^n)$. However, by substituting the arithmetic circuit by a comparator operator [@gidney2018halving;@cuccaro2004new;@luongo2024measurement], the circuit can be implemented either with $2n$ non-Clifford gates or $n$ non-Clifford gates and $n$ ancilla qubits. This scheme can even be extended to encode complex amplitudes in both Cartesian and polar forms, or apply to the root coefficient problem of real amplitudes, where we have an oracle access to the square of the amplitude $\alpha_i^2$ instead of $\alpha_i$. For positive or complex amplitudes, this algorithm involves $\frac{\pi}{4}\frac{\sqrt{N}}{\|\alpha\|_2}$ exact amplitude amplifications, so it has a runtime of $\frac{\pi}{4}\frac{t\sqrt{N}}{\|\alpha\|_2} + O(1)$ non-Clifford gates, where $t$ is the number of bits of precision used to specify an amplitude (the authors preferred to count the number of non-Clifford gates, as they are the most expesive one to implement in (most of) the error corrected architectures, and serves as a lower bound for the size complexity of a circuit. For the root coefficient problem, the runtime becomes $\frac{\pi}{4} \frac{n\sqrt{N}}{\|\alpha\|_1} + O\left(n \log \left(\frac{1}{\epsilon}\right)\right)$ non-Clifford gates. For certain sets of coefficients, this model can further be improved to reduce the number of ancilla qubits needed per bits of precision from a linear dependence [@sanders2019black] to a log dependence (Table 2 of [@bausch2022fast]). Also the work of [@mcardle2022quantum] doesn't use arithmetic, and uses $O(\frac{n d_\epsilon}{\mathcal{F}_{\widetilde{f}^{[N]}} })$ (where $\widetilde{f}^{[N]}$ is called "discretized $\ell_2$-norm filling-fraction", and $d_\epsilon$ is the degree of a polynomial approximation that depends on $\epsilon$, the approximation error in the quantum state ) and uses only $4$ ancilla qubits. define $f$ before here. +Alternatively, we can assume a direct oracle access to the amplitudes [@sanders2019black]. Under this assumption, we have access to an oracle storing the $i$th amplitude $\alpha_i$ with $n$ bits, (actually, they use a slightly different model, where the oracle for the amplitude $\alpha_i$ is $\ket{i}\ket{z}\mapsto \ket{i}\ket{z \oplus \alpha_i^{(n)}}$ where $\alpha_i^{(n)}=\lfloor 2^n\alpha_i \rfloor$). Ordinarily, the circuit involves the mapping $\ket{i}\ket{\alpha_i^{(n)}}\ket{0} \mapsto \ket{i}\ket{\alpha_i} \left(\sin(\theta_i)\ket{0} + \cos(\theta_i)\ket{1}\right)$, which requires control rotations and arithmetic circuits to compute the angles $\theta_i = \arcsin(\alpha_i/2^n)$. However, by substituting the arithmetic circuit by a comparator operator [@gidney2018halving;@cuccaro2004new;@luongo2024measurement], the circuit can be implemented either with $2n$ non-Clifford gates or $n$ non-Clifford gates and $n$ ancilla qubits. This scheme can even be extended to encode complex amplitudes in both Cartesian and polar forms, or apply to the root coefficient problem of real amplitudes, where we have an oracle access to the square of the amplitude $\alpha_i^2$ instead of $\alpha_i$. For positive or complex amplitudes, this algorithm involves $\frac{\pi}{4}\frac{\sqrt{N}}{\|\alpha\|_2}$ exact amplitude amplifications, so it has a runtime of $\frac{\pi}{4}\frac{t\sqrt{N}}{\|\alpha\|_2} + O(1)$ non-Clifford gates, where $t$ is the number of bits of precision used to specify an amplitude (the authors preferred to count the number of non-Clifford gates, as they are the most expesive one to implement in (most of) the error corrected architectures, and serves as a lower bound for the size complexity of a circuit. For the root coefficient problem, the runtime becomes $\frac{\pi}{4} \frac{n\sqrt{N}}{\|\alpha\|_1} + O\left(n \log \left(\frac{1}{\epsilon}\right)\right)$ non-Clifford gates. For certain sets of coefficients, this model can further be improved to reduce the number of ancilla qubits needed per bits of precision from a linear dependence [@sanders2019black] to a log dependence (Table 2 of [@bausch2022fast]). Also the work of [@mcardle2022quantum] works assuming an oracle returning the amplitudes of the state we want to build $\frac{1}{\mathcal{N}_f}\sum_{x=0}^{N-1}f(x)\ket{x}$ (where $\mathcal{N}_f$ is the usual normalization factor), and does not use arithmetic, and uses $O(\frac{n d_\epsilon}{\mathcal{F}_{\widetilde{f}^{[N]}} })$ (where $\widetilde{f}^{[N]}$ is called "discretized $\ell_2$-norm filling-fraction", and $d_\epsilon$ is the degree of a polynomial approximation that depends on $\epsilon$, the approximation error in the quantum state ) and uses only $4$ ancilla qubits. - + @@ -640,7 +637,7 @@ Meanwhile, if trade-offs are allowed for state preparation, we can further impro - + In addition to the algorithms [@STY-asymptotically;@rosenthal2021query], trade-offs can introduce additional circuits that can achieve the lower bound of the depth complexity. For example, using $O \left(2^n\right)$ ancilla qubits, we can perform amplitude encoding with circuit depth $\Theta \left( n \right)$, which further relaxes the connectivity requirements for M-QSP [@zhang2022quantum]. This technique also improves upon sparse state preparation, with a circuit depth $\Theta \left( \log k N \right)$, where $k$ is the sparsity. This represents an exponential improvement in circuit depth over previous works [@gleinig2021efficient;@de2022double]. This leads to a deterministic algorithm that achieves the lower bounds in circuit depth if we allow $m$ ancilla qubits, which is summarized in the following theorem. @@ -659,7 +656,7 @@ $$ \ket{i}\ket{0} \mapsto \ket{i}\ket{\psi_i}, \forall i \in \{0,1\}^k, $$ For any $m > 0$, any $n$-qubit quantum state $\ket{\psi_v}$ can be generated by a quantum circuit using single qubit gates and CNOT gates, of depth $O(n+ \frac{2^n}{n+m}$) and size $O(2^n)$ with $m$ ancillary qubits. These bounds are optimal for any $m \geq 0$. ``` - + There are also other trade-off techniques that can be used, like probabilistic state preparation via measurements [@zhang2021lowdepth] or approximate state preparation problem [@zhang2024parallel]. However, these techniques are beyond the scope of this chapter and will not be discussed. Interested readers can refer to the respective articles. @@ -708,7 +705,7 @@ Finally we note that in [@PrakashPhD] (Section 2.2.1), Prakash shows subroutines -#### Grover-Rudolph{#sec:implementation-grover-rudolph} +#### Grover-Rudolph state preparation, its problems, and the solutions{#sec:implementation-grover-rudolph} In [@Grover2002] the authors discussed how to efficiently create quantum states proportional to functions satisfying certain integrability condition, i.e. the function considered must be square-integrable. An example of functions with this properties are [log-concave probability distributions](https://sites.stat.washington.edu/jaw/RESEARCH/TALKS/Toulouse1-Mar-p1-small.pdf). Let $p(x)$ be a probability distribution over $\mathbb{R}$. We denote by $x_i^n$ is the points of the discretization over the domain, i.e $x_i^{(n)} = -w + 2w \frac{i}{2^n}$ for $i=0,\dots,2^n$, and $[-w,w]$ is the window of discretization, for a constant $w\in\mathbb{R}_+$. In this case, $n$ acts as the parameter that controls how coarse or fine is the discretization. Consider referencing the appendix for more informations about measure theory and probability distributions. We want to create the quantum state \begin{align} @@ -745,12 +742,12 @@ After the rotation, we undo the mapping that gives us the $\theta_i$. These oper Computing the mapping for the angles $\theta_i$ can be done efficiently only for square-integrable probability distributions, i.e. for probability distribution for which the integral in Equation \@ref(eq:grover-rudolph-rotation) can be approximated efficiently. Fortunately, this is the case for most of the probability distribution that we care about. -##### The problem (and solutions) with Grover-Rudolph{#sec:implementation-problem-gr} + Creating quantum sample access to a probability distribution is a task often used to obtain quadratic speedups. A recent work [@herbert2021no] pointed out that in certain cases, the time needed to prepare the oracle used to create $\ket{\psi}$ might cancel the benefits of the speedup. This is the case when we don't have an analytical formulation for integrals of the form $\int_a^b p(x)dx$, and we need to resort to numerical methods. Often in quantum algorithms we want to estimate expected values of integrals of the form $\mathbb{E}[x] := \int_x x p(x) dx$ (e.g. see Chapter \@ref(chap-montecarlo)), Following a garbage-in-garbage-out argument, [@herbert2021no] was able to show that if we require a precision $\epsilon$ in $\mathbb{E}[x]$, we also need to require the same kind of precision for the state preparation of our quantum computer. In particular, in our quantum Monte Carlo algorithms we have to create a state $\ket{\psi}$ encoding a (discretized) version of $p(x)$ as $\ket{\psi}=\sum_{i=0}^{2^n-1} \sqrt{p(i)}\ket{i}$. -Let's define $\mu$ as the mean of a probability distribution $p(x)$ and $\widehat{\mu}=\mathbb{E(x)}$ be an estimate of $\mu$. The error of choice for this kind of problem (which comes from applications that we will see in Section \@ref(chap-montecarlo) ) is called the Root Mean Square Error (RMSE), i.e. $\widehat{\epsilon} = \sqrt{\mathbb{E}(\widehat{\mu}- \mu)}$. +Let's define $\mu$ as the mean of a probability distribution $p(x)$ and $\widehat{\mu}=\mathbb{E(x)}$ be an estimate of $\mu$. The error of choice for this kind of problem (which comes from applications that we will see in Section \@ref(chap-montecarlo) ) is called the Root Mean Square Error (RMSE), i.e. $\widehat{\epsilon} = \sqrt{\mathbb{E}((\widehat{\mu}- \mu)^2)}$. The proof shows that an error of $\epsilon$ in the first rotation of the GR algorithm, due to an error in the computation of the first $f(i)$, would propagate in the final error of the expected value of $\mu$. To avoid this error, we should compute $f(i)$ with accuracy at least $\epsilon$. The best classical algorithms allows us to perform this step at a cost of $O(\frac{1}{\epsilon^2})$, thus canceling the benefits of a quadratic speedup. Mitigating this problem is currently active area of research. @@ -762,19 +759,23 @@ The proof shows that an error of $\epsilon$ in the first rotation of the GR algo + + + -If we resrict ourselves to considering loading probabilities from a Gaussian distributions then we can use the following approaches. + -##### The solution: Pre-computation +However, if we restrict ourselves to considering loading probabilities from a Gaussian distributions, then we can retain the quadratic speedup of the GR algorithm. This is because when we create quantum sample access to the Gaussian distribution, we must compute integrals of the form -TODO SAY THAT WE DO GAUSSIAN THINGS. -We must compute integrals of the form + \begin{align*} - \int_{x_i^{(m)}}^{x_{i+1}^{(m)}}\frac{1}{\sigma\sqrt{\pi}}e^{-x^2/\sigma^2}\text{d}x = \int_{x_i^{(m)}/\sigma}^{x_{i+1}^{(m)}/\sigma}\frac{1}{\sqrt{\pi}}e^{-x^2}\text{d}x + I_{i,m} \left( \sigma \right) = \int_{x_i^{(m)}}^{x_{i+1}^{(m)}}\frac{1}{\sigma\sqrt{\pi}}e^{-x^2/\sigma^2}\text{d}x = \int_{x_i^{(m)}/\sigma}^{x_{i+1}^{(m)}/\sigma}\frac{1}{\sqrt{\pi}}e^{-x^2}\text{d}x \,, \end{align*} -for $x_i^{(m)} = -w\sigma + 2w\sigma\frac{i}{2^m}$ with $i=0,\dots,2^m$ and $m=1,\dots,n$. But this is equivalent to computing $\int_{x_i^{(m)}}^{x_{i+1}^{(m)}}\frac{1}{\sqrt{\pi}}e^{-x^2}\text{d}x$ for $x_i^{(m)} = -w + 2w\frac{i}{2^m}$, i.e., for $\sigma=1$, which can be done beforehand with high precision and classically stored. The above iterative construction is thus efficient. +where the second equality is obtained through the substitution $x \mapsto \frac{x}{\sigma}$ in the integral, $m = 1,\, \dots,\, n$ determines the size of the interval partition $\frac{1}{2^m}$, $i = 0,\, \dots,\, 2^m$ indexes the interval points, $\sigma$ is the standard deviation of the Gaussian distribution, and $w$ determines the end point of the integration, which is chosen such that the interval points $x_i^{(m)} = w\sigma \left( \frac{i}{2^{m-1}}-1\right)$ is linear in $\sigma$. By the choice of the interval points, $I_{i,m} \left(\sigma \right) = I_{i,m} \left( 1 \right)$. Therefore, there is only one set of integrals to be evaluated for all values of $\sigma$, and we can store the integrals classically to high precision. This iterative construction is thus effective, retaining the quadratic speedup benefits of the GR algorithm. + + @@ -812,11 +813,6 @@ for $x_i^{(m)} = -w\sigma + 2w\sigma\frac{i}{2^m}$ with $i=0,\dots,2^m$ and $m=1 - - - - - #### KP-Trees{#sec:implementation-KPtrees} TODO need some introduction From b7ada14e994d9b735677a4ded30f591c25431e83 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 20 Nov 2024 19:49:13 +0100 Subject: [PATCH 12/22] Add decomposedlookups.tex --- algpseudocode/decomposedlookups.tex | 174 ++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 algpseudocode/decomposedlookups.tex diff --git a/algpseudocode/decomposedlookups.tex b/algpseudocode/decomposedlookups.tex new file mode 100644 index 0000000..3f3abd3 --- /dev/null +++ b/algpseudocode/decomposedlookups.tex @@ -0,0 +1,174 @@ +\documentclass[figure]{standalone} +\usepackage{amsmath} +\usepackage{amsthm} +\usepackage{amsfonts} +\usepackage{braket} +\usepackage{quantikz} +\usetikzlibrary{external} +\usepackage{graphicx} +\usepackage{hyperref} +% \usepackage{tikz} +\usetikzlibrary{patterns} +\usepackage{calc} +\usepackage[ruled,vlined]{algorithm2e} +\usepackage[nopatch]{microtype} + + + + + +% \usepackage{xparse} +\tikzset{ + gateX/.style={ + append after command={ + \pgfextra { + \node at ([shift={(-0.01,-0.01)}] \tikzlastnode.north east) {?}; + } + } + }, + gateXbottom/.style={ + append after command={ + \pgfextra { + \node at ([shift={(-0.01,-0.01)}] \tikzlastnode.north east) {?}; + % \node[anchor=north] at (\tikzlastnode.south ) {#1}; + } + } + } +} +\newcommand{\Oplus}{\ensuremath{\vcenter{\hbox{\scalebox{1.5}{$\oplus$}}}}} + +\DeclareExpandableDocumentCommand{\gateX}{O{}m}{% + |[gateX,#1]| {#2} \qw +} + +\DeclareExpandableDocumentCommand{\gateXbottom}{O{}m}{% + |[gateXbottom={#2},#1]| {#2} \qw +} + + +\usepackage{tikz} +\usetikzlibrary{backgrounds} +\usetikzlibrary{arrows} +\usetikzlibrary{shapes,shapes.geometric,shapes.misc} + +% this style is applied by default to any tikzpicture included via \tikzfig +\tikzstyle{tikzfig}=[baseline=-0.25em,scale=0.5] + +% these are dummy properties used by TikZiT, but ignored by LaTex +\pgfkeys{/tikz/tikzit fill/.initial=0} +\pgfkeys{/tikz/tikzit draw/.initial=0} +\pgfkeys{/tikz/tikzit shape/.initial=0} +\pgfkeys{/tikz/tikzit category/.initial=0} + +% standard layers used in .tikz files +\pgfdeclarelayer{edgelayer} +\pgfdeclarelayer{nodelayer} +\pgfsetlayers{background,edgelayer,nodelayer,main} + +% style for blank nodes +\tikzstyle{none}=[inner sep=0mm] + +% include a .tikz file +\newcommand{\tikzfig}[1]{% +{\tikzstyle{every picture}=[tikzfig] +\IfFileExists{#1.tikz} + {\input{#1.tikz}} + {% + \IfFileExists{./figures/#1.tikz} + {\input{./figures/#1.tikz}} + {\tikz[baseline=-0.5em]{\node[draw=red,font=\color{red},fill=red!10!white] {\textit{#1}};}}% + }}% +} + +% the same as \tikzfig, but in a {center} environment +\newcommand{\ctikzfig}[1]{% +\begin{center}\rm + \tikzfig{#1} +\end{center}} + +% fix strange self-loops, which are PGF/TikZ default +\tikzstyle{every loop}=[] + +% TiKZ style file generated by TikZiT. You may edit this file manually, +% but some things (e.g. comments) may be overwritten. To be readable in +% TikZiT, the only non-comment lines must be of the form: +% \tikzstyle{NAME}=[PROPERTY LIST] + +% TiKZ style file generated by TikZiT. You may edit this file manually, +% but some things (e.g. comments) may be overwritten. To be readable in +% TikZiT, the only non-comment lines must be of the form: +% \tikzstyle{NAME}=[PROPERTY LIST] + +% Node styles +% TiKZ style file generated by TikZiT. You may edit this file manually, +% but some things (e.g. comments) may be overwritten. To be readable in +% TikZiT, the only non-comment lines must be of the form: +% \tikzstyle{NAME}=[PROPERTY LIST] + +% Node styles +\tikzstyle{rectangle black}=[fill={rgb,255: red,64; green,64; blue,64}, draw=black, shape=rectangle] +\tikzstyle{new style 0}=[fill=black, draw=black, shape=circle] +\tikzstyle{CNOT}=[fill=none, draw=black, shape=circle, tikzit draw=black, new atom] + +% Edge styles +\tikzstyle{dashed edge}=[-, dashed, dash pattern=on 4mm off 2mm] +\tikzstyle{thick edge}=[-, fill={rgb,255: red,64; green,64; blue,64}, thick] + + + + + + + + + + + + + + +\begin{document} +\begin{quantikz}[ + font=\footnotesize, + row sep={0.6cm,between origins}, + column sep=0.5cm, + classical gap=0.1cm, + wire types={q,q,n,q,n,n,q,q,q,q,q,q} +] + \lstick{$a_2$}&\octrl{1}&\octrl{1}&\octrl{1} &\octrl{1}&\ctrl{1}&\ctrl{1} &\ctrl{1}&\ctrl{1}&\rstick{$a_2$}\\ + \lstick{$a_1$}&\octrl{2}&\octrl{2}&\ctrl{2} &\ctrl{2}&\octrl{2}&\octrl{2} &\ctrl{2}&\ctrl{2}&\rstick{$a_1$}\\ + &&& &&& &&&\\ + \lstick{$a_0$}&\octrl{8}&\ctrl{8}&\octrl{8} &\ctrl{8}&\octrl{8}&\ctrl{8} &\octrl{8}&\ctrl{8}&\rstick{$a_0$}\\ + &&& &&& &&&\\ + &&& &&& &&&\\ + \lstick[6]{$d$}&\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\\ + &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\\ + &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\\ + &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\\ + &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\\ + % &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\gateX{\Oplus} &\gateX{\Oplus}&\gateX{\Oplus}&\\ + &\gateXbottom{\Oplus}&\gateXbottom{\Oplus}&\gateXbottom{\Oplus}&\gateXbottom{\Oplus}&\gateXbottom{\Oplus}&\gateXbottom{\Oplus}&\gateXbottom{\Oplus}&\gateXbottom{\Oplus}&\\ + \setwiretype{n}&\push{T_0}&\push{T_1}&\push{T_2}&\push{T_3}&\push{T_4}&\push{T_5}&\push{T_6}&\push{T_7}&\\ +\end{quantikz}=\begin{quantikz}[ + font=\footnotesize, + row sep={0.6cm,between origins}, + column sep=0.2cm, + classical gap=0.1cm, + wire types={q,q,n,q,n,n,q,q,q,q,q,q} +] + \lstick{$a_2$}&\octrl{1}&& &&\octrl{1}& &\octrl{1}&& &&\octrl{1}&\push{\cdots} &\ctrl{1}&& &&\ctrl{1}& &\ctrl{1}&& &&\ctrl{1}&\\ + \lstick{$a_1$}&\octrl{1}&& &&\octrl{1}& &\octrl{1}&& &&\octrl{1}&\push{\cdots} &\ctrl{1}&& &&\ctrl{1}& &\ctrl{1}&& &&\ctrl{1}&\\ + &&\ctrl{1}\setwiretype{q}& &\ctrl{1}&&\setwiretype{n} &&\ctrl{1}\setwiretype{q}& &\ctrl{1}&&\setwiretype{n}\push{\cdots} &&\ctrl{1}\setwiretype{q}& &\ctrl{1}&&\setwiretype{n} &&\ctrl{1}\setwiretype{q}& &\ctrl{1}&&\setwiretype{n}\\ + \lstick{$a_0$}&&\octrl{1}& &\octrl{1}&& &&\ctrl{1}& &\ctrl{1}&&\push{\cdots} &&\octrl{1}& &\octrl{1}&& &&\ctrl{1}& &\ctrl{1}&&\\ + &&&\ctrl{7}\setwiretype{q} &&\setwiretype{n}& &&&\ctrl{7}\setwiretype{q} &&\setwiretype{n}&\push{\cdots} &&&\ctrl{7}\setwiretype{q} &&\setwiretype{n}& &&&\ctrl{7}\setwiretype{q} &&\setwiretype{n}&\\ + &&& &&& &&& &&& &&& &&& &&& &&&\\ + &&&\gateX{\Oplus} &&& &&&\gateX{\Oplus} &&&\push{\cdots} &&& \gateX{\Oplus}&&& &&&\gateX{\Oplus} &&&\\ + &&&\gateX{\Oplus} &&& &&&\gateX{\Oplus} &&&\push{\cdots} &&& \gateX{\Oplus}&&& &&&\gateX{\Oplus} &&&\\ + &&&\gateX{\Oplus} &&& &&&\gateX{\Oplus} &&&\push{\cdots} &&& \gateX{\Oplus}&&& &&&\gateX{\Oplus} &&&\\ + &&&\gateX{\Oplus} &&& &&&\gateX{\Oplus} &&&\push{\cdots} &&& \gateX{\Oplus}&&& &&&\gateX{\Oplus} &&&\\ + &&&\gateX{\Oplus} &&& &&&\gateX{\Oplus} &&&\push{\cdots} &&& \gateX{\Oplus}&&& &&&\gateX{\Oplus} &&&\\ + &&&\gateX{\Oplus} &&& &&&\gateX{\Oplus} &&&\push{\cdots} &&& \gateX{\Oplus}&&& &&&\gateX{\Oplus} &&&\\ + \setwiretype{n}&&&\push{T_0} &&& &&&\push{T_1} &&&\push{\cdots} &&& \push{T_6}&&& &&&\push{T_7} &&& +\end{quantikz} +\end{document} + From 2079d134f0e856fbe9af336d4482359b06bb319d Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Sun, 24 Nov 2024 13:14:03 +1100 Subject: [PATCH 13/22] Add tex and png files for KP-trees and refactoring of data.Rmd with minor changes on intro --- algpseudocode/KP-trees-example.png | Bin 0 -> 25662 bytes algpseudocode/KP-trees_RPhase.png | Bin 0 -> 26438 bytes algpseudocode/KP-trees_RY.png | Bin 0 -> 25071 bytes algpseudocode/oracle_models.png | Bin 0 -> 31786 bytes algpseudocode/oracle_models.tex | 2 +- algpseudocode/quantum_architecture.png | Bin 0 -> 31372 bytes data.Rmd | 129 ++++++------------------- intro.Rmd | 32 +++--- 8 files changed, 47 insertions(+), 116 deletions(-) create mode 100644 algpseudocode/KP-trees-example.png create mode 100644 algpseudocode/KP-trees_RPhase.png create mode 100644 algpseudocode/KP-trees_RY.png create mode 100644 algpseudocode/oracle_models.png create mode 100644 algpseudocode/quantum_architecture.png diff --git a/algpseudocode/KP-trees-example.png b/algpseudocode/KP-trees-example.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2668d1718e6729e1a8f645a761e8ba6d3d50d6 GIT binary patch literal 25662 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 literal 0 HcmV?d00001 diff --git a/algpseudocode/KP-trees_RPhase.png b/algpseudocode/KP-trees_RPhase.png new file mode 100644 index 0000000000000000000000000000000000000000..de40966be2429cd64a6a52d2afff3a6facdb713e GIT binary patch literal 26438 zcmeFZ2UJs8`!0^CU_qGCQ6_?5K~QNLRHOuS9K{HNh=R0WAs|AiQbGu280B+7Q9_Zf zgNT3-BoG22fTAJ<5|kz+0R%#*0TMz8q5OAnzV>VPerwJD-rv3JE|)8ubN1P%z5Cto z`#jIP?_abu+p=lrCMhYYE%0+cUy_oNB}qxGWo%dn_ITaTcmaN-ZTM>hYkY3qUBnrsiS>${uRErUSw63}xQXd4GQ zQfUcd?3I#olY#$y>T*cWO6PWZmaR#oAk5xck1*sRz-PFBv;- zIRuRVTJY-NmB7<|PhLADzyC;CeDt_B;*9G%8YMV`u5rROqdD`jCw>>^OxVpLif#Tg zEE~_6Vsm{n;gonSLgnH$xw)c6EH>B?y3aoeWRYMGMc#1tb z(o#~{YJTK{;E+`MtUY7>Za9yiW+r$#d1KbxfO^8zll+5}RM_vdaZARTFDALeF{qU5 zxY zdB2;q@lyibMPY2@75y0H4Dh$w_ayz_C)`U(WIGNj1vHJ+`Hs|Od#~Gt3CnN$*0KHu z<~XC)Awc|c@^^4b>vm~jTGRCH6C!wKx${o2r|PXCb3Dz7WmLKB25}aI>T(LzO#9}F zXKC*6nnS3R8^>JO{-H}w2&hA&E@qM=5Hx~v{c*t=4R31 z*EE~b={-8{3dYccc$a$+A|-yyD0?P+J$@zYt71n!c=Uo9mr57unaaf*}2;_zP&9!phs@GEY5&(jG9`T7@+pF&&G3 zOC7}65-j3}i&o=gB6aCU7}N9MU?Jj#lJ1Xz4z`puF68h2mg_Ttvsrh(CMM0Z?NiK}pNAnqy71^N_a{^2#p`uuk zK3~Yt`I)|0zL+9vKq=lp#wO!aiO@zkG0>0^t}->eBv>4|(g)#kG*DB#ekd9lNN>_O(qiZK4dUER0LlvKG$=$=twjDn_ zsO!8{Qe@oX!N4>e*A$C#h}4qYaMJCxF(~duk^7xM`mY{!&bTwCv#u?uWY(sq@nuPM zJGPO!0=AO`1ZkmD_;>m)0qMvJ>5+Y?{Uz_$aRpwSD~WYy+uM})r?Oe03@!5Zld2w? zQ7E@$Ub&NKz(xBPA7bF5due1U|gj%aJnnRbo~$8<-N? zk&2R7;LhE?5{vzhZC@WWIC`@G|B935UrkESGP^{!2}5}(Mc_yyy}u`Q@!138ihpb# zc`g~@{|#SASZC0hQ0{n`CY;ws+$?cb6~G)t{xgEuKQ@27BoA)=Z$9fk{chLnOU@=P z$=NR4ol+OEiRLV$+DAiunuEmH*9o=BrXM3Zg7$>6Iea_5STbyGo@op1nNU4|lVkKY zo}J}~=uf5al|*8c;=mQG{>s^9KZzr$eX`;c&J5aPdlYZhvK$3%@@5!yKdMd0W-EZf zCQDfszoIiF-h$#!8t}>J^kCc#x5!7OJnbqj#3w8D?cz+VSD1@lFhWgP)h0%yx%iOf zrc2Vb-wr2THz87Dq?Af*=;>ke{>kB3EvuD(@E3I8#o6I;DqNX%zJH0of>6j8qf*Gh z;R!DEK5jQh6rpX(yFYt=p?eT5fOtY&_1p4H1DxH`8IB#@O(+YO#jtQA(-GE;cdsr- zKQu(;)u66=D9Nt9!7$zB!=zhJlbWm}qkeMfT|I(~n8VDOl$nMn))EGMjv5nvcZHI= zc)kk4%_{C01m%usqA<^;$^OHIh~x6(2cpB8ccaH95N>}R!q_XfQ^Z%qo{X`M=N?iQ zQnePIX?S`QCTyj!&x_U(uf|IU+xz|Yv@~$zc9 zk;E!q@AIEdlE*wACN%TBDSz`D$H#5@5k(E5X{U}n-Eiv)>}75ZIy500Nwg2rj5PUd zE6pghiozVzxSzWln8_{bj`duqj<~A})rGbskjDc1z}^yw<2DlYI?eydpi-aV1N%c@ z+Pc-)xsEITRF&nH%p%6FmjctT2S!?Ww9(kCq9!=)y5BB|rD=ajt8)%6#gPe@veXtN z)8?&uaNhH*E>Y%GGqlCq9%XO@wEGgNy@{z{*mzP^au(i)u~z6Y>~=^NOo{>&y1$s8 z;pTcwG6f?TJJxZbT7w$Hdn;VU#I)*Bf^k}04z3;d8XvCwgT0wno43t5u zs*F%%C}=Q}Y$D5TEBp(EJilVYc=_nb;bwU__R^W_%|XoumY?k5aD6NPb%Lhu-(S3Q+IdHQR` zgj>nX@?`z{#UacVCkW`HE_np45S-BNp)&QRcRrE_wYNx7_Xf8&{cEq#*ECm-kluCy zfpnG+$Z*XH9ykuVwCesvg{$EevYzXo0Z-shI5)>iZYI8)TL)`=D{4lP%+(n37$n{p~h zk2PD~DNr*?)#%o3KuzrdeLEA&ql~t^s>@UhOrxkZ{yZf4q<#!#5=W`#7tFJ);RE+S zg7~v;+rkf|zM}S!fnAUM!4{Zr!A=lTOGfCQ8dj7Q z$TdBW>(N<%vH}D|;S0c+q{5n-cB|^0YqEyjB5O%G=N7G7IIp08GF=^_RU5LXI#%N=XAs_XGC}H23TUJW8eI`QOf91Bb9i5ky@h_LubPu-;+aq-=*90ZS%%C$!Pq~zTdz36i{=6ld=Cte2BkWWcDT#lfN*qKl-@&WK% zckb6wvbsB9l1v~{$;6W^1=FWg>DPQ>z&`rPXu@b5cnxEYHVb|qHtBW+<8>Va8Wa>lyQ8TSG+HK{eLGNb;(Xv;~M+LqvL+30fEX#!&ksQGaI)eBV%r9Cj znfz(CS;%wYNb;^T{D}@UF5;<0DPzv^_>ex2&c_iqe=zwR6-)Nte(v zS>#=2EQOs5`c!c2v#mONsZ++gY9M|bPjvoulK*>Ts6$`5Gq+*nE5bZ8sqKu7$)WnH zAFm{#|=D#5-sfFAM<} zWEG9Qs_y=*!W}Bi%51~u#&g~n*5HQRSMz9`=_qTQx_HQ2AKXi~xx2W!bLd-0N#iN3 zM#c)IwF5pDcFg7NqhAp=sY4-t!lx>fdFu}bRO`0rixn3DbYUb2TQd8_EpbU%z4FuG zQt4l#zu7DQkm02rMO_dK-5w}|GmvWxhf4#W;45279oNi0CT{(5Lt40?BhHOEGbH2v zGSA>Vlu8!-Jw$AN#M?qjOSqX_p_`6sd&EmQ4Dz8!q8Fo;Q~ZS(+EGv0h>3k>UZ12p z1wyuK<{Ozx7de%Sa&CPk67Rk>3UhkwC?=L1gKQ6yKux!@>nM8!uHRS68h`|26&GQw z<37mOK&PX1_Eto(L7VIoQJCnlqdoyg+~@oZyvRqvzA|`!?@Pl%BZH5|_cbfQjA7!D zUG5w?X%pWBKa2hpDw%P-Hb;@y1lIg`RWk2uQ2!4ej$r!#Z<&z)8`x_U_{0)allMct zbI@C4wbjq0Ad~^n7)>mfU_t2m_Q`Q7+y@7vGmwdD2KkZ*t4_nRzxO-8bWWo62Z(Dj z-_R4x#jM=&b=NQ(m`Z;8yt98}Fzx2_8mGr1+LYV*MC!U$n1i_#G1il$Kj`~?g)_MY zhP-GpG`+CJHNl$Jbe+ML9@$Z}Uy5PY-y2z)-8jHSWL7xutYUu{iDAr9{TRr#Bl42t z=lT(j5Vr_F;d3ziZOJ68^ecT-OHBkB>)H`H(7+Ki=v(ecW0;{7?-n17E{wmaa^tDm z$*q!;&-Wv2Ac!p*rbp5b2`#b~M_MsHfiPNl4?0cf9cY)b-3Qj?!GeThZ@)< z7c`G!+5|G>8x2c8h3_+MR4sRo+kRpE6i&fK#-OGu5lLPYEjolhiRcYFV#uL$x_Gjp z6aZyeJ5U3c*o#z^&QAzJ&RXi%9KE%(40llrLS^a&Hn}##w8;uFqx+Dbv(R@7Q&C}+ zFB)9z{jK&6!U*Gs4QlVUFyxcQ%!(TW(uiX+}u}l zi!7Bnt0`)+Tf)?~&dK}ayV#4Elhe5rX<=w__9lIV)R-2sJm%nF279W4q6d6z*yGI5 zn&q{}@{~;swp`?OHqS9$$?=XvKUaqJ4pN$r2Uipj!g}Xw-ne;an<6iiC&95@b2YD7 z=UYs@$a0Qj)!Z`YUt9dPfc|9<1{uOYWx{~PC^d?7F%;{*Jb1VkId85`; zCj;c=PrE=nEzqu|`BF{t_*kJPq8!WdllW@_f2U8jf3jZ}{;OpIw5fZoYKsNI1}m-L zd&YC)ta&~ou*lDD6^y%gufwC4S!w8(m9x;PbS^TzELqA+HA-ox9VbxN$Ny1n`jA;S zRVfD|#UWQPC;6TYkH}i{B7pdl89*Ovlls#u6 zHraR2PQY~hxn6Az@RlcaB_W#Ot2o}CMg$CfC$?~`ko_SzM)c@SQv`R#X(a|VL9A*2`Jocb)xHSpm7gT6jP9nF62`{g^sIu= zCJ5K863>vb(u{^4%n?-l7145hRRs&BHndx0F$c!DX%QY7Y4t>5g-=CBt{XGxpsfiF zyujbbE0j$LZ(dGrEiTcG4#TBs(7CIin0^JSGPhV?ySyB5>T#a3ln)!osAV;y`9g# ziFQ$E-!CknUN=c3+lk_E%HHK^`hRMuecqT5TOZ^+77islzM|pD3`D?K#kA9sP z(GzP+f{nR$ccaHy(N&e~6F2pRN*w1UM(c0UW_^b;h2t5o{vlNB-$vM9lnY`xH^&p^ zXh1O$l$n{rQn`SPA!mwk;PO4ulcC9$H+IN`!MtG&7cW7-7F+iK|Af19mLonLpp)JC zfLywHcWZn=GQX-V$e;=z=Ra3xvC=kinX+SgLk9`+-(G%?tDJ)*+ggC`_6hbMHmynfNFNSHa=Y8|QpgcaI67*`q)@qriTBey4by<~>iGI9>UsTs%wN|l|}I2u;qrDQFV*e6Uau4-{;(aG`5dEI0!tE4n@I=LpiS14BhzFq+ZczTF!LbE z4fsJ50P|Wj1$pi%aePdc!@KL%2CNqjb-LaLXHDP8+`wcX&XKi!YjVCcLIaVl7BBRZ zV9(i1mkkrPLs>&ZV;c2pm83(}a(a!{j6m=v>w-o;JomskIb~zbVY&o4y-M`mz|16% zAnF^|#*SiT_GyEbq28aa|U+#V@? z65g}-hn)-isur!WKyvS<#)$olDks=9aW(l9A4Wx7>P;D}rk{dIm|w4-Wu=8TP?Iq` zhO6d#CquAlA{)J=uC@te2!_a0itu<69qMVx3r(O0B(yCMi}mb8VGsHMIDTz&;PrE& z`PA&bP4qy7r5^hBF>dH3Hv=7xL1krC5X9ZIeuC-ZN2a+{Xt-zm%XLl!DxZ1 z$1ZlL&K>G~Nsnf_YlC&}`C4^`CkmWg%xXl1^!ECC{wa2oFjt>uI3W&WGN3E6M)2;}-qlzMIPO zq=hF^sQ1dPdsy$~*nH)(D_~GaRlQoO!$Q)`=-z$|Z#O#r9V-s{@#_GWZ0M6G2aexy z9FHQ?_)e~wtQA{``o{|A=_O?`2zO{UNZ1l$P?0tkcIHb}> zsAKhRV(NE9XK29Hk)MO?CH=jqSvFIfI%^M>4k5*`%6ltHBc0(XAs`mS$+wwwR)=3P8NqM(yiT6_d}2uUl_DBwzV}Uo%&FzveT3* zf|fhogRmBgWYr0p^>O@m-vs{itO{pOFcdyC?^rnpuIS(#C0>&kTL;r3JClm5L9FVd@(-F&u8`e<*0JRGsaU z{T_kN`8uNjPhmBa{niWL2HFQPbk1Lr=O4i-voFA^xY@;=Kn*j<(2~vCzHzvAd3!?J zdkt%y`ze?-6%IJ-Afz&9n9N#3TnP8*(k`a1QCUuDP+(h5x+9RB@8!)i5 z5FL|p!+feL9TQC(KicM>P;XJ{A`^&bg{}kGPvXn~t;{@?vwy6*S>WpuDyUoHz3B?< ztkhgX)5Txc8JxTKbBZ+$`ccbA6?ROaH2su3HK5BaKHw2r1`dI3%TXYt5Y+642XWA= z?QPMFPV}4vq)SA@LY9F+Uc*$o?s(x%dvh7Q)1z&nX&#x$)Qc>O8FvN+?!vV; z;|}tYF@T_YV%@Kg4J%uSA?_K8u810Ywcl7_15sqFF5h5!;0fiTnFF2&>NAj!jE$cx z-ivL!&KrVWS5)2EyhE71ke(A-_T@(98r>WYv54?~`^+w<8^BwpP4n!Z7#hm9oqFh> zSW)h3Yf4X79y&19Q_Lm;XyBHp=~w7S0E#HXFuMe7diI9T5M))m$u7?Bls%!9;Y%}H z8HmJ^wQck@QYYJ*O2R&d52GCwxWVRNz^EDM&;!k!iw9se)jl8{WIk}b80m>ZN&eY!s06DL6 zw%he4c*2{3T`TqR0Ww8wW*;@|36HpuD|$m4-m-i^#fK8`UdJVZ`qZ5m1^ z{~}({t2_ma#~gKMhkC$aL1Z1vE+u=vc1JBX@Iu32-k{*Eo1)7UptwJN?dTXtulYq> zX)8zw^7*wc5N3IaVYw|JG^awS5b}e7M1RWu}$0|XkwqK-yGq|sn?G+ zNtrLfb5&lTy)ApIY~iDn741>^Gw=TAdX`nnY5n9$g&N}vs^Y}kVS|rVoT&IXz3Q~~ z+WVR$#r>~BK_vLa_S>Z>yM2Xi1#3&P#ff9X+nEY7TxGW@noD2*cBUqF0L*Eyvaj|} zn%}fi zrf|&V`6T7Y<&XK;@l9N+&G-kezaSH>DQTV09*>*qR502z#=%^BFg^2bep|rdO!w5v zHq-AVmzp)z?WoP9)-BDK@6{Jq;D=9FzaHqDdGK{;i_?nrz1Xc;THW)2f#~xJT7AvG z)=>maA%0Nfn%TO{aZ`WKfxD&Ie8*EE{H_Qm`C@dCA8^Sd`7N}!uJSLkz9We}lCt_^ zE5FOLYQB3SeEMgI8lb_Q6u4fQUegQl(5vgX`<58s4Htnk+64wrPU?O$bdVg2 zyFT?v+uP+0c4Q8nL(*#3Wy&|M)h0z_)p?0goQ< zm}`2foDy%KrAi(85YzxsH^{frh8?a7?r~X+xGK|K8|*ANi(feqov}aFJ#RrS&dL^& z2!|A{oRDHzI5y_7CEvwFwvG9SXD%JA+tGc)w{ajJA!9&&Rg-UoPA^Q!@qfZn(-4gI z4vJw+#XQb|27@YLcc%>K6!@Rr-h2;DAQ|y9NvtQDOSd}roF~3j2fk}T*`l}4<$IEN z>;PX4_rC7&Qih9Dt~JM?>cpC+@Hw0^Y*z)<+h2I+rCpm&yHS^`7jGfHG+hCL9J@2L zP2XPbaQZ9Jx0^iv<%^aDD?7STEcTQRw(78-OOW%=P=oZHC>n+&okC~VgAijh|D#Uv zj7~Jh^vUqo@dDlAj;q{-c#Y!i2M7I=g^;0h%wb%xsIer<4qiqF1|3aRz+@h)N!4B_1BYpwbWx;cUZf6> zbXG-9!wY3!A5f{&D@&Sn$xOmoBv|NVwICl6GCK7Yg-x@2>vWE7Zkz8FO@{^?rs&JI z-CoB<6cQ$qawgm|tkqMI$sQojX>;_$JXvCB&Ubh;;o>pA9K3O*pa?}z>DvJajy-1G zExU34-~Z;*{PyxgXk+gK`zKlRk)vM?o}B0H3^=^Y{n04STs|PilZ3&8Ie?Y# zW(oU<<|35*7h8Xs1)mQ;4Ld#Wb)UJ2yprtr}{0e1<(UH=xreDWxXhJ9Z$XMVLtj*=9V>N z=%x(ZfM zH8~grm;iiBI_Ux$6&1*qx9jg%kqY?@u<9CrhHNs@HtAGqqBSE|YUDUz@2vpAB^7C9 z|LvX&WF^pFq2%h4CuviQes3qGl2f!U^n5?q^qL9m1uw$T!g1qlV%?V3-$TA#QGYJ5EfG0LMXDXliPQV2#R=>LDN5CO$Bj#Seb=^Dm1e{5*{!4xKLr_qdSvk@ z+n-i|yz*pW)6=kzUj>dI)p9bD>WS3#t^0e)-GRiw0|JZFyG`rsj%i zZWnYrF5PqF@9B#Wre?2LHAS=seQ)%Y8paCx9^p7e6U&b{XSR&rS&~JchZq~mk$uXN zKq_R~l3hLKl9-z|BWjxLE(4=s_U3sMc^$>}o`^&;D)PbC7&XNx8h=q3n<}H20v5|7 zoH7Zmiyjv6)m4|zQrEV+`=kRkH#UgTdxpqV?Q%hpH!wJ7)(FaKJju-Xnfzvlu~!*7 zX*_EPLg3NjUv)!4$PpDSzLY4sO`Gr>)uD7ivHxP4Qk$?6ygUUsF1s2WP=Y3dCpcnz zM<7!wSDHTB=5rvWdw9+^(AJXpB1WvsVOT9MjxUlX_XgE*MCFU_qArx;;PwZ&tIi?E zu&)Rrb}qW5ED27t3p4F>?rB1XCHFO3Aq1IUNp@4G#Y6FYjOOy$6h`eBu~QpYNEUk< zH=Q^Jz-se8Zv*od(&VLAVHqF`K2z(xWTFrKsGn~&^#%$c;47*=24QZ|){OmkJO`80 zdV(MeLE{0L9-1jH_o0v)J~K6z6dgZ3kDj!##*TL$xN?;ZUrcak`kGdi-UacN;0wPR z)ijQhZ?!eCa@DrLCh*aHUDyww+4UGQ3Tkg*_1j8 zF*LMe9XAD4d1=F!$Ztd6(FagmWBC9t-kIHnOH$c5vLD61RF(u3PD1qw?XL}j><=T5zJ@C0lrIs#zqpJF>Bw+3Z*j3??HN=)Hj-p`PB2ca_?e_IK z2ebc~dy3XXn*1y^dm*zUXVE2L(Hr*3W$ko{VWF9*Pfhd;44G5?y-z|DDpEOn{gouN z{`CEAps>P{e;i2P2K~SM!7tZQtOIR>cTkU$5`bo^i_4683o= z5Ce;DT$5;&vb9c2WN-g}D9-*2Y0gRaB%kxzG04^+1H@1LAQgDZnB%{WW9YmaTlLpf zo*KaSOPoz?>7iAL4y~YVV(2Km)TLMGd8<-Vr*bl;1C33=sWp1j7JjH)F9Bc-i@C@& zH3%EaK-vRt2ec7Rx@M_Cgd7L&Z@m=qs~wpvT{0@g&0tlG2fIjD#O3XW*{3+J-iNCE z4wsm2AMyd}Y8A}LT|=s9fcsnl%Uo@a^)q-G_6W{6gZ|dPO9q0qZ592t8C$%4QB)$w z&}j)+eTIdbp@DdQY_udvl$vc2b-=(R{I}wRD>bo_K*bF1BTr6b+0!$2$)@@nzRte=q+{x3&*N~RfFeQFD>k8IxLPQ zYXtVJn(By56b37{^YjL^{;IU{r@u-H@(JI>Fm_jCFwVF_j7C?V*5Gzk_P;6A+3vDm z6rgEpWP$>JAg0E=dS}`Dk#~-jx{y)#*ZW5wx}|Xb&Qt^JZ+p&RtO5-Jn|! zwE7Ka!;*%KmW+Dw{e_E1O)(v{^P5-eS;CSy!4Qqqz>0A~JJGx~fSvxH(QA(l5Kyd5 zs{5aXUyR5DPC11~2qXX9#otBAo$Q)8s#Hm}|MgOupg~~A(0MzDwmu0f0Ro-U-NWGOYvJgBRId}vUs@zA#;iK`lnDKm!zP26uarz@Y2s_-VaZw z3qr9KlRT4P;OIlo+6fIY9a61njlZjgmJT1MdarLalW=^JDSs35f|Yp9Y%5#VkALj% z1f~Uubb}CQHhTRGYq3tS?=7nMn^4OQh)!=xM5irnxJ50(-}WQ^eCh1J;K(AuWC(0s z>Q(<=OHp{rs}9BFk5Uw#^8a3c`>)o?+)D%lyH$gdYHq&j_N+qnQj+&b@a_L?#Zjvo zOyU20jK2E9M{vE(xj-fGw}?SK*^ktkMGg>FwQf+>I_;S;?tJaA`@A};L`7V zt&E59Y%@{4-BN6J1%>K3hAA|zrCv{HGenVFUdEI5Pk?}NsAZ{mh@ zyL+N9b1Kqab(Sz6AO)~rn0;-Go&5*5BB@ss9|!B%2z|h>`EPp2z2b#1o8_Im=5?1)ppeX z@pPcCzu1*$KmS@oFKYYeLZ79-x~S-7hvnTX9h%FOB?Lub5~s?ZGA6eycTjTFw!~{Y znFl%!24RC+{&i2%g>_z<{m(oJLF>npHtMmjb#VXWCS-0kft;`ApS+6Hmi&KE1$?XV zu>gsm#eY!yvufObMppN)YQtBn(oSa2y6I?t^An>jP7bSs?$6LQ&sXwll!?xNDL#NJ z?F)i{QTs*SG=&Aq0Dg9l3%Gg@r3etyNYu4+q6>hB`eSRiZ{J0_9`(6gj}Az6rIs{& z`+^cr0Y(OZms06n6Z_u@jeOQ~9mn9qNBlrRZQb#OR_61sY^+J|QdS+d3x4m6q2=usJ?wHPW+~y^GJnDe>!W0^44BLQZ5M^N^Y_cfu2}M4Brk|g@2ecQ zG;#TPf+YTE}2wo^Q zq@xpXRs5@ai}O-h2tm_x4~0(+AcUO0Px`H!9!Ta6mvLd0?>+A6yPw)dQoU%Uw;K1E ze6RRe+-T5D^*-B;8TPYGNXJT$?$TP)&tk0ojnA|Gq%R8-A{1tDX!%zzxT04sVAevz zqM;xCkbgjSG42|4H#KHn5o z#Oa}fPKfTdHRE+JhR^Qg7M`gN&JKMAb#k(;xdId-@4txM7f3$Ja)p4old68$5*&h1 zuWDEz#Rtr`%MEvp8RtQqi$ewN&poIU@7P-2=1Zd{K;PrK*gSBpOZK#cov#}wjZKFI z{XAEyvyBxUZzqonEt$Q^y81wzUx$6Y&AiCWx#D$<@F-p2=b{={B(9UBCppD@&Lwo< zU9&JCSCAvr4*Bxb;ILZ61F;DCCizKTm{A8m!<{!|JlSQ+sM#Z^(>xdr?f&9Uka7f| z1=D{QNxvQH)MB!HG13%)rj@qIQN2r-4VhFc%}z7PmAFe`s`8qHV{+FY}JK;fF1?&iwCGywnPx|bG$YQ?K6 zFQcF}V`9_W-Y!v-b_%!ieZqWYr++~0_oXA{G2TZwNS0ECvy1_)abKa2g5Jlr!Yi3> zm(QA}3}NUKZwK4%IWG>;r27LAbR|lG=tSGXz$3?aDD{wCgcX0fWP$2nA6R1u?6>o> zRqjf;Vp5UN_vv6X>S zACRJh`s(QZos*^H6LS0{P9ZStYgkNd>aOFZUj3|Tr?cG=hbB8XRfq=o3vgF4R$j9@ zZE7*X;HQ8ZaLvlR;_l_x7EbFLw<+eNYKtM~Anu7cGUlpGrBmVnOLGbaZVo;+ap*gI z^)DUUbO=+|A9kM4BByq=xp#go=7VGv>Jaa1q=m-%E~M#I zxPo&Iwwe@#rTc;sg2wQp&C#bF|+>ePh_~O=0egwIua0AW0L?(A0?NlVZJWFR}z6xjAHc)KY~&J756?5VP768qcIn!eV@KJBu1Gryo> z+DHMb5!lO_DN2N94z|J_sgog-A1OalB&Hyem_k5uTNTclrec{MYj*VxOJ_St(a67s zq=rS%?P~oifs}Gkxt%`FSWqWa*D^+3)J2c3%a2)FmZrx;-1E3YAGG|C8L}z+bj6VN z%w}HAMDnT1u*7H!-q*+HpCG51cLhMY;#ML1Af^6&(zs@XBoIP|-7JQf z8ans*$&aBE&@yOaYp&Z7DCTY*NkhW;Gj_c-Fo1{ z$+lLdz^4zE7qe>+ZWAM4WAmsd^78;4m^d`!JpvzAbS~4~$c(-c@l1}l>>X0XF=*jF z_&R`Nk_^d~dgQ+_14D1xsV-8H38Poy#Us5{U*a3aI4>S%yM}W@XW$@rqAVl=@SH_ql|`KKPr6TBY%{2}(&6L2WjOL_*{Gy;X|0D&DTj!Lpv(UDqp}unxZ}}`thTy^c>+Cop6ssAwZg^u!=N=HUTUB|oy9Ui0ZSOFSP_l)v~>!gG}*w7f*QQy@z> zk*?bcWE1fbKW#esd(pZq+lP8^D4muz`OY|687BM@sb9}DkJYz;lEdQmhmt%i{VW_ zyKcIZ!>)PPq*ErtCsdD@2C3C0gLxueGuof{jFg!%9Cp8>A{d9sd4{JF(%%IB7?BHa z%PKkGmdTb3bQV+xmw`;n#4u>Q`6r9k+&MSXj+PZ>;E2Mkk8YEJv)th)e___iSnQbm z^uqSxx-VzJ^zl8Q(%$FN#~UWwDOG&tZ%)XN%%jwys4K6%rnfrpA4S)%*2$(S_a`_**VnRF~K&TKv|jB)rZZj!=|}j{pD9(p}bn$q&8U z*O6Hz{CKD<-u61g$s#pq(9w?n0d{!{#6)l_9`MR9Wn*iPcDEY()M3=k+${%G z-9yM-vGIkQbyl~W{qz8eAHteCfLrr zuq_Pn0gk=(i8nL&xGGMs`BQ*i+x|dXnj&RVZ2k@`j3jmZxma zw^g!SYs%}0`D@umpxc%&6o=XZBUUz9sB7sRv5UJodg#-JFe8L2G90r|o^(M)_0Gk6 z5MAv0x4cBNVR>GR1sugP0Ubey=*A?13I9vNF6n8`jM7AF7b=m0^Q zVyxzTvUP;#0>cA4R?*(+^I)+bRAwk*eoUa6Z&!}8YXum6`r#@KmHmg*0R8ZP0mk|#7V%RhI`&qL zzb**yh_kwW)@d7|%vNRVJ8JtR zOr$K?t}NHStZfh4{;F_MkfB|CXRL-8FZ8!H#(|P{U0!Wdwg=^hNn+AU?V`{4O4!}c z%d(>Ea9-eCp25qNapL$jXZA``ZEFxDxqVK2pZzLC{mt>u^(}crMkvLnYip8ft3J=XwlLfRyP_xlVUbu5Qe3ulF_X>VIieJ=uU*($A->U}w~_cr z#oJ`RX|tlFNJudU#?~5KY&>7fQ{YcJ^ymaj%7?&ed27Ryha@$Zaj2PJ^zvQ8GlnGV zRK(3C)=zL$@w1vMC&s)?0ZRKr`iw{I80zz8n%bA2B$CMgl8C*Q>@Rie>bR$PIeV;@ z6|_srIByX=bh$%hgmpyzq~SF&D2s`FQBG;T$cRwA20`I_mSRzMpw1WIE=MO7c;l#| zNk>qBxso%vN$ToPg_=DnJ#$<_=Ipn{I%a)O$0S+Hz=r`p2VcmQgI;!D;+!beLb0hQ z8i;rIZFGJSqhwex0YrebZ~&5o*~n9$PHq*PNgcW=&(K*vetY;tvNc2e{)LC8%X!C2 z?X(jKJ?FnD!BnyVWYU=MaUD zTRzzqTT0F~lANms&MirqB_`I(jSpzMUZN9l=(7ejge!~y^l`TbDh2jI{=AVvZ`6ap zj@bAiT!Y^hGJIHgeiZ#_V^5RfM8s(n`*@eV{;^;+7r?bEsrjCc1~NwXmG!kJ8YhN* z0h$L-uuf(6+^)z#_4PL@cG-`?VK2>6d?>1ANyj>`=)w}rl^ar$Z#}u5AjW2ADHgTa z78ida`kRlxO5bUcpnDLk8gTr4|Gf{1K;d!~>lX`c+Kn^99tD)VW7p-5oaR!bZn$m{ zf$eqkLEsgF8Sm}~w6B9UJ(lR9Y1cIiAwCG~ya1jwy!h)q*`(_q&|%Z<>^)Sm) z;V-7k^LZV?=PwJJ#2HDMhE}p=4({e-whsc^&OW?3XvRBpwleM}0O6`Li2i}tTbg8B zcUF7+K9Mx&@j#T43Q@cmmyJwrQ-;lz+Q{qC_UWES>gU8k=~`_WeXJKWs^td-1TJvp zE=E_?KO-1rXU7O6{-V=yRlf+U>@s>zr^sT5&;16t4Er#gE6_kAsxRkomfGlwD0aay z;_o^g_WA<$IUTs;#ul&?g39Ii+xfZ4?-@jUliK+ewzf||!u2`+%-3AKrW0a=&=K5Z zsbfu}-`P~;qorzkgP8iIogeDUDR||VAZy|Wzz}3b^~e~0vVf3l-u-On_=~{!LC;-{ zNn2DZ56#@b!*mfZEBWE6oLHiN$4nQMqCrp(tMy*LL5lj2BT{OGJK$w3w?*DY;5>5%Quh;58UhI8s{+aB<$K2@?9SO(gN_UR*Y7cV8Tx}Zs0?c@#LDImo#U*}=Tb5!=7D&;< zrjA#NgwT&eG^iA9=EX-L34xt0j$_Ab#)``H z)4ep6V7TKf+nS*fpVDELZBf@EN2Ia(FP@<@wN*Swyg%m1_XA3n_8!f3T)7>=L8>Cr z``8J}**!7&UAoEoHMJ2dXM$&bT4=%Pu9>poe|@bDwQTVV2qX^pc~EG{8<^%@U-Fbl zE}_c$!D{*{q!6UQBq=hf&;uK=ClBcE%5d1zX@*>iz z(B`ZUc9f(!cO1C!C`>&nw~m#`@c$d9`&>B-iU@;63~?0uRQnL=r67WS)k`ie0fivZ znCON%s1-D1@q9^XHp@b__QUHejxny`o-jNuaIWkjurSKViJG~`PU!fojGC94^w`+z z1?Ye)Jsv@~E7ALrumYqXn`dl>b~IlKyMKQot?UzjIagwM!}OAe61y8XS4=VmcD_4G zDa(JxABqhsO<+8`X&Nn?Hxs} z&xj69)aby0CA17i-u<+zsH+=lc;zN*wsdgb(2O^9pZ(O^gvVM+g$aWS9qF;5m*({T zzq+nHD(P(dH`A?FH9hXMtZOxT=jNlEDQ4vZU(-X&)GQtG35+R`4^UAoAK^@9-Nw=h z15!lu)k6hR6rVsfm5GIwiXozzEs5|ppzq{7`i?vwa^WFQLv(G-~?ETrF zuTNb%?F5MGx)J-K(G;8{RY@pW*LCC`gj6( zug=^^=VLgHYiOIqI?Iw=KL%tf=_B+~DhPGFbe`La>z3<({lm>Ldcbr8XVhw#Zi8D> z58y*68+4E9({65(7thu|(Qpn$QG%i*Q&vS$#Ky+7XivXyHd05msO5Y*ic&)r%K!M5kRZ@YZL(QOCH=Am zIKAYhD?j(~`jjN2yzxS9+RUoj;#=Ko)<6*i#KjToGoa!rw+@NLs-M26ry;;b2fw)R zPS_)gfd+tizBKYqcr%=D>t%B#o*ZEzN{#zn;0ig(WQfDt^fv9rZu|GWQ;26$d3=>e zSaZw`I%7ZB7F?l3Zvct}1V2|DNX{j z4o+#fANQf}e*VW*eX$rX8eC60os$0z<-(5FzW{6BX3~Dcq{Aq8#Evl{vYk#kRg%`( z|3L2H3hBO1oFGTg%w>+{3{H03a2s-7Q$`POc#d5p1qy068U}yrxZAO?wHpjRUiB0o zf+FS_qsX*1yV_4c+)+(U>&8DSvp-1iy-Lqv^%n% zR4sfr+*(}{3BM0Kz4&Iv752A@M z`fA=n`0OhmCR$k2eT!sjUT}6m>y3=Xlg;Md4;np_{69S^!8Becn&0gjd#5TZ1_uqI z58ow!B00fa)CZJs{h~znwxU0EAcNh;4PasL<;=zJJO|}`5-oyE%QBo0b3f@1DyiCsy zL~PE>f9Wv)c4h$g{rCh!zAab-w0)zxiyTMxJYRf5%;N|W<5VJ^7rod^U9@-bWtZ^& zgK5TWkp@d9_@*_emhfGRC0+JCA_bRQgFvT_#^^Q#`}hfa%GIjlSpRDDTUY8itDww_ zaAgC@=pvVYbN7fDYbw`%E8ybQA5I+cI_;U-VRV2eF%V&?iHka`Wg*3zfYZI?7v_bI zbr0f--c)n{wd9HLM|buQLc`{+7c-5R#mp>9!@i*~Tr0(-onhMH8#C|IQZC>}r{rHp zIR5i(kQcXPnz<0x$+h6{QSj|d6JwNA!aWjaIdv+BANq;A;cv8qWIB6T*X zTUwCZ-j9)G2O^P~BhNCg-CGo%I5xbuBl`TdUjTD34j*G#uBdKO)bFfWfDQi_2Gpe{w$q<@#KxB3ABhJuwQfkjVHMRi2X~(Y(ncf?%5skbXWo70!&UaNf^PKn& z1=5jW9vJIhWCX5hG5$d2U}NGa(|;wrh6O_)VGPy|p16QrH>z=+RNWkq()Iht1n~?B zjFB?SBt&-f!5UxnDdr^XPTjz(x}RdJEQ7icKEkxWLuF&6gC+ISxm~DRzxy;s-#Ct+ z|M^dJSi@JbJKHgCMEXC=i)0nW;no*eC#J=*x0s()1YI$tpTB1IAwAiwwNimGFR=$m zLW;NDH#sjjt_XsW!k@nz?ZnalBlHTY@_X{8n533}5riSEgDIMipYdhYzULMk?H4A7 zDsp|={6Weo+V#cUIu?L?j^%RQ3`;(?PN01Un^zyl64~F9|DM347bD>NA0k^CT)u{= zmDRz_Ox@|vB`&R<=|1)|%GaabNOwieo9)$x@K}1x_B;cPM)i&0X-BpO2s+tzZ7(1c zNUPnBr9lQgH+nb5RJ~Dgndl||bV(z-?hRCd3KI?OYWC_s5q#;9fl18I|LW?8aW`_h z=t$**IToai0x44y9!`Z$mA47d+PpC&jdS>hA@oMQH>AL#-O(HCO@zYRYE3Dt`-~92 z`EotGSi`|swI;%nkLQ6^fG<7Zdd^DI6S6gK*LeMe%+U)MTnw+fBnXqY)I<|+JuVL@ z+G*irtwx?}H?C>kKDLl;K6u?t7}5&PB?@@{yFpfFH~w{6G(T~*`tAuRd}oP%f+O9x zy zcxb^Tl^kKS8gG8jN|2IPEID@8^kSMnXU@&i#5_nP;}s(MLaYoToxg~jlY2M`q&FLX z>v&UUq84Xt(X5l}g)|KZYvr5(OFq^GI@z#P^N|p?mI6rWs#p`Z^b_cr#WR-4zOH_v z7b|H%fvb#HRn*kQtCM%LDct`O&@1;amfM!QK(`#HQKCJ)uAl}6E4^QpsKw_;)h+a% z(81TLFXmnt!gpYp$b3`EGIjY4!7G)4eVKb(jiqfV==-8y5j=qw5ee^o4(zT!4RPzV zG39sV_h@5tW76+-X+KfDoLaTE>Wd=Ch@DLqTQMO6%QpZmJ{+cb!qa)NNwX!7BtJu$ z^0RxEE54I8^kwdZEX8DUQfPC$=Pl!NC3(-5yD4hyj7)rJ zV-lG)n=aack&X9=*so#Sr}z3{Z<(uSyD+SWFp{%=zMghANys^RX z#z9rtR1Y}y%whByiPNfdarjcjKvR%b|A7In>f>=?=d6&!0T`<>=U;XdCfw5O-%=9y zmcTAu{%}wc=Nwa0jZlLfyLcPZFRU4gXIs~kX0B~+D*Xz;c&>L=htmQ*3#9j#^_!SM zXt94Je6A3zd1c$VtUq4u`#c&&pRxhAwrZMAS7LijB8!t zcY(s%$!yF0^eaE&N*?2g$eno#9R>qh?D?X_%|EozP5G&;#$==gTA#?KfwH;Dxpaw6 zT#Nu%Vj7YU5%K_;x=D~61p&-V_Dx5_!Ciqi8N#U4K*j9simJW~^YKKv2lbB$6{TnH z$}(_FzB@eBu}lX+b>bt*U*Q{b+kT{x8v(u0Ttz`Uq!rwCQeL%*;%FE{%%%H_PSihj zqAy{^=65#z1$*ukjYKGJHS3_W=u2O23S;OgK_L z?sDUmw3(jOQdrHx&}$hnN)hi3E)9|VGh4YzS1Dj$W`E13q8@{&?th9YIEj%?GC|&E z1808WyriO`A=I6>pj$yxPl8FA9VtxdKM1JcIsrWFPIQSSozV-5%#2n%yc}<-DSNh6 z;U{LSAgAbSedK7tHp4UVs-cdqP@MuPT!w=OXWF#!l;uP&cCss8G~N}4y@2lmERPF4 zy{58b)=L@z&-kmR_aleM$xbnG2 zzm9tfG1rW5aVJviwFNy8*b_Yh25()2c+%i5N$j85xJa0L{`(LIZDXGHHP1Rh6|Hd~ zF2cmw=R_rExo_t)EhZTz1FOUj_sCs3m>J4rxctwNSZaOiw^)Zo1&O_+xzEZ$pB&QX zES9lx`_o?kUOOw&=+Qxi;v5g^L<5E5$w*^`MlYoV|(7bc+XRt2@usoS@eid8z z0$k6X5v_6KmjV#_PMhKR8f2mv5X}SdTX1TL1dtTX$8_Db#&0mBk!XQ2#MJrmXt8++ z%>)bnXi;ER7tGV+bx)Q}h57FZH)Iq;me4%eBRDxKA{hmZ#G$~?3Oif71J?WYS=-tE zxX%{4&k?%c$;#FiYHNGu*|34;aK_w+eU=sd! xo1-_<4QQw>hBgUNXQ40@E-5-5yW-SQPwRa)2LtRw4Hmk>%j4ux#^IkX{TpnX<8}Z5 literal 0 HcmV?d00001 diff --git a/algpseudocode/KP-trees_RY.png b/algpseudocode/KP-trees_RY.png new file mode 100644 index 0000000000000000000000000000000000000000..46b859b8071c844a69ff2e8a4aac71f43beb7ec4 GIT binary patch literal 25071 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 CY)4E0 literal 0 HcmV?d00001 diff --git a/algpseudocode/oracle_models.png b/algpseudocode/oracle_models.png new file mode 100644 index 0000000000000000000000000000000000000000..9a636d1cc8c7ec9ccd2a7b68d755a44af071b920 GIT binary patch literal 31786 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 literal 0 HcmV?d00001 diff --git a/algpseudocode/oracle_models.tex b/algpseudocode/oracle_models.tex index 8970468..1688b8e 100644 --- a/algpseudocode/oracle_models.tex +++ b/algpseudocode/oracle_models.tex @@ -3,7 +3,7 @@ \usepackage{algorithm} \usepackage{algpseudocode} \usepackage{amsmath, amsfonts, amssymb} -\usepackage[braket, qm]{qcircuit} +%\usepackage[braket, qm]{qcircuit} \usepackage{tikz} \usetikzlibrary{calc} diff --git a/algpseudocode/quantum_architecture.png b/algpseudocode/quantum_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4d0e81e9c89fc70797b8293c922de52e13c167 GIT binary patch literal 31372 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%0DKQC>C=Z6iLglawsL1K5$qQB0fUzO+ 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 Contributors: Alessandro Luongo, Jun Hao Hue, Francesco Ghisoni, João F. Doriguello -
-
Version: 0.5.1
-
+
Version: 0.7.1
- - - - - +
[Pending updates](https://github.com/Scinawa/quantumalgorithms.org/issues/92)
+
- - - - - - In this chapter discuss how to represent and load classically available data on a quantum computer. @@ -508,8 +497,8 @@ What if we want to use a quantum circuit to have quantum access to a vector of d knitr::include_graphics("images/multiplexer.png") ``` -```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]"} -knitr::include_graphics("images/decomposed-lookup.pdf") +```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]. Importantly, only one $T$ gate is required to write in the target register a single memory entry. The memory entry is written using a Fan-Out gate (which can be decomposed into CNOT gates. Note that the depth of the circuit is linear in the number of memory entries."} +knitr::include_graphics("algpseudocode/decomposedlookups.png") ``` The idea of the circuit is the following: controlled on the index register being in the state $\ket{0}$, we write (using CNOTS) in the output register the value of our vector in position $x_0$, controlled in the index register being $\ket{1}$, we write on the output register the value of our vector in position $x_1$, etc.. This will result in a circuit with a depth that is linear in the length of the vector that we are accessing, however this circuit won't require any ancilla qubit. We will discuss more some hybrid architecture that allows a trade off between depth and ancilla qubits in Section \@ref(sec:qramarchitectures). The Toffoli count of this circuit can be improved in various ways [@babbush2018encoding;@zhu2024unified]. Importantly, the depth of this circuit depends on the number of oracle entries $N$, and in simple implementations depends also linearly in $m$. @@ -562,10 +551,11 @@ Calculate $\sum_{l=1}^{\log N} l$ The time required to perform a query, owing to the tree structure of the BB, is $T=O(\log N)$. This can be seen trivially from the fact that $T \approx \sum_{l=0}^{\log N -1 } l = \frac{1}{2}(\log N)(\log N +1)$, but can be decreased to $O(\log N)$ (Appendix A of [@hann2021resilience]). This leaves us with the sought-after scaling of the infidelity of $\widetilde{O}(\epsilon)$ where we are hiding in the asymptotic notation the terms that are polylogarithmic in $N$. The error that happen with probability $\epsilon$ can be modeled with Kraus operators makes this error analysis general and realistic (Appendix C [@hann2021resilience]), and is confirmed by simulations. For a proof of Equation \@ref(eq:qramfidelity) see Section 3 and Appendix D of [@hann2021resilience]. +(ref:hann2021resilience) [@hann2021resilience] -```{r, bb-qram-image, echo=FALSE, fig.width=5, fig.cap="A possible implementation of the bucket-brigade QRAM in the circuit model."} +```{r, bb-qram-image, echo=FALSE, fig.width=5, fig.cap="A possible implementation of the bucket-brigade QRAM in the circuit model, from [@hann2021resilience]"} knitr::include_graphics("algpseudocode/circuit_bb.png") ``` @@ -600,18 +590,9 @@ We can also study the complexity of the problem in the oracle model. For example Alternatively, we can assume a direct oracle access to the amplitudes [@sanders2019black]. Under this assumption, we have access to an oracle storing the $i$th amplitude $\alpha_i$ with $n$ bits, (actually, they use a slightly different model, where the oracle for the amplitude $\alpha_i$ is $\ket{i}\ket{z}\mapsto \ket{i}\ket{z \oplus \alpha_i^{(n)}}$ where $\alpha_i^{(n)}=\lfloor 2^n\alpha_i \rfloor$). Ordinarily, the circuit involves the mapping $\ket{i}\ket{\alpha_i^{(n)}}\ket{0} \mapsto \ket{i}\ket{\alpha_i} \left(\sin(\theta_i)\ket{0} + \cos(\theta_i)\ket{1}\right)$, which requires control rotations and arithmetic circuits to compute the angles $\theta_i = \arcsin(\alpha_i/2^n)$. However, by substituting the arithmetic circuit by a comparator operator [@gidney2018halving;@cuccaro2004new;@luongo2024measurement], the circuit can be implemented either with $2n$ non-Clifford gates or $n$ non-Clifford gates and $n$ ancilla qubits. This scheme can even be extended to encode complex amplitudes in both Cartesian and polar forms, or apply to the root coefficient problem of real amplitudes, where we have an oracle access to the square of the amplitude $\alpha_i^2$ instead of $\alpha_i$. For positive or complex amplitudes, this algorithm involves $\frac{\pi}{4}\frac{\sqrt{N}}{\|\alpha\|_2}$ exact amplitude amplifications, so it has a runtime of $\frac{\pi}{4}\frac{t\sqrt{N}}{\|\alpha\|_2} + O(1)$ non-Clifford gates, where $t$ is the number of bits of precision used to specify an amplitude (the authors preferred to count the number of non-Clifford gates, as they are the most expesive one to implement in (most of) the error corrected architectures, and serves as a lower bound for the size complexity of a circuit. For the root coefficient problem, the runtime becomes $\frac{\pi}{4} \frac{n\sqrt{N}}{\|\alpha\|_1} + O\left(n \log \left(\frac{1}{\epsilon}\right)\right)$ non-Clifford gates. For certain sets of coefficients, this model can further be improved to reduce the number of ancilla qubits needed per bits of precision from a linear dependence [@sanders2019black] to a log dependence (Table 2 of [@bausch2022fast]). Also the work of [@mcardle2022quantum] works assuming an oracle returning the amplitudes of the state we want to build $\frac{1}{\mathcal{N}_f}\sum_{x=0}^{N-1}f(x)\ket{x}$ (where $\mathcal{N}_f$ is the usual normalization factor), and does not use arithmetic, and uses $O(\frac{n d_\epsilon}{\mathcal{F}_{\widetilde{f}^{[N]}} })$ (where $\widetilde{f}^{[N]}$ is called "discretized $\ell_2$-norm filling-fraction", and $d_\epsilon$ is the degree of a polynomial approximation that depends on $\epsilon$, the approximation error in the quantum state ) and uses only $4$ ancilla qubits. - - - - - - - Instead of treating the problem as a state preparation problem, we can also perform amplitude encoding using multivariable quantum signal processing (M-QSP) (See Chapter \@ref(chap:5)). The principle behind this method is to interpret the amplitude of a quantum state as a function of a multivariable polynomial [@mcardle2022quantum;@mori2024efficient;@rosenkranz2024quantum]. Particularly, using Linear Combination of Unitaries techniques, we can approximate the quantum state as a multivariable function by a truncated Fourier or Chebyshev series [@rosenkranz2024quantum]. The truncated Fourier series approximation requires $O(d^D + Dn \log d)$ two-qubit gates, while the truncated Chebyshev series approximation requires $O(d^D + Ddn \log n)$ two-qubit gates, where $D$ is the number of dimensions and $d$ is the degree of the polynomial used in the approximation. The number of qubits in both techniques scales as $O(Dn + D \log d)$. The exponential dependence in $D$ can further be improved by the following theorems. - - (ref:mori2024efficient) [@mori2024efficient] @@ -624,11 +605,8 @@ Given a Fourier series $f$ of degree $(d_1, \dots, d_D)$ that can be constructed ``` - - -check asymptotics in following paragraph -Meanwhile, if trade-offs are allowed for state preparation, we can further improve the complexity of the algorithm. For example, we can build a state over $n$ qubits with depth $\widetilde{O}\left(\frac{2^n}{m+n} +n\right)$ and size $\widetilde{O}\left(2^n \right)$ if we have $m$ available ancillas [@STY-asymptotically]. On the other hand, we can reduce the number of $T$-gates to $O(\frac{N}{\lambda} + \lambda \log \frac{N}{\epsilon}\log \frac{\log N}{\epsilon})$ if we allow a tunable number of $\lambda \frac{\log N}{\epsilon}$ dirty qubits [@low2018trading]. A dirty qubit is an auxiliary qubit that is left entangled with another register at the end of computation. It cannot be reused by subsequent computations without being disentangled. +Meanwhile, if trade-offs are allowed for state preparation, we can further improve the complexity of the algorithm. For example, we can build a state over $n$ qubits with depth $\widetilde{O}\left(\frac{2^n}{m+n} +n\right)$ and size $\widetilde{O}\left(2^n \right)$ if we have $m$ available ancillas [@STY-asymptotically]. On the other hand, we can reduce the number of $T$-gates to $O(\frac{N}{\lambda} + \lambda \log \frac{N}{\epsilon}\log \frac{\log N}{\epsilon})$ if we allow a tunable number of $\lambda \frac{\log N}{\epsilon}$ dirty qubits [@low2018trading]. A dirty qubit is an auxiliary qubit that is left entangled with another register at the end of computation. It cannot be reused by subsequent computations without being disentangled, but can be uncomputed using measurement-based uncomputation tricks. @@ -637,8 +615,6 @@ Meanwhile, if trade-offs are allowed for state preparation, we can further impro - - In addition to the algorithms [@STY-asymptotically;@rosenthal2021query], trade-offs can introduce additional circuits that can achieve the lower bound of the depth complexity. For example, using $O \left(2^n\right)$ ancilla qubits, we can perform amplitude encoding with circuit depth $\Theta \left( n \right)$, which further relaxes the connectivity requirements for M-QSP [@zhang2022quantum]. This technique also improves upon sparse state preparation, with a circuit depth $\Theta \left( \log k N \right)$, where $k$ is the sparsity. This represents an exponential improvement in circuit depth over previous works [@gleinig2021efficient;@de2022double]. This leads to a deterministic algorithm that achieves the lower bounds in circuit depth if we allow $m$ ancilla qubits, which is summarized in the following theorem. @@ -656,7 +632,6 @@ $$ \ket{i}\ket{0} \mapsto \ket{i}\ket{\psi_i}, \forall i \in \{0,1\}^k, $$ For any $m > 0$, any $n$-qubit quantum state $\ket{\psi_v}$ can be generated by a quantum circuit using single qubit gates and CNOT gates, of depth $O(n+ \frac{2^n}{n+m}$) and size $O(2^n)$ with $m$ ancillary qubits. These bounds are optimal for any $m \geq 0$. ``` - There are also other trade-off techniques that can be used, like probabilistic state preparation via measurements [@zhang2021lowdepth] or approximate state preparation problem [@zhang2024parallel]. However, these techniques are beyond the scope of this chapter and will not be discussed. Interested readers can refer to the respective articles. @@ -674,20 +649,23 @@ In summary, there are many methods to perform amplitude encoding, each with diff -: Table of different methods to implement amplitude encoding, together with the their gate count and ancilla complexity, along with the function type needed. This table is adapted from [@mori2024efficient], - to integrate with Table 1 of (https://arxiv.org/pdf/1812.00954.. first 3 rows). 1 [@mori2024efficient], 2 [@Grover2002], 3 [@rattew2022preparing-arbitrary] 4 [@sanders2019black;@bausch2022fast] 5 [@moosa2023linear] 6 [@rosenkranz2024quantum] 7 [@shende2006synthesis] 8 [@STY-asymptotically]. +: Recap for the different methods proposed to implement amplitude encoding, together with the their gate count and ancilla complexity, along with the function type needed. This table is adapted from [@mori2024efficient], + 1 [@mori2024efficient], 2 [@Grover2002], 3 [@rattew2022preparing-arbitrary] 4 [@sanders2019black;@bausch2022fast] 5 [@moosa2023linear] 6 [@rosenkranz2024quantum] 7 [@shende2006synthesis] 8 [@STY-asymptotically]. Gate count or depth with * is expressed in number of $T$ gates. -| | Method | Gate count | Ancilla | Depth | Function type | -|:-:|:-----------:|:--------------------------------------:|:---------------:|:-------------------:|:---:| -| 1 | M-SQP | $O(\frac{ndD}{\mathcal{F}})$ | 1 | | | -| 2 | GR | $O(nT_{oracle})$ | $O(t_{oracle})$ | log | Eff. int. | -| 3 | Adiabatic | $O(\frac{T_{oracle}}{\mathcal{F}^4})$ | $O(t_{oracle})$ | - | Arb. | -| 4 | Black-box | $O(\frac{T_{oracle}}{\mathcal{F}})$ | $O(t_{oracle})$ | - | Arb. | -| 5 | FSL | $O(d^D + Dn^2)$ | 0 | - | Arb. | -| 6 | LCU-based | $O(d^D + Dn\log d)$ | $O(D \log d)$ | - | Arb. | -| 7 | Circuit | $N\log\left(\frac{N}{\epsilon}\right)$ | $O(n)$ | - | Arb. | -| 8 | Circuit | $O\left(...\right)$ | $O(m)$ | - | | +| | Method | Size | Ancilla | Depth | Function type | +|:-:|:-----------:|:---------------------------------------:|:---------------:|:-------------------:|:---:| +| 1 | M-SQP | $O(\frac{ndD}{\mathcal{F}})$ | 1 | | | +| 2 | GR | $O(nT_{oracle})$ | $O(t_{oracle})$ | log | Eff. int. | +| 3 | Adiabatic | $O(\frac{T_{oracle}}{\mathcal{F}^4})$ | $O(t_{oracle})$ | - | Arb. | +| 4 | Black-box | $O(\frac{T_{oracle}}{\mathcal{F}})$ | $O(t_{oracle})$ | - | Arb. | +| 5 | FSL | $O(d^D + Dn^2)$ | 0 | - | Arb. | +| 6 | LCU-based | $O(d^D + Dn\log d)$ | $O(D \log d)$ | - | Arb. | +| 7 | Circuit | $N\log\left(\frac{N}{\epsilon}\right)$* | $O(n)$ | $N\log\left(\frac{N}{\epsilon}\right)$* | Arb. | +| 8 | Circuit |$N\log\left(\frac{N}{\epsilon}\right)$ |$O\left(n+\lambda \right)$ | $\frac{N}{n + \lambda}\log \left(\frac{N}{\epsilon}\right) + n\log\left(\frac{N}{\epsilon}\right)$ * | Arb. | + + + By looking at different models of quantum computation, we find that state preparation can be performed in constant depth assuming unbounded Fan-Out circuits (Corollary 4.2) [@rosenthal2021query]. The key idea behind this work was to link state preparation to a DNF (disjunctive normal form) boolean formula, which is evaluated in the quantum algorithm. Compiling Fan-Out gates using CNOT gates, this leads to a circuit of depth $O(n)$ and $O(n2^n)$ ancillas. State preparation can also be studied under a different lens in complexity theory, leading to new interesting insights. @@ -750,20 +728,6 @@ Often in quantum algorithms we want to estimate expected values of integrals of Let's define $\mu$ as the mean of a probability distribution $p(x)$ and $\widehat{\mu}=\mathbb{E(x)}$ be an estimate of $\mu$. The error of choice for this kind of problem (which comes from applications that we will see in Section \@ref(chap-montecarlo) ) is called the Root Mean Square Error (RMSE), i.e. $\widehat{\epsilon} = \sqrt{\mathbb{E}((\widehat{\mu}- \mu)^2)}$. The proof shows that an error of $\epsilon$ in the first rotation of the GR algorithm, due to an error in the computation of the first $f(i)$, would propagate in the final error of the expected value of $\mu$. To avoid this error, we should compute $f(i)$ with accuracy at least $\epsilon$. The best classical algorithms allows us to perform this step at a cost of $O(\frac{1}{\epsilon^2})$, thus canceling the benefits of a quadratic speedup. Mitigating this problem is currently active area of research. - - - - - - - - - - - - - - However, if we restrict ourselves to considering loading probabilities from a Gaussian distributions, then we can retain the quadratic speedup of the GR algorithm. This is because when we create quantum sample access to the Gaussian distribution, we must compute integrals of the form @@ -785,7 +749,7 @@ where the second equality is obtained through the substitution $x \mapsto \frac{ - + @@ -814,39 +778,8 @@ where the second equality is obtained through the substitution $x \mapsto \frac{ #### KP-Trees{#sec:implementation-KPtrees} -TODO need some introduction - -Let's recall that for a matrix $X \in \mathbb{R}^{n \times d}$ (where we assume that $n$ and $d$ are powers of $2$, otherwise we can just pad the matrix with zeros) with rows $x_i$, an amplitude encoding is the state: - -\begin{equation} -\ket{X} = \frac{1}{\sqrt{\sum_{i=1}^n {\left \lVert x_i \right \rVert}^2 }} \sum_{i=1}^n {\left \lVert x_i \right \rVert}\ket{i}\ket{x_i}, - (\#eq:matrix-state) -\end{equation} - -Where $\sqrt{\sum_{i=1}^n \left \lVert x_i \right \rVert^2} = \left \lVert X \right \rVert$. - - - - - -Note that equation \@ref(eq:matrix-state) is just an amplitude encodings of vectors of size $d$ and a vector of size $n$, which reduces the problem of creating an amplitude encoding of a matrix to creating the amplitude encoding of a series of vectors. The PhD thesis by Prakash [@PrakashPhD] introduced the first procedure to efficiently perform the amplitude encoding of a matrix using a tree like classical data structure. Given an incoming matrix $V \in \mathbb{R}^{n \times d}$ the procedure, which was named KP-trees by Rebentrost in [@rebentrost2018quantum] after the authors Kerenidis and Prakash, creates a data structure with size scaling $\widetilde{O}(|V|_0)$ and where the time to update the tree with a new entry scales as $O(\text{poly} \log(nd))$. In addition, an algorithm to perform the amplitude encoding of a vector is given and scales as $O(\log(nd))$. The proof will make use of the following lemma on cascades of rotations: - - +We now move to discussing the most used technique to load classical data into a quantum computer using ampitude encoding. This technique is the same as the one in the previous section, with the difference that the oracle returning the angles for the controlled rotations are retrived by a quantum memory. In their PhD thesis, Prakash [@PrakashPhD] introduced the first procedure to efficiently perform the amplitude encoding of a matrix using a tree-like classical data structure. Given a matrix $V \in \mathbb{R}^{n \times d}$ the procedure precomputes a data structure with size scaling $\widetilde{O}(|V|_0)$ and where the time to update the tree with a new entry scales as $O(\text{poly} \log(nd))$. This technique was called "KP-trees" in [@rebentrost2018quantum], after the authors (Kerenidis and Prakash) used it in a quantum recommendation system [@KP16]. The proof will make use of the following lemma ```{lemma, cascade-controlled-rotations, name="Implementing Rotations with Cascades of Controlled Unitary Gates"} @@ -984,11 +917,11 @@ The final tree is for the implementation of $\tilde{V}: \ket{0}\ket{j} \rightarr ``` ```{r, KP-trees-ry, echo=FALSE, fig.width=10, fig.cap="A section of the circuit for state preparation with pruned KP-trees. For a vector $V_i \\in \\mathbb{C}^{n}$ we require 3 register: an index register $\\ket{i}$; a $t$-qubit address register which will load the angles up to a precision $t$; and the main register composed of $\\log(n)$ qubits. At a intermediate step of the procedure the main register will hold a state which represents the $k$-th layer of the KP-tree $\\Psi_k$ and the aim of the circuit will be to prepare the $k+1$ layer of the tree, $\\Psi_{k+1}$. This starts with a quantum query to the data structure which loads the angles to the address register. This is followed by a cascade of controlled rotations and finally an inverse call to the data structure. Repeating this circuit $\\log(n)$ times produces the state $\\Psi_{\\log(n)}$ which is a vector which hold the moduli of the components of $V_i$. In total the circuit will have a depth of $t\\log(n)$ and will require $2\\log(n)$ queries to the data structure."} -knitr::include_graphics("images/KP_Trees_RY.png") +knitr::include_graphics("algpseudocode/KP-trees_RY.png") ``` ```{r, KP-trees-phase, echo=FALSE, fig.width=10, fig.cap="The circuit that adds the phase in state preparation with pruned KP-trees. This starts with a quantum query to the data structure which loads the angles to the address register, which is followed by a cascade of phase rotation, a NOT gate and another cascade. The requirmenet of 2 cascades is that the controlled phase rotations only acts on the quantum states with a $1$ as the last bit. The application of this circuit produces the desired vector $V_i$."} -knitr::include_graphics("images/KP_Trees_RPhase.png") +knitr::include_graphics("algpseudocode/KP-trees_RPhase.png") ``` We now show an example of the state preparation with pruned KP-trees of a vector of size 4. Figure \@ref(fig:KP-trees-example) shows the difference between an original KP-tree and a pruned version, whilst \@ref(fig:example-circuit) shows the full circuit implementation to load the vector. @@ -1052,11 +985,11 @@ The full circuit for this can be seen in the figure \@ref(fig:example-circuit). --> ```{r, KP-trees-example, echo=FALSE, fig.width=10, fig.cap="The original and pruned tree used for the example. The difference between the two is that the initial tree stores the partial norms of the vector entries, whilst the pruned tree only stores the angles required to implement the required $\\sigma_y$ and phase rotations."} -knitr::include_graphics("images/KP-trees-example.png") +knitr::include_graphics("algpseudocode/KP-trees-example.png") ``` ```{r, example-circuit, echo=FALSE, fig.width=10, fig.cap="The circuit to perform state preparation of the vector reported in the worked example. An initial call to the $\\mathsf{QMD}$ loads the angle on the address register, which is followed by a cascade of $\\sigma_y$ rotations on the first qubit and an inverse call to the $\\mathsf{QMD}$ to remove the angle from the address register. A similar process is done for the second step where the call to the $\\mathsf{QMD}$ is made using the index register and the first qubit and will access the first layer of the pruned KP-tree. This will be followed by a similar cascade of $\\sigma_y$ rotations on the second qubit of the main register and inverse call to the $\\mathsf{QMD}$. The final step requires adding the phases. This will be done with a query to the $\\mathsf{QMD}$ to access the final row of the pruned KP-tree, then a cascade of phase rotation $P$. Because the nature of the phase gate, a $\\sigma_x$ gate followed by another cascade of phase rotations is required to load the remaining phases. Finally, a $\\sigma_x$ gate and a inverse query to the $\\mathsf{QMD}$ will produce the amplitude encoding."} -knitr::include_graphics("images/Example_circuit.png") +knitr::include_graphics("algpseudocode/state-prep-example.png") ``` The following exercise might be helpful to clarify the relation between quantum query access to a vector and quantum sampling access. @@ -1124,7 +1057,7 @@ $U_R^\dagger U_L$ is a $(\mu_p(A),\lceil\log (N+M+1)\rceil,\epsilon)$-block enco ``` -The second point of the previous theorem is equivalent to what we saw in \@ref(sec:implementation-KPtrees). +The second point of the previous theorem is equivalent to what we saw in Section \@ref(sec:implementation-KPtrees). #### Block encoding from sparse access diff --git a/intro.Rmd b/intro.Rmd index bd73b75..c516ab4 100644 --- a/intro.Rmd +++ b/intro.Rmd @@ -53,9 +53,8 @@ as a derivative: $$\frac{d}{dt}\psi(t) = -i H \psi(t).$$ But this is the well-known Schrödinger equation! Note that, as computer scientists, we take the right to remove some physical constant ($\hbar$) out of the -equation. What should be the takeaway of these observations? Well, first -we know that the Schrödinger equation is a differential equation whose -solution is fully determined if we were to know the initial state of our +equation. What should be the takeaway of these observations? We know that the Schrödinger equation is a differential equation whose +solution is fully determined if we know the initial state of our system $\psi(p)$. Formally the solution can be written as: $$\psi(p+t)=e^{-iHt}\psi(p).$$ From this last equation we can observe @@ -63,7 +62,7 @@ further (more on this in the appendix) that the exponential of an Hermitian matrix $e^{-iHt}$ is *defined* through its Taylor expansion is just a *unitary* matrix: $U(t)=e^{-itH}$. Unitary matrices are exactly those matrices that describe isometries: applying a unitary matrix to a -vector won't change its length. From this, we see that the two quantum +vector do not change its length. From this, we see that the two quantum states $\psi(p+t)$ and $\psi(p)$ could be taken just to be vectors of a fixed length, which - for practicality - we take to be unit vectors. Notation-wise, we denote unit vectors describing quantum states as @@ -77,12 +76,12 @@ give you a "justification" for the axioms of quantum mechanics. The standard formalism used in quantum information is the Dirac's "bra-ket" notation, which we will introduce in this section. We also -recall here the postulates of quantum mechanics, and take this -opportunity to settle the rest of the notation and preliminaries used in +state here the postulates of quantum mechanics, and take this +opportunity to settle the quantum notation and quantum preliminaries used in this book. For the postulates, we follow the standard formulation in [@NC02]. -::: {.proposition name="Postulate 1"} +::: {.proposition name="Description of a quantum system"} Associated to any isolated physical system is a complex vector space with inner product (that is, a Hilbert space) known as the state space of the system. The system is completely described by its state vector, which is a unit vector in the system's state space. ::: @@ -126,7 +125,7 @@ see that the following are all equivalent definition of unitary matrices ::: {.example name="Determinant=1 is a necessary but not sufficient condition for being unitary"} -It is simple to see that any $2\times 2$ diagonal matrix $A$ with entries $10$ and $1/10$ has determinant is $1$, but it is not a unitary matrix. +Any $2\times 2$ diagonal matrix $A$ with entries $10$ and $1/10$ has determinant is $1$, but it is not a unitary matrix. ::: It will be useful to recall that if we have a unitary that performs the @@ -216,7 +215,7 @@ In practice, we will mostly perform projective measurements (also called von Neumann measurements). A projective measurement is described by an *observable*: an Hermitian operator $M$ on the state space of the system being observed. The observable has a spectral decomposition: -$$ M = \sum_m mP_m $$ Where $P_m$ is a projector into the eigenspace of +$$ M = \sum_m mP_m $$ where $P_m$ is a projector into the eigenspace of $M$ associated with the eigenvalue $m$. This means that the measurement operator will satisfy the following properties: @@ -244,17 +243,17 @@ p(m) = \bra{\psi}P_m\ket{\psi}. If we were to measure outcome $m$, then the state of the quantum system after the measurement would be: $$\frac{P_m\ket{\psi}}{\sqrt{p(m)}}.$$ -They have some useful properties. Just to cite one, the average value of +They have some useful properties. For example, the average value of a projective measurement in a state $\ket{\psi}$ is defined as: \begin{align} - E(M)& = \sum_m p(m)\\ -& = \sum_m m \bra{\psi}P_m\ket{\psi}\\ -& \bra{\psi}(\sum_m mP_m)\ket{\psi}\\ -& \bra{\psi}M\ket{\psi} + E(M)& = \sum_m p(m)m \nonumber \\ +& = \sum_m m \bra{\psi}P_m\ket{\psi}\nonumber \\ +& =\bra{\psi}(\sum_m mP_m)\ket{\psi}\nonumber \\ +& = \bra{\psi}M\ket{\psi} \end{align} In practice, our projective operators will be projectors in the computational basis, i.e. $P_m = \sum_{m \in [d]} \ket{m}\bra{m}$. -From these rules, it is simple to see that the probability that a +As a conseguence of these rules, the probability that a measurement on a state $\ket{x} = \frac{1}{\norm{x}}\sum_i x_i\ket{i}$ gives outcome $i$ is $|x_i|^2/\norm{x}^2$. @@ -262,8 +261,7 @@ gives outcome $i$ is $|x_i|^2/\norm{x}^2$. The state space of a composite physical system is the tensor product of the state spaces of the component physical systems. Moreover, if we have systems numbered from 1 through $n$, and each state is described as $\ket{\psi_i}$, the join state of the total system is $\bigotimes_{j=1}^n \ket{\psi_i}=\ket{\psi_1}\ket{\psi_2}\dots \ket{\psi_n}$. ::: -To describe together two different quantum system we use the tensor -product. The tensor product between two vectors +The tensor product between two vectors $\ket{y} \in \mathbb{R}^{d_1}$ and $\ket{y} \in \mathbb{R}^{d_2}$ is a vector $\ket{z} \in \mathbb{R}^{d_1 \times d_2}$. We can use the tensor operation to describe the joint evolution of separate quantum system. From 3b25eeed3a107e812935afd24481f8dbf71bbd4c Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:27:34 +0800 Subject: [PATCH 14/22] Add png images --- algpseudocode/circuit_bb.png | Bin 0 -> 134774 bytes algpseudocode/decomposedlookups.png | Bin 0 -> 56014 bytes algpseudocode/state-prep-example.png | Bin 0 -> 40823 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 algpseudocode/circuit_bb.png create mode 100644 algpseudocode/decomposedlookups.png create mode 100644 algpseudocode/state-prep-example.png diff --git a/algpseudocode/circuit_bb.png b/algpseudocode/circuit_bb.png new file mode 100644 index 0000000000000000000000000000000000000000..813fd6e24b4067afab035f33df16e9ede6499250 GIT binary patch literal 134774 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%0DVnxnHjF%=_c1WfwaF`ELl>LEcDqZSk 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 literal 0 HcmV?d00001 From 28ca053744d2c9b19965d8f42787bef96ffc75b3 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:33:35 +0800 Subject: [PATCH 15/22] Latest updates --- book.bib | 21 +++++ data.Rmd | 253 ++++++++++++++++++++++++++++++++++++------------------ index.Rmd | 2 + 3 files changed, 191 insertions(+), 85 deletions(-) diff --git a/book.bib b/book.bib index 72c0bde..9962c5f 100644 --- a/book.bib +++ b/book.bib @@ -15,6 +15,20 @@ @article{giurgica2022low year={2022}, publisher={APS} } +@article{buhrman2023state, + title={State preparation by shallow circuits using feed forward}, + author={Buhrman, Harry and Folkertsma, Marten and Loff, Bruno and Neumann, Niels MP}, + journal={arXiv preprint arXiv:2307.14840}, + year={2023} +} + +@article{gosset2024quantum, + title={Quantum state preparation with optimal T-count}, + author={Gosset, David and Kothari, Robin and Wu, Kewen}, + journal={arXiv preprint arXiv:2411.04790}, + year={2024} +} + @article{aharonov2018quantum, title={Quantum circuit depth lower bounds for homological codes}, author={Aharonov, Dorit and Touati, Yonathan}, @@ -6449,6 +6463,13 @@ @article{alphatron year={2023}, month=nov, pages={1174} } +@article{yang2024quantum, + title={Quantum circuits for block encoding of structured matrices in ocean acoustics}, + author={Yang, Chunlin and Yao, Hongmei and Zhang, Guofeng and Fan, Zhaobing and Li, Zexian and Liu, Jianshe}, + journal={arXiv preprint arXiv:2405.18007}, + year={2024} +} + @misc{allcock2023quantum, title={Constant-depth circuits for Uniformly Controlled Gates and Boolean functions with application to quantum memory circuits}, author={Jonathan Allcock and Jinge Bao and João F. Doriguello and Alessandro Luongo and Miklos Santha}, diff --git a/data.Rmd b/data.Rmd index 15d7d1e..60d262d 100644 --- a/data.Rmd +++ b/data.Rmd @@ -18,12 +18,6 @@ First, we describe how to represent data, which reduces to understanding the pos ## Representing data in quantum computers{#sec:representing-data} - We'll begin our journey into quantum algorithms by understanding how we can represent and store data as a quantum state. Data plays a key role and is at the heart of most modern algorithms and knowing the best way to encode it on a quantum computer might pave the way for intuitions in solving problems, an essential step towards quantum advantage (as noted also in [@schuld2015introduction]). There are various ways to achieve this task. Some are borrowed from classical computation, such as the *binary* encoding, which consist in representing encoding boolean strings of length $n$ using $n$ qubits, while some leverage quantum properties, such as the *amplitude* encoding, which consits in representing vectors as linear combination of computational basis. We note that some of the presented schemes depend heavily on the accuracy of the available quantum computers in manipulating quantum states (i.e. developments in metrology and sensing). For example, techniques that rely on precise amplitudes of a state will be hindered by the current noisy hardware, or incour in high overhead of the quantum error correction. Considerations on the practical feasibility of an encoding technique are out of scope for this book. @@ -176,11 +170,11 @@ where, for some integer $i$, the states $e_i$ take the form $e_i = 0^{i-1}10^{n- Having seen possible ways to represent data on a quantum computer, we will now take the first step toward understanding how to create quantum states that are representing numbers using these encodings. The first step involves understanding quantum memory, which plays a key role in various quantum algorithms/problems such as: Grover’s search, solving the dihedral hidden subgroup problem, collision finding, phase estimation for quantum chemistry, pattern recognition, machine learning algorithms, cryptanalysis, and state preparation. -To work with quantum memory we need to define a quantum memory model of computation, which enables us to accurately calculate the complexity of quantum algorithms. In this framework we divide a quantum computation into a data pre-processing step and a computational step. Quantum memory allows us to assume that the pre-processed data can be easily accessed (as in classical computers). In this model, since the pre-processing is negligible, and has to be performed only once, the complexity of a quantum algorithm is fully characterized by the computational step. This understanding formalizes a quantum computation in two distinct components: a quantum processing unit and a quantum memory device. Two notable examples of quantum memory devices are the quantum random access memory ($\mathsf{QRAM}$) and the quantum random access gates ($\mathsf{QRAG}$). It is important to note that having access to a quantum memory device is associated with fault tolerant quantum computers. +To work with quantum memory we need to define a quantum memory model of computation, which enables us to accurately calculate the complexity of quantum algorithms. In this framework we divide a quantum computation into a data pre-processing step and a computational step. Quantum memory allows us to assume that the pre-processed data can be easily accessed (as in classical computers). In this model, since the pre-processing is negligible, and has to be performed only once, the complexity of a quantum algorithm is fully characterized by the computational step. This understanding formalizes a quantum computation in two distinct components: a quantum processing unit and a quantum memory device. Two notable examples of quantum memory devices are the quantum random access memory ($\QRAM$) and the quantum random access gates ($\mathsf{QRAG}$). It is important to note that having access to a quantum memory device is associated with fault tolerant quantum computers. -This section will first introduce the quantum memory model of computation (\@ref(sec:quantum-memory-model)). This will be followed by the formalization of a quantum computation in the memory model via a quantum processing unit ($\mathsf{QPU}$) and a quantum memory device ($\mathsf{QMD}$) (\@ref(sec:QPU-QMD)), where the $\mathsf{QRAM}$ and $\mathsf{QRAG}$ will be presented as possible implementation of the $\mathsf{QMD}$. +This section will first introduce the quantum memory model of computation (\@ref(sec:quantum-memory-model)). This will be followed by the formalization of a quantum computation in the memory model via a quantum processing unit ($\mathsf{QPU}$) and a quantum memory device ($\mathsf{QMD}$) (\@ref(sec:QPU-QMD)), where the $\QRAM$ and $\mathsf{QRAG}$ will be presented as possible implementation of the $\mathsf{QMD}$. - + -### The quantum memory model of computation{#sec:quantum-memory-model} +### The quantum model of computation with and without memory {#sec:quantum-memory-model} As discussed in the Section \@ref(measuring-complexity) of the previous chapter, in quantum computing we often work in a oracle model, also called black-box model of quantum computation. This section is devoted to the formalization of this model of computation. The word “oracle”, (a word referencing concepts in complexity theory), is used to imply that an application of the oracle has $\mathcal{O}(1)$ cost, i.e. we do not care about the cost of implementing the oracle in our algorithm. A synonym of quantum oracle model is quantum query model, which stresses the fact that we can only use the oracle to perform queries. @@ -215,7 +209,8 @@ The complexity of the algorithm in this model is measured by the cost for step 2 Let's consider an example. We will see that many of the quantum algorithms considered in this book have a computational complexity expressed (in number of operations of a certain kind) as some functions of the matrix and the problem. Consider a classical algorithm with a runtime of $\widetilde{O} \left( \frac{\norm{A}_0\kappa(A)}{\epsilon^2}\log(1/\delta) \right)$ calls to the classical memory (and coincidentally, CPU operations). Here $\epsilon$ is some approximation error in the quantity we are considering, $\kappa(A)$ is the condition number of the matrix, $\delta$ the failure probability. The quantum counterpart of this algorithm has a runtime of $O(\norm{A}_0)$ classical operation for pre-processing and \begin{equation} -\widetilde{O}(poly(f(A)), poly(\kappa(A), poly(1/\epsilon), poly(\log(nd), poly(\log(1/\delta)) ) +\widetilde{O}(\text{poly}(f(A)), \text{poly}(\kappa(A)), \text{poly}(1/\epsilon), \text{poly}(\log(nd)), \text{poly}(\log(1/\delta)) ) +(\#eq:example-of-runtime) \end{equation} queries to the quantum memory (and coincidentally, number of operations). Here, $f(A)$ represents some size-independent function of the matrix that depends on the properties of $A$ which can be chosen to be $\|A\|_F$: the Frobenius norm of the matrix. Importantly, note that in the runtime of the quantum algorithm there is no dependence on $\|A\|_0$. @@ -234,7 +229,7 @@ The qubits which comprise the $\mathsf{QPU}$ are assigned to either an input reg (ref:allcock2023quantum) [@allcock2023quantum] -```{definition, QPU, name="Quantum Processing Unit (ref:allcock2023quantum)"} +```{definition, def-QPU, name="Quantum Processing Unit (ref:allcock2023quantum)"} A Quantum Processing Unit($\mathsf{QPU}$) of size $m$ is defined as a tuple $(\mathtt{I}, \mathtt{W},\mathcal{G})$ consisting of - an $m_{\mathtt{I}}$-qubit Hilbert space called \emph{input register} $\mathtt{I}$; @@ -288,51 +283,77 @@ Starting from $|\psi_0\rangle|0\rangle^{\otimes \poly{n}}_{\mathtt{Aux}}$, where knitr::include_graphics("algpseudocode/quantum_architecture.png") ``` -This model can be seen as a refined version of the one described in [@buhrman2022memory], where the authors divide the qubits of a quantum computer into work and memory qubits. Given $M$ memory qubits, their workspace consists of $O(\log M)$ qubits, of which the address and target qubits are always the first $\lceil\log M\rceil + 1$ qubits. However, address and target qubits are not considered to be shared by the $\mathsf{QMD}$, and there is no mention of ancillary qubits mediating a call to the $\mathsf{QMD}$. The inner structure of the $\mathsf{QMD}$ is abstracted away by assuming access to the unitary of a $\mathsf{QRAG}$ (see Definition \@ref(def:qrag) later). This model, in contrast, "opens" the quantum memory device, and allows for general fixed unitaries, including $\mathsf{QRAM}$ and $\mathsf{QRAG}$. +This model can be seen as a refined version of the one described in [@buhrman2022memory], where the authors divide the qubits of a quantum computer into work and memory qubits. Given $M$ memory qubits, their workspace consists of $O(\log M)$ qubits, of which the address and target qubits are always the first $\lceil\log M\rceil + 1$ qubits. However, address and target qubits are not considered to be shared by the $\mathsf{QMD}$, and there is no mention of ancillary qubits mediating a call to the $\mathsf{QMD}$. The inner structure of the $\mathsf{QMD}$ is abstracted away by assuming access to the unitary of a $\mathsf{QRAG}$ (see Definition \@ref(def:qrag) later). This model, in contrast, "opens" the quantum memory device, and allows for general fixed unitaries, including $\QRAM$ and $\mathsf{QRAG}$. In addition, this model does not include measurements. These can easily be performed on the output state $\ket{\psi_T}$ if need be. Furthermore the position of the qubits is not fixed within the architecture, allowing for long-range interactions through, for example, multi-qubit entangling gates. This feature is not always possible in physical the real world since some quantum devices, such as superconducting quantum computers, don't allow for long-range interactions between qubits. For a model of computation which take in consideration physically realistic device interactions we suggest the work by [@Beals_2013]. -We stress the idea that call to the $\mathsf{QMD}$ is defined by the function $\mathsf{V}$ and quantum memory device is defined by the unitary that it implements. In many applications, one is interested in some form of reading a specific entry from the memory, which corresponds to the special cases where the $\mathsf{V}(i)$ unitaries are made of controlled single-qubit gates, and to which the traditional $\mathsf{QRAM}$ belongs. +We stress the idea that call to the $\mathsf{QMD}$ is defined by the function $\mathsf{V}$ and quantum memory device is defined by the unitary that it implements. In many applications, one is interested in some form of reading a specific entry from the memory, which corresponds to the special cases where the $\mathsf{V}(i)$ unitaries are made of controlled single-qubit gates, and to which the traditional $\QRAM$ belongs. + + + + +#### The LAQCC model of quantum computation + +We can also consider an alternative model of quantum computation to the one in Definition \@ref(def-QPU): the LAQCC model, which stands for Local Alternating Quantum Classical Computations. LAQCC is a hybrid quantum-classical computational framework [@buhrman2023state]. This model assumes quantum hardware with specific topology and connectivity, enabling the measurement of certain (but not necessarily all) qubits. The measurement results are then used to perform intermediate classical computations, which, in turn, control subsequent quantum circuits. This process can alternate between quantum and classical layers multiple times, allowing for iterative computation. The authors did not consider an explicit formulation of the quantum memory device. However, it is possible to perform amplitude encoding of a certain class of states in constant depth. Formally, it is defined as follows. + +(ref:buhrman2023state) [@buhrman2023state] + +```{definition, def-laqcc, name="Local Alternating Quantum Classical Computations (ref:buhrman2023state)"} +Let $\text{LAQCC}(\mathcal{Q}, \mathcal{C}, d)$ be the class of circuits such that: + +- Every quantum layer implements a quantum circuit $Q \in \mathcal{Q}$ constrained to a grid topology; +- Every classical layer implements a classical circuit $C \in \mathcal{C}$; +- There are $d$ alternating layers of quantum and classical circuits; +- After every quantum circuit $Q$, a subset of the qubits is measured; +- The classical circuit receives input from the measurement outcomes of previous quantum layers; +- The classical circuit can control quantum operations in future layers. + +The allowed gates in the quantum and classical layers are given by $\mathcal{Q}$ and $\mathcal{C}$, respectively. Furthermore, we require a circuit in $\text{LAQCC}(\mathcal{Q}, \mathcal{C}, d)$ to deterministically prepare a pure state on the all-zeroes initial state. +``` + + + + #### The QRAM{#sec:qram} -A type of $\mathsf{QMD}$ of particular interest is the $\mathsf{QRAM}$, which is the quantum equivalent of a classical Random Access Memory (RAM), that stores classical or quantum data and allows for superposition-based queries. More specifically, a $\mathsf{QRAM}$ is a device comprising a memory register that stores data, an address register that points to the memory cells to be addressed, and a target register into which the content of the addressed memory cells is copied. If necessary, it also includes an auxiliary register supporting the overall operation, which is reset to its initial state at the end of the computation. Formally, we define it as: +A type of $\mathsf{QMD}$ of particular interest is the $\QRAM$, which is the quantum equivalent of a classical Random Access Memory (RAM), that stores classical or quantum data and allows for superposition-based queries. More specifically, a $\QRAM$ is a device comprising a memory register that stores data, an address register that points to the memory cells to be addressed, and a target register into which the content of the addressed memory cells is copied. If necessary, it also includes an auxiliary register supporting the overall operation, which is reset to its initial state at the end of the computation. Formally, we define it as: ```{definition, qram, name="Quantum Random Access Memory"} -Let $n\in\mathbb{N}$ be a power of $2$ and $f(i) = \mathsf{X}$ for all $i\in[n]$. A \emph{quantum random access memory} $\mathsf{QRAM}$ of memory size $n$ is a $\mathsf{QMD}$ with $\mathsf{V}(i) = \mathsf{C}_{\mathtt{M}_i}$-$\mathsf{X}_{\to\mathtt{T}}$. Equivalently, it is a $\mathsf{QMD}$ that maps +Let $n\in\mathbb{N}$ be a power of $2$ and $f(i) = \mathsf{X}$ for all $i\in[n]$. A \emph{quantum random access memory} $\QRAM$ of memory size $n$ is a $\mathsf{QMD}$ with $\mathsf{V}(i) = \mathsf{C}_{\mathtt{M}_i}$-$\mathsf{X}_{\to\mathtt{T}}$. Equivalently, it is a $\mathsf{QMD}$ that maps \begin{equation} \ket{i}_{\mathtt{A}}\ket{b}_{\mathtt{T}}\ket{x_0,\dots,x_{n-1}}_{\mathtt{M}} \mapsto \ket{i}_{\mathtt{A}}(f(i)^{x_i}\ket{b}_{\mathtt{T}}) \ket{x_0,\dots,x_{n-1}}_{\mathtt{M}} \quad\quad \forall i\in[n], b,x_0,\dots,x_{n-1}\in\{0,1\}. \end{equation} ``` -A unitary performing a similar mapping often goes under the name of quantum read-only memory ($\mathsf{QROM}$) The difference with $\mathsf{QRAM}$ is that that this term stresses that they don't allow data to be added or modified. Oftentimes, the authors using this term are considering a circuit, as described in section \@ref(sec:multiplexer). +A unitary performing a similar mapping often goes under the name of quantum read-only memory ($\mathsf{QROM}$) The difference with $\QRAM$ is that that this term stresses that they don't allow data to be added or modified. Oftentimes, the authors using this term are considering a circuit, as described in section \@ref(sec:multiplexer). -Instead assuming to have access to a $\mathsf{QRAM}$ requires a protocol for the pre-processing of the data and creation of a data structure in time which is asymptotically linear in the data size (as indicated by definition \@ref(def:quantum-memory-model)). +Instead assuming to have access to a $\QRAM$ requires a protocol for the pre-processing of the data and creation of a data structure in time which is asymptotically linear in the data size (as indicated by definition \@ref(def:quantum-memory-model)). -Equipped with definition \@ref(def:qram)) we can formalize what it means to have quantum query access, which is also referred to as $\mathsf{QRAM}$ access or as having "$x$ is in the $\mathsf{QRAM}$". We will formalize the case of having a vector $x \in (\{0,1\}^m)^N$ stored in the $\mathsf{QRAM}$. +Equipped with definition \@ref(def:qram)) we can formalize what it means to have quantum query access, which is also referred to as $\QRAM$ access or as having "$x$ is in the $\QRAM$". We will formalize the case of having a vector $x \in (\{0,1\}^m)^N$ stored in the $\QRAM$. ```{definition, quantum-query-access-vector, name="Quantum query access to a vector stored in the QRAM"} -Given $x \in (\{0,1\}^m)^N$, we say that we have quantum query access to $x$ stored in the $\mathsf{QRAM}$ if we have access to a unitary operator $U_x$ such that $U_x\ket{i}\ket{b} = \ket{i}\ket{b \oplus x_i}$ for any bit string $b\in\{0,1\}^m$. +Given $x \in (\{0,1\}^m)^N$, we say that we have quantum query access to $x$ stored in the $\QRAM$ if we have access to a unitary operator $U_x$ such that $U_x\ket{i}\ket{b} = \ket{i}\ket{b \oplus x_i}$ for any bit string $b\in\{0,1\}^m$. ``` -In practical terms when analyzing the complexity of a quantum algorithm with a $\mathsf{QRAM}$ we need to take in consideration three factors: the circuit size of the quantum algorithm as introduced in definition \@ref(def:QPU), the number of queries to the $\mathsf{QRAM}$ and the complexity each $\mathsf{QRAM}$ query. We emphasize that the complexity that arises due to a query to the $\mathsf{QRAM}$ is still an open question. Details of some possible implementations will be discussed in section \@ref(sec:implementations). +In practical terms when analyzing the complexity of a quantum algorithm with a $\QRAM$ we need to take in consideration three factors: the circuit size of the quantum algorithm as introduced in definition \@ref(def:QPU), the number of queries to the $\QRAM$ and the complexity each $\QRAM$ query. We emphasize that the complexity that arises due to a query to the $\QRAM$ is still an open question. Details of some possible implementations will be discussed in section \@ref(sec:implementations). +the implementation of a call to the $\QRAM$ requires, for a data structure of size $N$, a circuit depth of $O(polylog(N))$. Details of the implementation will be discussed in section \@ref(sec:implementations).--> + + + + +: Table for QRAM for $N=2^n$ memory elements of size $m$. 2 is [@giovannetti2008architectures], 4 is [@low2018trading], 5 and 6 are form [@allcock2023quantum], 8 is Lemma 10 from [@yuan2023optimal]. Gate count or depth with * is expressed in number of $T$ gates. Results expressed with + are in terms of FanOut gates of arity $O(n)$. TODO number 4 should have a parameter lambda for number of ancilla qubits? + +| | Method | Size | Ancilla | Depth | Comment | +|---|-------------------------|--------------------------------------|--------------------------------------|--------|-------------------| +| 1 | Multiplexer | O(nm) | | O(nm) | | +| 2 | Bucket Brigade | | | | | +| 3 | FanOut BB | | | | Uses FanOut gates | +| 4 | Trading | $O(n)$ | $2n + 2$ | $O(n)$ | | +| 5 | One-hot encoding FanOut | $6n\log{n} + O(n\log\log{n})$ $\:^+$ | $2n\log{n}\log\log{n} + O(n\log{n})$ | $O(1)$ | | +| 6 | One-hot encoding GT-gate| $6n\log{n} + O(n\log\log{n})$ $\:^+$ | $2n\log{n}\log\log{n} + O(n\log{n})$ | $O(1)$ | | +| 7 | Fourier | | | | | +| 8 | Circuit | $O(N2^m)$ | $\lambda$ | | $\lambda > Nm$ | + + + + + + + #### The QRAG{#sec:qrag} Another type of quantum memory device is the quantum random access gate($\mathsf{QRAG}$). This quantum memory device was introduced in the paper of [@ambainis2007quantumdistinctness] and performs a $\mathsf{SWAP}$ gate between the target register and some portion of the memory register specified by the address register. The $\mathsf{QRAG}$ finds applications in quantum algorithms for element distinctness, collision finding and random walks on graphs. The formal definition is: @@ -356,10 +400,10 @@ Let $n\in\mathbb{N}$ be a power of $2$. A \emph{quantum random access gate} $\ma \end{equation} ``` -It turns out that the $\mathsf{QRAG}$ can be simulated with a $\mathsf{QRAM}$, but the $\mathsf{QRAM}$ can be simulated with the $\mathsf{QRAG}$ by requiring single qubit operations (which are not present in the model of computation of definition \@ref(def:QPUQMD)). We will present the proof for the simulation of the $\mathsf{QRAM}$ with a $\mathsf{QRAG}$ and leave the opposite proof as exercise. +It turns out that the $\mathsf{QRAG}$ can be simulated with a $\QRAM$, but the $\QRAM$ can be simulated with the $\mathsf{QRAG}$ by requiring single qubit operations (which are not present in the model of computation of definition \@ref(def:QPUQMD)). We will present the proof for the simulation of the $\QRAM$ with a $\mathsf{QRAG}$ and leave the opposite proof as exercise. ```{theorem, sim-qram-with-qrag, name="Simulating QRAM with QRAG."} -A query to a $\mathsf{QRAM}$ of memory size $n$ can be simualted using 2 queries to a $\mathsf{QRAG}$ of memory size $n$, 3 two-qubit gates, and $1$ workspace qubit. +A query to a $\QRAM$ of memory size $n$ can be simualted using 2 queries to a $\mathsf{QRAG}$ of memory size $n$, 3 two-qubit gates, and $1$ workspace qubit. ``` ```{proof} @@ -367,29 +411,30 @@ Start with the input $\ket{i}_{\mathtt{A}}\ket{0}_{\mathtt{Tmp}}\ket{b}_{\mathtt ``` ```{exercise} -Assuming that single-qubit gates can be freely applied onto the memory register $\mathtt{M}$ of any $\mathsf{QRAM}$, then show that a $\mathsf{QRAG}$ of memory size $n$ can be simulated using $3$ queries to a $\mathsf{QRAM}$ of memory size $n$ and $2(n+1)$ Hadamard gates. +Assuming that single-qubit gates can be freely applied onto the memory register $\mathtt{M}$ of any $\QRAM$, then show that a $\mathsf{QRAG}$ of memory size $n$ can be simulated using $3$ queries to a $\QRAM$ of memory size $n$ and $2(n+1)$ Hadamard gates. ``` - - + + + + + + + -$$U_x \ket{i}\ket{0}\ket{b}\ket{x}= \ket{i}\ket{0}\ket{x_i}\ket{x_0,x_1,\dots,x_{i-1},b,x_{i+1}, \dots x_M}$$ now we copy with a CNOT the register $x_i$ in an ancilla register, i.e. we perform this mapping: $$\ket{i}\ket{0}\ket{x_i}\ket{x_0,x_1,\dots,x_{i-1},b,x_{i+1}, \dots x_M} \mapsto \ket{i}\ket{x_i}\ket{ x_i}\ket{x_0,x_1,\dots,x_{i-1},b,x_{i+1}, \dots x_M}$$ -and lastly we undo the query to the $\mathsf{QRAG}$ gate to obtain $\ket{i}\ket{x_i}\ket{ b}\ket{x}$ This shows that with access to a gate that performs $\mathsf{QRAG}$ queries, we can simulate a $\mathsf{QRAM}$ query. We will see in Section \@ref(sec:qramarchitectures) how the hardware architectures for performing a $\mathsf{QRAG}$ gate do not differ much from the architectures required to implement a $\mathsf{QRAM}$ gate --> - #### Memory compression in sparse QRAG models{#sec:memory-compression} Assuming that the data is sparse is a common assumption when developing quantum algorithms since it significantly simplifies computations. Applying it to compress quantum algorithms with access to a $\mathsf{QRAG}$ was first proposed by [@ambainis2007quantumdistinctness], elaborated further in [@jeffery2014frameworks], [@bernstein2013quantum], and finally formalized in [@buhrman2022memory]. Informally, a quantum algorithm is considered sparse if the number of queries to a $\mathsf{QRAG}$ of size $M$ are made with a small number of quantum states. More formally, we start by recalling that in a quantum computational model of definition \@ref(def:QPUQMD) we split the qubits in several registers including a $M$ qubit memory register and a $W$ qubit working register. If throughout the computation the queries to the $\mathsf{QRAG}$ are made using only a constant set of quantum states which have a maximum [Hamming weight](https://en.wikipedia.org/wiki/Hamming_weight)(which is the number of $1$'s in the bit string) of $m \lll M$, then the algorithm is said to be $m$-sparse. The trick to making this definition work is realizing that the $\mathtt{SWAP}$ gate can be used to exchange states between the working register and the states with low hamming weight of the target register. -Confusingly, the authors of [@buhrman2022memory] decided to call a machine that works under this model as $\mathsf{QRAM}$: quantum random-access machine. The formal definition of an $m$-sparse quantum algorithm with a $\mathsf{QRAG}$ is the following: +Confusingly, the authors of [@buhrman2022memory] decided to call a machine that works under this model as $\QRAM$: quantum random-access machine. The formal definition of an $m$-sparse quantum algorithm with a $\mathsf{QRAG}$ is the following: (ref:buhrman2022memory) [@buhrman2022memory] @@ -416,14 +461,10 @@ Let $T$, $W$, $m < M = 2^\ell$ be natural numbers, with $M$ and $m$ both powers Then we can construct a $\mathsf{QRAG}$ algorithm which computes $F$ with error $\epsilon' > \epsilon$, and runs in time $O(T \cdot \log(\frac{ T}{\epsilon' - \epsilon}) \cdot \gamma)$, using $W + O(\log M)$ work qubits and $O(m \log M)$ memory qubits. ``` - ## Implementations{#sec:implementations} + In this section we'll be creating oracles that can perform the encodings that were presented in section \@ref(sec:representing-data). Of the presented oracles only 3 will make use of the quantum memory device introduced in definition \@ref(def:QPUQMD): the bucket brigade, KP-trees and the block encoding from data structure. It is interesting to note that these oracles actually aid each other. In fact, KP-trees rely on the existence of a $\mathsf{QMD}$ that can perform binary encoding and similarly block encoding from data structures requires the existence of a $\mathsf{QMD}$ that can perform amplitude encoding. The other oracles will either make use of specific properties of the input data, such as sparsity, or will encode a probability distribution as a quantum state. The key insight lies in the fact that all oracles, with or without $\mathsf{QMD}$, have a constant complexity which allows us to work in the quantum memory model of computation of definition \@ref(def:costing-of-quantum-memory-model). All the presented oracles with their interconnection can be seen in figure \@ref(fig:oracle-models), where the oracle which require a $\mathsf{QMD}$ have been indicated with a *. @@ -433,11 +474,12 @@ knitr::include_graphics("algpseudocode/oracle_models.png") ### Binary encoding{#sec:implementation-binary} - + In this section we are discussing implementations a unitary giving query access to a list of $m$-bits values. A possible way of reading this section is throught the lenses of finding the "best" gate decomposition of that unitary, which has the following form: -\begin{align*} + +\begin{equation} U = \sum_{i=0}^{N-1} \ket{i}\bra{i} \otimes U_i = \begin{bmatrix} U_0 & & & \\ @@ -445,12 +487,15 @@ In this section we are discussing implementations a unitary giving query access & & \ddots & \\ & & & U_{N-1} \end{bmatrix}, -\end{align*} +(\#eq:unitary-visualization-binary-encoding) +\end{equation} + + where $U_i\ket{0}=\ket{x_i}$ and $x_i \in \{0,1\}^m$. -#### Circuits: oracle synthesis{#sec:implementation-oracle-synthesis} +#### Oracle synthesis{#sec:implementation-oracle-synthesis} As we briefly anticipated in Section \@ref(measuring-complexity), if we know a function that maps $x_i = f(i)$ we can create a circuit for getting query access to $x_i$. If our data is represented by the output of a function, we can consider these techniques for data loading. @@ -490,24 +535,10 @@ If we want to prove the runtime of a quantum algorithm in terms of gate complexi For a probabilistic classical circuit with runtime $T(n)$ and space requirement $S(n)$ on an input of length $n$ there exists a quantum algorithm that runs in time $O(T(n)^{\log_2(3)}$ and requires $O(S(n)\log(T(n))$ qubits. ``` -#### Circuits: the multiplexer{#sec:implementation-multiplexer} -What if we want to use a quantum circuit to have quantum access to a vector of data? It turns out that we can do that, but the simplest circuit that we can come up with, has a depth that is linear in the length of the vector. This kind of circuit is often used in literature, e.g. for computing functions using space-time trade-offs [@krishnakumar2022aq;@gidney2021factor]. This circuit (which sometimes goes under the name QROM, or circuit for table lookups [@hann2021resilience]) or multiplexer, is as follow: -```{r, multiplexer, echo=FALSE, fig.width=10, fig.cap="This is the example of a multiplexer circuit for the list of values x=[1,1,0,1]. Indeed, if we initialize the first two qubits with zeros, the output of the previous circuit will be a 1 in the third register, and so on."} -knitr::include_graphics("images/multiplexer.png") -``` - -```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]. Importantly, only one $T$ gate is required to write in the target register a single memory entry. The memory entry is written using a Fan-Out gate (which can be decomposed into CNOT gates. Note that the depth of the circuit is linear in the number of memory entries."} -knitr::include_graphics("algpseudocode/decomposedlookups.png") -``` - -The idea of the circuit is the following: controlled on the index register being in the state $\ket{0}$, we write (using CNOTS) in the output register the value of our vector in position $x_0$, controlled in the index register being $\ket{1}$, we write on the output register the value of our vector in position $x_1$, etc.. This will result in a circuit with a depth that is linear in the length of the vector that we are accessing, however this circuit won't require any ancilla qubit. We will discuss more some hybrid architecture that allows a trade off between depth and ancilla qubits in Section \@ref(sec:qramarchitectures). The Toffoli count of this circuit can be improved in various ways [@babbush2018encoding;@zhu2024unified]. Importantly, the depth of this circuit depends on the number of oracle entries $N$, and in simple implementations depends also linearly in $m$. - - - -#### Circuits: sparse access{#sec:implementation-sparse-access} -Sparse matrices are very common in quantum computing and quantum physics, so it is important to formalize a quantum access for sparse matrices. This model is sometimes called in literature "sparse access" to a matrix, as sparsity is often the key to obtain an efficient circuit for encoding such structures without a $\mathsf{QRAM}$. Of course, with a vector or a matrix stored in a $\mathsf{QRAM}$, we can also have efficient (i.e. in time $O(\log(n))$ if the matrix is of size $n \times n$) query access to a matrix or a vector, even if they are not sparse. It is simple to see how we can generalize query access to a list or a vector to work with matrices by introducing another index register to the input of our oracle. For this reason, this sparse access is also called quite commonly "query access". +#### Sparse access{#sec:implementation-sparse-access} +Sparse matrices are very common in quantum computing and quantum physics, so it is important to formalize a quantum access for sparse matrices. This model is sometimes called in literature "sparse access" to a matrix, as sparsity is often the key to obtain an efficient circuit for encoding such structures without a $\QRAM$. Of course, with a vector or a matrix stored in a $\QRAM$, we can also have efficient (i.e. in time $O(\log(n))$ if the matrix is of size $n \times n$) query access to a matrix or a vector, even if they are not sparse. It is simple to see how we can generalize query access to a list or a vector to work with matrices by introducing another index register to the input of our oracle. For this reason, this sparse access is also called quite commonly "query access". ```{definition, oracle-access-adjacencymatrix, name="Query access to a matrix"} Let $V \in \mathbb{R}^{n \times d}$. There is a data structure to store $V$, (where each entry is stored with some finite bits of precision) such that, a quantum algorithm with access to the data structure can perform $\ket{i}\ket{j}\ket{z} \to \ket{i}\ket{j}\ket{z \oplus v_{ij}}$ for $i \in [n], j \in [d]$. @@ -524,19 +555,34 @@ Let $V \in \mathbb{R}^{n \times d}$, there is an oracle that allows to perform t The previous definition is also called *adjacency array* model. The emphasis is on the word *array*, contrary to the adjacency list model in classical algorithms (where we usually need to go through all the list of adjacency nodes for a given node, while here we can query the list as an array, and thus use superposition) [@Durr2004]. -It is important to recall that for Definition \@ref(def:oracle-access-adjacencymatrix) and \@ref(def:oracle-access-adjacencylist) we could use a $\mathsf{QRAM}$, but we also expect **not** to use a $\mathsf{QRAM}$, as there might be other efficient circuit for performing those mapping. For instance, when working with graphs (remember that a generic weighted and directed graph $G=(V,E)$ can be seen as its adjacency matrix $A\in \mathbb{R}^{|E| \times |E|}$), many algorithms call Definition \@ref(def:oracle-access-adjacencymatrix) **vertex-pair-query**, and the two mappings in Definition \@ref(def:oracle-access-adjacencylist) as **degree query** and **neighbor query**. When we have access to both queries, we call that **quantum general graph model** [@hamoudi2018quantum]. This is usually the case in all the literature for quantum algorithms for Hamiltonian simulation, graphs, or algorithms on sparse matrices. +It is important to recall that for Definition \@ref(def:oracle-access-adjacencymatrix) and \@ref(def:oracle-access-adjacencylist) we could use a $\QRAM$, but we also expect **not** to use a $\QRAM$, as there might be other efficient circuit for performing those mapping. For instance, when working with graphs (remember that a generic weighted and directed graph $G=(V,E)$ can be seen as its adjacency matrix $A\in \mathbb{R}^{|E| \times |E|}$), many algorithms call Definition \@ref(def:oracle-access-adjacencymatrix) **vertex-pair-query**, and the two mappings in Definition \@ref(def:oracle-access-adjacencylist) as **degree query** and **neighbor query**. When we have access to both queries, we call that **quantum general graph model** [@hamoudi2018quantum]. This is usually the case in all the literature for quantum algorithms for Hamiltonian simulation, graphs, or algorithms on sparse matrices. -#### Bucket brigade circuits {#sec:implementation-bbrigade} -The Bucket brigade(BB) architecture (Fig 10 [@hann2021resilience]) is another possible implementation of binary encoding which, differently to the other presented methods, requires the $\mathsf{QMD}$ model of computation of definition \@ref(def:QPUQMD). This protocol was originally developed to be implemented with qutrits [@giovannetti2008quantum] but recent work has shown it can be implemented with qubits as well [@hann2021resilience]. We'll focus on the explanation with qutrits since it is more intuitive to understand. +#### Circuits {#sec:implementation-circuits} +TODO -Using the terminology introduced in definition \@ref(def:QPUQMD), we'll have: an address register, a target register (which will be referred to as a bus register) and a memory register. The input will be a vector of binary numbers $X \in (\{0,1\}^m)^n$ and the aim is to load a specific entry $X_i \in \{0,1\}^m$ on the bus register. +What if we want to use a quantum circuit to have quantum access to a vector of data? In this section we are going to describe few circuits for the task, each showcasing different properties and trade-offs between depth and space. For example the simplest circuit that we can come up with, has a depth that is linear in the length of the vector. This kind of circuit is often used in literature, e.g. for computing functions using space-time trade-offs [@krishnakumar2022aq;@gidney2021factor]. This circuit (which sometimes goes under the name QROM, or circuit for table lookups [@hann2021resilience], or multiplexer, is simply a series of multi-control operations, each of which is writing (using $X$ gates) some binary string on the target register. Controlled on the index register being in the state $\ket{0}$, we write in the output register the value of our vector in position $x_0$, controlled in the index register being $\ket{1}$, we write on the output register the value of our vector in position $x_1$, etc.. This will result in a circuit with a depth that is linear in the length of the vector that we are accessing, however this circuit won't require any ancilla qubit. We will discuss more some hybrid architecture that allows a trade off between depth and ancilla qubits in Section \@ref(sec:qramarchitectures). The Toffoli count of this circuit can be improved in various ways [@babbush2018encoding;@zhu2024unified]. Importantly, the depth of this circuit depends on the number of oracle entries $N$, and in simple implementations depends also linearly in $m$. As an example, consider the following circuit. + +```{r, multiplexer, echo=FALSE, fig.width=10, fig.cap="This is the example of a multiplexer circuit for the list of values x=[1,1,0,1]. Indeed, if we initialize the first two qubits with zeros, the output of the previous circuit will be a 1 in the third register, and so on."} +knitr::include_graphics("images/multiplexer.png") +``` + +The most general version of the circuit is the following, which includes some optimization. + +```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]. Importantly, only one $T$ gate is required to write in the target register a single memory entry. The memory entry is written using a Fan-Out gate (which can be decomposed into CNOT gates. Note that the depth of the circuit is linear in the number of memory entries.The angular lines in the gates are representing the so-called 'logical-AND', which is a CCNOT gate targeting an ancilla qubit starting in a state $\ket{0}$ and gets uncomputed using measurament-based uncomputation."} +knitr::include_graphics("algpseudocode/decomposedlookups.png") +``` + + + + +The bucket brigade architecture (in short BB architecture) is another possible architecture. This protocol was originally developed to be implemented with qutrits [@giovannetti2008quantum] but recent work has shown it can be implemented with qubits as well [@hann2021resilience]. First, we will mention the idea with qutrits since it is more intuitive to understand. Again, using the terminology introduced in definition \@ref(def:QPUQMD), we'll have: an address register, a target register (which will be referred to as a bus register) and a memory register. The input will be a vector of binary numbers $X \in (\{0,1\}^m)^n$ and the aim is to load a specific entry $X_i \in \{0,1\}^m$ on the bus register. The BB protocol will use the memory register in such a way that it has access to tree like structure. The tree saves the entries of $X$ in the leaves, which are referred to as memory cells. Each memory cell is connected to a parent node which form a set of intermediate nodes up until the root of the tree. Each intermediate node (up to the root) is called a quantum router (Figure 1b of [@hann2021resilience]) and is a qutrit (i.e., a three level quantum system), which can be in state $\ket{0}$ (route left), $\ket{1}$ (route right), and $\ket{W}$ (wait). When we want to perform a query, we prepare the address register with the index of the memory cell that we want to reach and we set all the router registers to the $\ket{W}$ state. Conditioned on the first qubit of the address register, the root of the tree changes from $\ket{W}$ to either $\ket{0}$(left) or $\ket{1}$(right). This is followed by a similar operation which uses as control the second qubit of the address register to change the state of the next node in the tree to either $\ket{0}$ or $\ket{1}$. The process of changing the state of the routers is repeated until the last layers of the tree(i.e. the memory cell) is reached. Now, the memory register will be in the state of the binary number $X_i$. This can be copied to the bus register by simply applying a series of CNOT gates (and thus we do not violate the no-cloning theorem). -Studying an error model of the BB architecture is hard. An attempt was first made in [@arunachalam2015robustness] which gave initial, but rather pessimistic result. More recently, a series of developments in [@hann2021resilience] and [@hann2021practicality] (accessible [here](https://www.proquest.com/openview/c5caf76bb490e4d3abbeca2cea16b450/1?pq-origsite=gscholar&cbl=18750&diss=y)) have shone light on the noise resilience of the BB $\mathsf{QRAM}$. The results presented in these more recent works are much more positive. Some resource estimations can be found in [@di2020fault], which do not take into account the new developements in the study of the error. +Studying an error model of the BB architecture is hard. An attempt was first made in [@arunachalam2015robustness] which gave initial, but rather pessimistic result. More recently, a series of developments in [@hann2021resilience] and [@hann2021practicality] (accessible [here](https://www.proquest.com/openview/c5caf76bb490e4d3abbeca2cea16b450/1?pq-origsite=gscholar&cbl=18750&diss=y)) have shone light on the noise resilience of the BB $\QRAM$. The results presented in these more recent works are much more positive. Some resource estimations can be found in [@di2020fault], which do not take into account the new developements in the study of the error. The metric of choice to test whether a quantum procedure has faithfully recreated a desired state is the fidelity $F$, with the infidelity defined as $1-F$. Given a addressable memory of size $N$(i.e. $\log N$ layers in the binary tree) and a bucket brigade which requires $T$ time-steps with a probability of error per time step of $\epsilon$, the infidelity of the bucket brigade scales as: @@ -562,8 +608,8 @@ knitr::include_graphics("algpseudocode/circuit_bb.png") (ref:doriguello2024practicality) [@doriguello2024practicality] - - + + @@ -571,10 +617,33 @@ knitr::include_graphics("algpseudocode/circuit_bb.png") The following statement gives a resource estimation for a QRAM of logarithmic depth using the quantum architecture proposed in [@litinski2022active]. ```{lemma, bb-qram-resources, name="Complexity of QRAM using (ref:doriguello2024practicality)"} -One bucket-brigade $\mathsf{QRAM}$ call of size $2^n$ and precision $\kappa$ requires (already including its uncomputation) $2^n - 2$ $\mathsf{Toffoli}$ gates, $2^{n+1} - n - 1$ dirty ancillae (plus $n+\kappa$ input/output qubits), and has $\mathsf{Toffoli}$-width of $2^{n-1}$, reaction depth of $2(n-1)$, and active volume of $(25 + 1.5\kappa + C_{|CCZ\rangle})2^n$. +One bucket-brigade $\QRAM$ call of size $2^n$ and precision $\kappa$ requires (already including its uncomputation) $2^n - 2$ $\mathsf{Toffoli}$ gates, $2^{n+1} - n - 1$ dirty ancillae (plus $n+\kappa$ input/output qubits), and has $\mathsf{Toffoli}$-width of $2^{n-1}$, reaction depth of $2(n-1)$, and active volume of $(25 + 1.5\kappa + C_{|CCZ\rangle})2^n$. +``` + +In the following, we report the resource count of some $\QRAM$ constructions using different techniques. + +```{theorem, qram-Fourier, name="Complexity of QRAM using Fourier analysis (ref:allcock2023quantum)"} +Let $n\in\mathbb{N}$ be a power of $2$. A $\QRAM$ of memory size $n$ can be implemented in $O(1)$-depth using + + - either $\frac{1}{2}n^2\log{n} + O(n^2)$ ancillae and $2n^2 + O(n\log{n})$ Fan-Out gates with arity $\leq 1+n^2$, + - or $2n^2$ ancillae and $2$ $\mathsf{GT}$ gates with arity $\leq \frac{1}{2}n^2\log{n} + O(n^2)$. ``` +```{theorem, qram-one-hot-encoding, name="Complexity of QRAM using one-hot encoding ideas (ref:allcock2023quantum)"} +For every $n \in \mathbb{N}$ a power of $2$, a $\QRAM$ of memory size $n$ can be implemented in $O(1)$-depth using + + - either $2n\log{n}\log\log{n} + O(n\log{n})$ ancillae and $6n\log{n} + O(n\log\log{n})$ Fan-Out gates with arity $\leq n+1$, + - or $3n\log{n} + O(n\log\log{n})$ ancillae and $6$ $\mathsf{GT}$ gates with arity $\leq n\log{n} + O(n\log\log{n})$. +``` + + +```{theorem, qram-recursive-procedure, name="Complexity of QRAM using recursive tricks (ref:allcock2023quantum)"} +For every $n,d \in \mathbb{N}$, a $\QRAM$ of memory size $n$ can be performed in $O(d)$-depth~using + + - either $O(n\log^{(d)}{n}\log^{(d+1)}{n})$ ancillae and $O(n\log^{(d)}{n})$ Fan-Out gates, + - or $O(n\log^{(d)}{n})$ ancillae and $16d-10$ $\mathsf{GT}$ gates. +``` ### Amplitude encoding{#sec:implementation-amplitude} @@ -633,7 +702,19 @@ For any $m > 0$, any $n$-qubit quantum state $\ket{\psi_v}$ can be generated by ``` -There are also other trade-off techniques that can be used, like probabilistic state preparation via measurements [@zhang2021lowdepth] or approximate state preparation problem [@zhang2024parallel]. However, these techniques are beyond the scope of this chapter and will not be discussed. Interested readers can refer to the respective articles. +There are also other trade-off techniques that can be used, like probabilistic state preparation via measurements [@zhang2021lowdepth] or approximate state preparation problem [@zhang2024parallel]. However, these techniques are beyond the scope of this chapter and will not be discussed. Interested readers can refer to the respective articles. However, even if we allow intermediate measurements we have lower bounds on the T-count, which is reached by the algorithm of [@gosset2024quantum]. + +(ref:gosset2024quantum) [@gosset2024quantum] + +```{theorem, optimal-t-count, name="Quantum state preparation with optimal T-count (ref:gosset2024quantum)"} +Any $n$-qubit state can be prepared up to error $\epsilon$ by a Clifford+T circuit starting with the all-zeroes state using +$$O\left(\sqrt{2^n\log(1/\epsilon)} + \log(1/\epsilon)\right)$$ +$T$ gates and ancillas. Furthermore, no Clifford+T circuit (even with measurement and adaptivity) can use asymptotically fewer $T$-gates. +``` + + + + In summary, there are many methods to perform amplitude encoding, each with different complexities through various trade-offs. In general, the data set that can be encoded using amplitude encoding lies under two main categories: (i) those discrete data that come from a vector or a matrix, or (ii) those that come from a discretized probability distribution. In literature, amplitude encoding of vectors or matrices is called state preparation via a KP-tree, while amplitude encoding of discretized probability distribution is called Grover-Rudolph (GR) state preparation [@Grover2002]. The main difference between the KP-tree method and the GR state preparation is that the KP-tree method requires a quantum memory to store some precomputed values in a data structure or a tree, while the GR state preparation does not require a quantum memory. In fact, GR state preparation is designed such that there are efficient circuits to implement the oracle in the quantum computer using \@ref(sec:implementation-oracle-synthesis). @@ -650,7 +731,7 @@ In summary, there are many methods to perform amplitude encoding, each with diff : Recap for the different methods proposed to implement amplitude encoding, together with the their gate count and ancilla complexity, along with the function type needed. This table is adapted from [@mori2024efficient], - 1 [@mori2024efficient], 2 [@Grover2002], 3 [@rattew2022preparing-arbitrary] 4 [@sanders2019black;@bausch2022fast] 5 [@moosa2023linear] 6 [@rosenkranz2024quantum] 7 [@shende2006synthesis] 8 [@STY-asymptotically]. Gate count or depth with * is expressed in number of $T$ gates. + 1 [@mori2024efficient], 2 [@Grover2002], 3 [@rattew2022preparing-arbitrary] 4 [@sanders2019black;@bausch2022fast] 5 [@moosa2023linear] 6 [@rosenkranz2024quantum] 7 [@shende2006synthesis] 8 [@STY-asymptotically] 9 [@gosset2024quantum]. Gate count or depth with * is expressed in number of $T$ gates. | | Method | Size | Ancilla | Depth | Function type | @@ -663,6 +744,7 @@ In summary, there are many methods to perform amplitude encoding, each with diff | 6 | LCU-based | $O(d^D + Dn\log d)$ | $O(D \log d)$ | - | Arb. | | 7 | Circuit | $N\log\left(\frac{N}{\epsilon}\right)$* | $O(n)$ | $N\log\left(\frac{N}{\epsilon}\right)$* | Arb. | | 8 | Circuit |$N\log\left(\frac{N}{\epsilon}\right)$ |$O\left(n+\lambda \right)$ | $\frac{N}{n + \lambda}\log \left(\frac{N}{\epsilon}\right) + n\log\left(\frac{N}{\epsilon}\right)$ * | Arb. | +| 9 | Circuit |$O\left(\sqrt{2^n\log(\frac{1}{\epsilon})} + \log(\frac{1}{\epsilon})\right)$* |$O\left(\sqrt{2^n\log(\frac{1}{\epsilon})} + \log(1/\epsilon)\right)$ |? | Arb. | @@ -676,24 +758,24 @@ There are many other works in state preparation, and we refer the interested rea Finally we note that in [@PrakashPhD] (Section 2.2.1), Prakash shows subroutines for generating $\ket{x}$ for a sparse $x$ in time $O(\sqrt{\|x\|_0})$. + In this model is it possible to prepare states with long-range entanglement with only constant quantum-depth and logarithmic classical depth. However, the authors do not generalize their algorithm for state preparation for any quantum state, but only for a restricted class of quantum states with constraints on the Hamming weights. + - - - - #### Grover-Rudolph state preparation, its problems, and the solutions{#sec:implementation-grover-rudolph} In [@Grover2002] the authors discussed how to efficiently create quantum states proportional to functions satisfying certain integrability condition, i.e. the function considered must be square-integrable. An example of functions with this properties are [log-concave probability distributions](https://sites.stat.washington.edu/jaw/RESEARCH/TALKS/Toulouse1-Mar-p1-small.pdf). Let $p(x)$ be a probability distribution over $\mathbb{R}$. We denote by $x_i^n$ is the points of the discretization over the domain, i.e $x_i^{(n)} = -w + 2w \frac{i}{2^n}$ for $i=0,\dots,2^n$, and $[-w,w]$ is the window of discretization, for a constant $w\in\mathbb{R}_+$. In this case, $n$ acts as the parameter that controls how coarse or fine is the discretization. Consider referencing the appendix for more informations about measure theory and probability distributions. We want to create the quantum state -\begin{align} +\begin{equation} |\psi_n\rangle = \sum_{i=0}^{2^n-1}\sqrt{p^{(n)}_i}|i\rangle -\end{align} + (\#eq:quantum-state-GR) +\end{equation} with -\begin{align} +\begin{equation} p_i^{(n)} = \int_{x_i^{(n)}}^{x_{i+1}^{(n)}}p(x)\text{d}x. -\end{align} +(\#eq:definition-of-p) +\end{equation} Actually, the probabilities $p_i^{(n)}$ will be normalized by $\int_{-w}^w p(x)\text{d}x$. This is equivalent to discretizing the sample space $\Omega$ in $N=2^n$ intervals with $N+1$ points, so that we can identify the samples $\omega$ of our discretized random variable with the elements of the set $[N]$. To create the state $\ket{\psi_n}$ we proceed recursiveliy in $n$, starting from initial state $\ket{0}$. To go from $\ket{\psi_m} = \sum_{i=0}^{2^m-1} \sqrt{p_i^{(m)}}\ket{i}$ to $\ket{\psi_{m+1}} = \sum_{i=0}^{2^{m+1}-1} \sqrt{p_i^{(m+1)}}\ket{i}$ we proceed by performing a query to an oracle that gives us an angle $\theta_i$, for $i \in [2^m]$, which is used to perform the following rotation: @@ -735,6 +817,7 @@ However, if we restrict ourselves to considering loading probabilities from a Ga \begin{align*} I_{i,m} \left( \sigma \right) = \int_{x_i^{(m)}}^{x_{i+1}^{(m)}}\frac{1}{\sigma\sqrt{\pi}}e^{-x^2/\sigma^2}\text{d}x = \int_{x_i^{(m)}/\sigma}^{x_{i+1}^{(m)}/\sigma}\frac{1}{\sqrt{\pi}}e^{-x^2}\text{d}x \,, + (\#eq:gaussian-integrals) \end{align*} where the second equality is obtained through the substitution $x \mapsto \frac{x}{\sigma}$ in the integral, $m = 1,\, \dots,\, n$ determines the size of the interval partition $\frac{1}{2^m}$, $i = 0,\, \dots,\, 2^m$ indexes the interval points, $\sigma$ is the standard deviation of the Gaussian distribution, and $w$ determines the end point of the integration, which is chosen such that the interval points $x_i^{(m)} = w\sigma \left( \frac{i}{2^{m-1}}-1\right)$ is linear in $\sigma$. By the choice of the interval points, $I_{i,m} \left(\sigma \right) = I_{i,m} \left( 1 \right)$. Therefore, there is only one set of integrals to be evaluated for all values of $\sigma$, and we can store the integrals classically to high precision. This iterative construction is thus effective, retaining the quadratic speedup benefits of the GR algorithm. @@ -1094,11 +1177,11 @@ The previous theorems can be read more simply as: "under reasonable assumptions It will become clear in the next sections how the value of $\mu(A)$ will become a factor in the runtime of our quantum algorithm, so having a small value of $\mu$ will directly lead to faster quantum algorithms. In [@kerenidis2017quantumsquares], they provided such efficient factorization for various choices of $\mu$. In the following we explicitly define a class of functions $\mu$, parameterized by $p \in [0,1]$, that will prove to be very useful in governing the runtime of the quantum algorithms. --> - + -The interested reader can read [@camps2024explicit] to learn how to create block encodings from sparse access. +The interested reader can read [@camps2024explicit,@yang2024quantum] to learn how to create block encodings from sparse access. ## Use case: working with classical probability distributions @@ -1183,7 +1266,7 @@ Different techniques have been recently developed in [@zhang2020efficient]. Ther (ref:zhang2020efficient) [@zhang2020efficient] ```{theorem, tomography-trick, name="Improved quantum tomography (ref:zhang2020efficient)"} -For the state $\ket{v}$ lies in the row space of a matrix $A \in \R^{n \times d}$ with rank $r$ and condition number $\kappa(A)$, the classical form of $\ket{v}$ can be obtained by using $O(r^3\epsilon^2)$ queries to the state $\ket{v}$, $O(r^{11}\kappa^{5r}\epsilon^{-2}\log(1/\delta))$ queries to $\mathsf{QRAM}$ oracles of $A$ and $O(r^2)$ additional inner product operations between rows, such that the $\ell_2$ norm error is bounded in $\epsilon$ with probability at least $1-\delta$. +For the state $\ket{v}$ lies in the row space of a matrix $A \in \R^{n \times d}$ with rank $r$ and condition number $\kappa(A)$, the classical form of $\ket{v}$ can be obtained by using $O(r^3\epsilon^2)$ queries to the state $\ket{v}$, $O(r^{11}\kappa^{5r}\epsilon^{-2}\log(1/\delta))$ queries to $\QRAM$ oracles of $A$ and $O(r^2)$ additional inner product operations between rows, such that the $\ell_2$ norm error is bounded in $\epsilon$ with probability at least $1-\delta$. ``` diff --git a/index.Rmd b/index.Rmd index 4436e06..ec10dba 100644 --- a/index.Rmd +++ b/index.Rmd @@ -40,6 +40,8 @@ github-repo: "scinawa/quantumalgorithms.org" \newcommand{\bra}[1]{\langle#1|} \newcommand{\braket}[1]{\langle#1\rangle} +\newcommand{\QRAM}{\mathsf{QRAM}} + \newcommand{\be}{\begin{equation}} \newcommand{\ee}{\end{equation}} \newcommand{\argmax}{\arg\max} From eb7f4fb7b86d2b1b62c18144677a563f3e0e7f5d Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:49:33 +0800 Subject: [PATCH 16/22] Add image BB CCNOTs --- algpseudocode/circuit_bb_ccnots.png | Bin 0 -> 62090 bytes algpseudocode/circuit_bb_ccnots.tex | 439 ++++++++++++++++++++++++++++ 2 files changed, 439 insertions(+) create mode 100644 algpseudocode/circuit_bb_ccnots.png create mode 100644 algpseudocode/circuit_bb_ccnots.tex diff --git a/algpseudocode/circuit_bb_ccnots.png b/algpseudocode/circuit_bb_ccnots.png new file mode 100644 index 0000000000000000000000000000000000000000..fd558068860d6b6ff80a03d43d730462397009c1 GIT binary patch literal 62090 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

Wkn?<#KP=W7rEaUTtI&krh2Hr$M4Qq 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 UGIf6nzJ|b0Is8O9;d}M}0{eg|+yDRo literal 0 HcmV?d00001 diff --git a/algpseudocode/circuit_bb_ccnots.tex b/algpseudocode/circuit_bb_ccnots.tex new file mode 100644 index 0000000..07f18ad --- /dev/null +++ b/algpseudocode/circuit_bb_ccnots.tex @@ -0,0 +1,439 @@ +\documentclass[11pt]{article} +%\usepackage{algorithm2e} +\usepackage[utf8]{inputenc} +\usepackage{amsfonts} +%\usepackage{braket} +% \usepackage[bottom]{footmisc} +\usepackage{xcolor} +\usepackage{amsmath} +\usepackage{enumerate} +% \usepackage{appendix} +\usepackage{hyperref} +\usepackage{amsthm} +\usepackage{multirow} +\usepackage{tikz} +\usetikzlibrary{matrix,decorations.pathreplacing,quantikz} +% \usepackage{mleftright} +\usepackage{amssymb} +\usepackage{algorithm} +\usepackage{algpseudocode} +\algrenewcommand\algorithmicrequire{\textbf{Input:}} +\algrenewcommand\algorithmicensure{\textbf{Output:}} +% \usepackage{mathabx} +% \usepackage{comment} +\usepackage{subcaption} +\usepackage{enumerate} +\usepackage[margin=20pt]{geometry} + +\usetikzlibrary{math} %needed tikz library + +\begin{document} + + + + +\begin{tikzpicture} + % address register + \draw (0, 0) node{\small $\ket{i_0}$}; + \draw (0, 0.5) node{\small $\ket{i_1}$}; + \draw (0, 1) node{\small $\ket{i_2}$}; + + % memory register + \draw (0, -13) node{\small $m_{000}$}; + \draw (0, -13.5) node{\small $m_{001}$}; + \draw (0, -14) node{\small $m_{010}$}; + \draw (0, -14.5) node{\small $m_{011}$}; + \draw (0, -15) node{\small $m_{100}$}; + \draw (0, -15.5) node{\small $m_{101}$}; + \draw (0, -16) node{\small $m_{110}$}; + \draw (0, -16.5) node{\small $m_{111}$}; + + % ancilla qubits register + \draw (0, 2) node{\small $\ket{0}$}; + \draw (0, 2.5) node{\small $\ket{0}$}; + \draw (0, 3) node{\small $\ket{0}$}; + + + % target register + \draw (0, -12) node{\small $\ket{b}$}; + + % horizontal line ancilla register + \draw [-] [thick] (0+0.3, 2) to (16, 2); + \draw [-] [thick] (0+0.3, 2.5) to (16, 2.5); + \draw [-] [thick] (0+0.3, 3) to (16, 3); + + % horizontal lines address register + \draw [-] [thick] (0+0.3, 0) to (16, 0); + \draw [-] [thick] (0+0.3, 0.5) to (16, 0.5); + \draw [-] [thick] (0+0.3, 1) to (16, 1); + + % horizontali lines memory and target + \draw [-] [thick] (0+0.5, -13-0.1) to (16, -13-0.1); + \draw [-] [thick] (0+0.5, -13.5-0.1) to (16, -13.5-0.1); + \draw [-] [thick] (0+0.5, -14-0.1) to (16, -14-0.1); + \draw [-] [thick] (0+0.5, -14.5-0.1) to (16, -14.5-0.1); + \draw [-] [thick] (0+0.5, -15-0.1) to (16, -15-0.1); + \draw [-] [thick] (0+0.5, -15.5-0.1) to (16, -15.5-0.1); + \draw [-] [thick] (0+0.5, -16.5-0.1) to (16, -16.5-0.1); + \draw [-] [thick] (0+0.5, -16-0.1) to (16, -16-0.1); + \draw [-] [thick] (0+0.5, -12) to (16, -12); + + % double lines for classical memory register + \draw [-] [thick] (0+0.5, -13) to (16, -13); + \draw [-] [thick] (0+0.5, -13.5) to (16, -13.5); + \draw [-] [thick] (0+0.5, -14) to (16, -14); + \draw [-] [thick] (0+0.5, -14.5) to (16, -14.5); + \draw [-] [thick] (0+0.5, -15) to (16, -15); + \draw [-] [thick] (0+0.5, -15.5) to (16, -15.5); + \draw [-] [thick] (0+0.5, -16.5) to (16, -16.5); + \draw [-] [thick] (0+0.5, -16) to (16, -16); + + + + % ANCILLA REGISTERS + % central ancilla register + \draw (0, -6) node{\small $\ket{0}$}; + \draw (0, -6.5) node{\small $\ket{1}$}; + + % above and below angilla register pt 2 + \draw (3, -4) node{\small $\ket{0}$}; + %\draw (3, -4.5) node{\small $\ket{1}$}; + + \draw (3, -8) node{\small $\ket{0}$}; + %\draw (3, -8.5) node{\small $\ket{1}$}; + + + % above and below kets pt 3 + \draw (6, -2) node{\small $\ket{0}$}; + %\draw (6, -2.5) node{\small $\ket{1}$}; + + \draw (6, -10) node{\small $\ket{0}$}; + %\draw (6, -10.5) node{\small $\ket{1}$}; + + \draw (6, -5) node{\small $\ket{0}$}; + %\draw (6, -5.5) node{\small $\ket{1}$}; + + \draw (6, -7) node{\small $\ket{0}$}; + %\draw (6, -7.5) node{\small $\ket{1}$}; + + + + % horizontal lines 2nd level of ancillas + \draw [-] [thick] (0+0.3, -6) to (3+0.5, -6); % 0 + \draw [-] [thick] (0+0.3, -6.5) to (3+0.5, -6.5); % 1 + + + % % horizontal lines pt 2 + \draw [-] [thick] (3+0.5, -4.5) to (3+3.5, -4.5); % 1 + \draw [-] [thick] (3+0.5, -8.5) to (3+3.5, -8.5); % 1 + + \draw [-] [thick] (3+0.2, -4) to (3+3.5, -4); % 0 + \draw [-] [thick] (3+0.2, -8) to (3+3.5, -8); % 0 + + + % % horizontal lines pt 3 + \draw [-] [thick] (6+0.5-0.2, -2) to (16, -2); % 0 + \draw [-] [thick] (6+0.5, -2.5) to (16, -2.5); % 1 + + \draw [-] [thick] (6+0.5-0.2, -5) to (16, -5); % 0 + \draw [-] [thick] (6+0.5, -5.5) to (16, -5.5); % 1 + + \draw [-] [thick] (6+0.5-0.2, -7) to (16, -7); % 0 + \draw [-] [thick] (6+0.5, -7.5) to (16, -7.5); % 1 + + \draw [-] [thick] (6+0.5-0.2, -10) to (16, -10); % 0 + \draw [-] [thick] (6+0.5, -10.5) to (16, -10.5); % 1 + + + % vertical lines (central to external) + \draw [-] [thick] (3+0.5, -6) to (3+0.5, -4.5); % 0 -> 1 + \draw [-] [thick] (3+0.5, -6.5) to (3+0.5, -8.5); + \draw [-] [thick] (6+0.5, -4) to (6+0.5, -2.5); + \draw [-] [thick] (6+0.5, -4.5) to (6+0.5, -5); + \draw [-] [thick] (6+0.5, -8.5) to (6+0.5, -10.5); % 4th + \draw [-] [thick] (6+0.5, -8) to (6+0.5, -7.5); + + + + % CNOTS first layer + \draw[fill=black] (0+0.3+1, 0) circle [radius=0.1]; + \draw (0+0.3+1, -6) [thick] circle (0.13); + \draw [-] [thick] (0+0.3+1, 0) to (0+0.3+1, -6); + \draw [-] [thick] (0+0.3+1, -6-0.1) to (0+0.3+1, -6+0.1); + + \draw[fill=black] (2, -6) circle [radius=0.1]; + \draw (2, -6.5) [thick] circle (0.13); + \draw [-] [thick] (2, -6) to (2, -6.5); + \draw [-] [thick] (2, -6.5+0.1) to (2, -6.5-0.1); + + % COPY SECOND REGISTER + \draw[fill=black] (3+1, 0.5) circle [radius=0.1]; + \draw (3+1, 2) [thick] circle (0.13); + \draw [-] [thick] (3+1, 0.5) to (3+1, 2.1); + + + % CCNOT of second layer + \draw[fill=black] (3+0.5+1, 0.5) circle [radius=0.1]; + \draw (3+0.5+1, -4) [thick] circle (0.13); + \draw [-] [thick] (3+0.5+1, 0.5) to (3+0.5+1, -4); + \draw [-] [thick] (3+0.5+1, -4.5) to (3+0.5+1, -4); + \draw[fill=black] (3+0.5+1, -4.5) circle [radius=0.1]; + + \draw[fill=black] (3+0.3+1+0.5+0.2, 2) circle [radius=0.1]; + \draw (3+0.3+1+0.5+0.2, -8) [thick] circle (0.13); + \draw [-] [thick] (3+0.3+1+0.5+0.2, 2) to (3+0.3+1+0.5+0.2, -8.5); + \draw [-] [thick] (3+0.3+1+0.5+0.2, -4.5) to (3+0.3+1+0.5+0.2, -4); + \draw[fill=black] (3+0.3+1+0.5+0.2, -8.5) circle [radius=0.1]; + + + % last two CNOTs of second layer + \draw[fill=black] (5.6, -4) circle [radius=0.1]; + \draw (5.6, -4.5) [thick] circle (0.13); + \draw [-] [thick] (5.6, -4) to (5.6, -4.5); + \draw [-] [thick] (5.6, -4.5+0.1) to (5.6, -4.5-0.1); + + \draw[fill=black] (5.6, -8) circle [radius=0.1]; + \draw (5.6, -8.5) [thick] circle (0.13); + \draw [-] [thick] (5.6, -8) to (5.6, -8.5); + \draw [-] [thick] (5.6, -8.5+0.1) to (5.6, -8.5-0.1); + + % add cnot that uncomputes the first copy + \draw[fill=black] (3+2.7, 0.5) circle [radius=0.1]; + \draw (3+2.7, 2) [thick] circle (0.13); + \draw [-] [thick] (3+2.7, 0.5) to (3+2.7, 2.1); + + + % COPY INDEX + \draw[fill=black] (7, 1) circle [radius=0.1]; + \draw (7, 2) [thick] circle (0.13); + \draw [-] [thick] (7, 2) to (7, 1); + + \draw[fill=black] (7.4, 1) circle [radius=0.1]; + \draw (7.4, 2.5) [thick] circle (0.13); + \draw [-] [thick] (7.4, 2.5) to (7.4, 1); + + \draw[fill=black] (7.8, 2) circle [radius=0.1]; + \draw (7.8, 3) [thick] circle (0.13); + \draw [-] [thick] (7.8, 3.1) to (7.8, 2); + + + % box to say that we copy + % \draw [-] [dotted,thick] (6.5, 3.2) to (8.2, 3.2); + % \draw [-] [dotted,thick] (8.2, 0.5) to (8.2, 3.2); + % \draw [-] [dotted,thick] (8.2, 0.4) to (6.5, 0.4); + % \draw [-] [dotted] (6.5, 0.4) to (6.5, 3.2); + + + % last CCNOT on (copied) index register + \draw[fill=black] (8.5, 3) circle [radius=0.1]; + \draw[fill=black] (8.5, -2.5) circle [radius=0.1]; + \draw (8.5, -2) [thick] circle (0.13); + \draw [-] [thick] (8.5, -2.5) to (8.5, 3); + + + + \draw[fill=black] (9, 2.5) circle [radius=0.1]; + \draw[fill=black] (9, -5.5) circle [radius=0.1]; + \draw (9, -5) [thick] circle (0.13); + \draw [-] [thick] (9, -5.5) to (9, 2.5); + + + \draw[fill=black] (9.5, 2) circle [radius=0.1]; + \draw[fill=black] (9.5, -7.5) circle [radius=0.1]; + \draw (9.5, -7) [thick] circle (0.13); + \draw [-] [thick] (9.5, -7.5) to (9.5, 2); + + + \draw[fill=black] (10, 1) circle [radius=0.1]; + \draw[fill=black] (10, -10.5) circle [radius=0.1]; + \draw (10, -10) [thick] circle (0.13); + \draw [-] [thick] (10, -10.5) to (10, 1); + + + % last layer of cnots + % \draw[fill=black] (8.5, -2) circle [radius=0.1]; + \draw[fill=black] (9+1.7, -2) circle [radius=0.1]; + \draw (9+1.7, -2.5) [thick] circle (0.13); + \draw [-] [thick] (9+1.7, -2.5-0.1) to (9+1.7, -2); + + \draw[fill=black] (9+1.7, -5) circle [radius=0.1]; + \draw (9+1.7, -5.5) [thick] circle (0.13); + \draw [-] [thick] (9+1.7, -5.5-0.1) to (9+1.7, -5); + + + \draw[fill=black] (9+1.7, -7) circle [radius=0.1]; + \draw (9+1.7, -7.5) [thick] circle (0.13); + \draw [-] [thick] (9+1.7, -7.5-0.1) to (9+1.7, -7); + + \draw[fill=black] (9+1.7, -10) circle [radius=0.1]; + \draw (9+1.7, -10.5) [thick] circle (0.13); + \draw [-] [thick] (9+1.7, -10.5-0.1) to (9+1.7, -10); + + % writing in memory (OK) + % \draw[fill=black] (9.5+2.3, -10.5) circle [radius=0.1]; + % \draw[fill=black] (9.5+2.3, -13-0.05) [thick] circle (0.1); + % \draw (9.5+2.3, -12) [thick] circle (0.13); + % \draw [-] [thick] (9.5+2.3, -10.5) to (9.5+2.3, -13-0.1); + + % \draw[fill=black] (10+2.3, -10) circle [radius=0.1]; + % \draw[fill=black] (10+2.3, -13.5-0.05) [thick] circle (0.1); + % \draw (10+2.3, -12) [thick] circle (0.13); + % \draw [-] [thick] (10+2.3, -10) to (10+2.3, -13.5-0.1); + + % \draw[fill=black] (10.5+2.3, -7.5) circle [radius=0.1]; + % \draw[fill=black] (10.5+2.3, -14-0.05) [thick] circle (0.1); + % \draw (10.5+2.3, -12) [thick] circle (0.13); + % \draw [-] [thick] (10.5+2.3, -7.5) to (10.5+2.3, -14-0.1); + + % \draw[fill=black] (11+2.3, -7) circle [radius=0.1]; + % \draw[fill=black] (11+2.3, -14.5-0.05) [thick] circle (0.1); + % \draw (11+2.3, -12) [thick] circle (0.13); + % \draw [-] [thick] (11+2.3, -7) to (11+2.3, -14.5-0.1); + + + % \draw[fill=black] (11.5+2.3, -5.5) circle [radius=0.1]; + % \draw[fill=black] (11.5+2.3, -15-0.05) [thick] circle (0.1); + % \draw (11.5+2.3, -12) [thick] circle (0.13); + % \draw [-] [thick] (11.5+2.3, -5.5) to (11.5+2.3, -15-0.1); + + % \draw[fill=black] (12+2.3, -5) circle [radius=0.1]; + % \draw[fill=black] (12+2.3, -15.5-0.05) [thick] circle (0.1); + % \draw (12+2.3, -12) [thick] circle (0.13); + % \draw [-] [thick] (12+2.3, -5) to (12+2.3, -15.5-0.1); + + + % \draw[fill=black] (12.5+2.3, -2.5) circle [radius=0.1]; + % \draw[fill=black] (12.5+2.3, -16-0.05) [thick] circle (0.1); + % \draw (12.5+2.3, -12) [thick] circle (0.13); + % \draw [-] [thick] (12.5+2.3, -2.5) to (12.5+2.3, -16-0.1); + + % \draw[fill=black] (13+2.3, -2) circle [radius=0.1]; + % \draw[fill=black] (13+2.3, -16.5-0.05) [thick] circle (0.1); + % \draw (13+2.3, -12) [thick] circle (0.13); + % \draw [-] [thick] (13+2.3, -2) to (13+2.3, -16.5-0.1); + + \draw[fill=black] (9.5+2.3, -10.5) circle [radius=0.1]; + \draw[fill=black] (9.5+2.3, -13-0.05) [thick] circle (0.1); + \draw (9.5+2.3, -12) [thick] circle (0.13); + \draw [-] [thick] (9.5+2.3-0.05, -10.5) to (9.5+2.3-0.05, -12+0.1); + \draw [-] [thick] (9.5+2.3-0.05, -12-0.1) to (9.5+2.3-0.05, -13-0.1); + \draw [-] [thick] (9.5+2.3+0.05, -10.5) to (9.5+2.3+0.05, -12+0.1); + \draw [-] [thick] (9.5+2.3+0.05, -12-0.1) to (9.5+2.3+0.05, -13-0.1); + + + \draw[fill=black] (10+2.3, -10) circle [radius=0.1]; + \draw[fill=black] (10+2.3, -13.5-0.05) [thick] circle (0.1); + \draw (10+2.3, -12) [thick] circle (0.13); + \draw [-] [thick] (10+2.3-0.05, -10) to (10+2.3-0.05, -12+0.1); + \draw [-] [thick] (10+2.3-0.05, -12-0.1) to (10+2.3-0.05, -13.5-0.1); + \draw [-] [thick] (10+2.3+0.05, -10) to (10+2.3+0.05, -12+0.1); + \draw [-] [thick] (10+2.3+0.05, -12-0.1) to (10+2.3+0.05, -13.5-0.1); + + + + \draw[fill=black] (10.5+2.3, -7.5) circle [radius=0.1]; + \draw[fill=black] (10.5+2.3, -14-0.05) [thick] circle (0.1); + \draw (10.5+2.3, -12) [thick] circle (0.13); + \draw [-] [thick] (10.5+2.3-0.05, -7.5) to (10.5+2.3-0.05, -12+0.1); + \draw [-] [thick] (10.5+2.3-0.05, -12-0.1) to (10.5+2.3-0.05, -14-0.1); + \draw [-] [thick] (10.5+2.3+0.05, -7.5) to (10.5+2.3+0.05, -12+0.1); + \draw [-] [thick] (10.5+2.3+0.05, -12-0.1) to (10.5+2.3+0.05, -14-0.1); + + + + \draw[fill=black] (11+2.3, -7) circle [radius=0.1]; + \draw[fill=black] (11+2.3, -14.5-0.05) [thick] circle (0.1); + \draw (11+2.3, -12) [thick] circle (0.13); + \draw [-] [thick] (11+2.3-0.05, -7) to (11+2.3-0.05, -12+0.1); + \draw [-] [thick] (11+2.3-0.05, -12-0.1) to (11+2.3-0.05, -14.5-0.1); + \draw [-] [thick] (11+2.3+0.05, -7) to (11+2.3+0.05, -12+0.1); + \draw [-] [thick] (11+2.3+0.05, -12-0.1) to (11+2.3+0.05, -14.5-0.1); + + + \draw[fill=black] (11.5+2.3, -5.5) circle [radius=0.1]; + \draw[fill=black] (11.5+2.3, -15-0.05) [thick] circle (0.1); + \draw (11.5+2.3, -12) [thick] circle (0.13); + \draw [-] [thick] (11.5+2.3-0.05, -5.5) to (11.5+2.3-0.05, -12+0.1); + \draw [-] [thick] (11.5+2.3-0.05, -12-0.1) to (11.5+2.3-0.05, -15-0.1); + \draw [-] [thick] (11.5+2.3+0.05, -5.5) to (11.5+2.3+0.05, -12+0.1); + \draw [-] [thick] (11.5+2.3+0.05, -12-0.1) to (11.5+2.3+0.05, -15-0.1); + + + \draw[fill=black] (12+2.3, -5) circle [radius=0.1]; + \draw[fill=black] (12+2.3, -15.5-0.05) [thick] circle (0.1); + \draw (12+2.3, -12) [thick] circle (0.13); + \draw [-] [thick] (12+2.3-0.05, -5+0.1) to (12+2.3-0.05, -12-0.1+0.2); + \draw [-] [thick] (12+2.3-0.05, -12-0.1) to (12+2.3-0.05, -15.5-0.1-0.1); + \draw [-] [thick] (12+2.3+0.05, -12-0.1) to (12+2.3+0.05, -15.5-0.1+0.2); + \draw [-] [thick] (12+2.3+0.05, -12+0.1) to (12+2.3+0.05, -5-0.1); + + + + \draw[fill=black] (12.5+2.3, -2.5) circle [radius=0.1]; + \draw[fill=black] (12.5+2.3, -16-0.05) [thick] circle (0.1); + \draw (12.5+2.3, -12) [thick] circle (0.13); + \draw [-] [thick] (12.5+2.3-0.05, -2.5) to (12.5+2.3-0.05, -12+0.1); + \draw [-] [thick] (12.5+2.3-0.05, -12-0.1) to (12.5+2.3-0.05, -16); + \draw [-] [thick] (12.5+2.3+0.05, -2.5) to (12.5+2.3+0.05, -12+0.1); + \draw [-] [thick] (12.5+2.3+0.05, -12-0.1) to (12.5+2.3+0.05, -16); + + % \draw [-] [thick] (12.5+2.3, -2.5) to (12.5+2.3, -16-0.1); + % \draw [-] [thick] (12.5+2.3, -2.5) to (12.5+2.3, -16-0.1); + % \draw [-] [thick] (12.5+2.3, -2.5) to (12.5+2.3, -16-0.1); + + + + + + \draw[fill=black] (13+2.3, -2) circle [radius=0.1]; + \draw[fill=black] (13+2.3, -16.5-0.05) [thick] circle (0.1); + \draw (13+2.3, -12) [thick] circle (0.13); + \draw [-] [thick] (13+2.3-0.05, -2) to (13+2.3-0.05, -12+0.1); + \draw [-] [thick] (13+2.3-0.05, -12-0.1) to (13+2.3-0.05, -16.5-0.1); + \draw [-] [thick] (13+2.3+0.05, -2) to (13+2.3+0.05, -12+0.1); + \draw [-] [thick] (13+2.3+0.05, -12-0.1) to (13+2.3+0.05, -16.5-0.1); + + +% NOT vertical line + \draw [-] [thick] (13+2.3, -12+0.1) to (13+2.3, -12-0.1); + \draw [-] [thick] (12.5+2.3, -12+0.1) to (12.5+2.3, -12-0.1); +\draw [-] [thick] (12+2.3, -12+0.1) to (12+2.3, -12-0.1); +\draw [-] [thick] (11.5+2.3, -12+0.1) to (11.5+2.3, -12-0.1); +\draw [-] [thick] (11+2.3, -12+0.1) to (11+2.3, -12-0.1); +\draw [-] [thick] (10.5+2.3, -12+0.1) to (10.5+2.3, -12-0.1); +\draw [-] [thick] (10+2.3, -12+0.1) to (10+2.3, -12-0.1); +\draw [-] [thick] (9.5+2.3, -12+0.1) to (9.5+2.3, -12-0.1); +% + + % \draw [-] [thick] (13+2.3, -12) to (13+2.3, -16.5-0.1); + % \draw [-] [thick] (13+2.3, -12) to (13+2.3, -16.5-0.1); + % \draw [-] [thick] (13+2.3, -12) to (13+2.3, -16.5-0.1); + % \draw [-] [thick] (13+2.3, -12) to (13+2.3, -16.5-0.1); + % \draw [-] [thick] (13+2.3, -12) to (13+2.3, -16.5-0.1); + % \draw [-] [thick] (13+2.3, -12) to (13+2.3, -16.5-0.1); + % \draw [-] [thick] (13+2.3, -12) to (13+2.3, -16.5-0.1); + + + + + + + % TODO undo the last copy + \draw[fill=black] (11, 1) circle [radius=0.1]; + \draw (11, 2) [thick] circle (0.13); + \draw [-] [thick] (11, 2) to (11, 1); + + \draw[fill=black] (11.4, 1) circle [radius=0.1]; + \draw (11.4, 2.5) [thick] circle (0.13); + \draw [-] [thick] (11.4, 2.5) to (11.4, 1); + + \draw[fill=black] (11.8, 2) circle [radius=0.1]; + \draw (11.8, 3) [thick] circle (0.13); + \draw [-] [thick] (11.8, 3.1) to (11.8, 2); + +\end{tikzpicture} + + + + +\end{document} \ No newline at end of file From 9a645c7b4b0bd5512370d2d1c2bd7c59ca95e589 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Wed, 4 Dec 2024 15:18:26 +0800 Subject: [PATCH 17/22] New QRAM BB with CNOTS and caption and exercise --- data.Rmd | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/data.Rmd b/data.Rmd index 60d262d..b468f0a 100644 --- a/data.Rmd +++ b/data.Rmd @@ -491,7 +491,7 @@ In this section we are discussing implementations a unitary giving query access \end{equation} -where $U_i\ket{0}=\ket{x_i}$ and $x_i \in \{0,1\}^m$. +where $U_i\ket{0}=\ket{x_i}$ and $x_i \in \{0,1\}^m$. Importantly, when considering gate decompositions of this unitary, we are allowed to act in a larger space, as long as in the subspace of interested our application acts accoring to Eq.\@ref(eq:unitary-visualization-binary-encoding). @@ -569,7 +569,7 @@ knitr::include_graphics("images/multiplexer.png") The most general version of the circuit is the following, which includes some optimization. -```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]. Importantly, only one $T$ gate is required to write in the target register a single memory entry. The memory entry is written using a Fan-Out gate (which can be decomposed into CNOT gates. Note that the depth of the circuit is linear in the number of memory entries.The angular lines in the gates are representing the so-called 'logical-AND', which is a CCNOT gate targeting an ancilla qubit starting in a state $\ket{0}$ and gets uncomputed using measurament-based uncomputation."} +```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]. Importantly, only one $T$ gate is required to write in the target register a single memory entry. The memory entry is written using a Fan-Out gate (which can be decomposed into CNOT gates. Note that the depth of the circuit is linear in the number of memory entries.The angular lines in the gates are representing the so-called 'logical-AND', which is a CCNOT gate targeting an ancilla qubit starting in a particular state (ground state on which we apply a $T$ gate) and gets uncomputed using measurament-based uncomputation."} knitr::include_graphics("algpseudocode/decomposedlookups.png") ``` @@ -605,6 +605,18 @@ The time required to perform a query, owing to the tree structure of the BB, is knitr::include_graphics("algpseudocode/circuit_bb.png") ``` + +```{r, bb-qram-image-ccnot, echo=FALSE, fig.width=5, fig.cap="A possible implementation of the bucket-brigade QRAM in the circuit model, from [@doriguello2024practicality;@arunachalam2015robustness]. In every layer, before the parallel layer of Toffoli gates, a log-depth linear-size gadget is copying the index register. In this way, the Toffoli gates can be executed in parallel."} +knitr::include_graphics("algpseudocode/circuit_bb_ccnots.png") +``` + +```{exercise} +The last block of the circuit depicted in Figure \@ref(fig:bb-qram-image-ccnot) has linear depth in the number of memory elements, i.e. has exponential depth in the number of qubits in the index regsiter. Eventually using some ancilla qubits, can you create a gadget that writes to the output register in logarithmic depth? +``` + + + + (ref:doriguello2024practicality) [@doriguello2024practicality] From 875eea4cd0c74b3c6f28ff35dd180acf2827fb85 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:47:59 +0800 Subject: [PATCH 18/22] Fix bug in image bb swaps --- algpseudocode/circuit_bb.tex | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/algpseudocode/circuit_bb.tex b/algpseudocode/circuit_bb.tex index 3675751..b9c953d 100644 --- a/algpseudocode/circuit_bb.tex +++ b/algpseudocode/circuit_bb.tex @@ -260,7 +260,12 @@ \draw[connSwap] (11.0, 0.5) -- (11.0, 4.0); \draw plot[swap] (11.0, 0.5); \draw plot[swap] (11.0, 4.0); - \node[bc] at (11.0, 3.5) {}; + \node[bc] at (11.0, 3.5) {}; + + \draw[connSwap] (11.0, -3.5) -- (11.0, -0.5); + \draw plot[swap] (11.0, -0.5); + \draw plot[swap] (11.0, -3.0); + \node[bc] at (11.0, -3.5) {}; % Column 16 \draw[connSwap] (12.4, 4.0) -- (12.4, 5.25); From 3e3cdef737baa0e31687f3d80a274ca8ee0cab84 Mon Sep 17 00:00:00 2001 From: Scinawa <2940017+Scinawa@users.noreply.github.com> Date: Sun, 8 Dec 2024 22:49:17 +0800 Subject: [PATCH 19/22] Fix bug on norm for block encoding --- algpseudocode/circuit_bb.png | Bin 134774 -> 135897 bytes data.Rmd | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/algpseudocode/circuit_bb.png b/algpseudocode/circuit_bb.png index 813fd6e24b4067afab035f33df16e9ede6499250..bc7ef5fd47f072b4bea4a229e26568b5b8d3b28a 100644 GIT binary patch delta 66450 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 delta 65363 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 Hn)$y0W6ozU diff --git a/data.Rmd b/data.Rmd index b468f0a..d9e4cc9 100644 --- a/data.Rmd +++ b/data.Rmd @@ -105,11 +105,11 @@ From an algorithms perspective, amplitude encoding is useful because it requires ### Block encoding {#sec:block-encoding} Block encoding is another type of encoding for working with matrices on a quantum computer. More precisely, we want to encode a matrix into a unitary that has a circuit representation on a quantum computer. As it will become clear in the next chapters, being able to perform such encoding unlocks many possibilities in terms of new quantum algorithms. -```{definition, name="Block encodings"} +```{definition, name="Block encoding of a matrix"} Let $A \in \mathbb{R}^{N \times N}$ be a square matrix for $N = 2^n$ for $n\in\mathbb{N}$, and let $\alpha \geq 1$. For $\epsilon > 0$, we say that a $(n+a)$-qubit unitary $U_A$ is a $(\alpha, a, \epsilon)$-block encoding of $A$ if \begin{equation} - | A - \alpha ( \bra{0}^{\otimes a} \otimes I) U_A (\ket{0}^{\otimes a} \otimes I) | \leq \epsilon + \| A - \alpha ( \bra{0}^{\otimes a} \otimes I) U_A (\ket{0}^{\otimes a} \otimes I) \|_2 \leq \epsilon \end{equation} ``` From e0ccd18bf021e2a6b0792676fb6d3b9a1bf90bdb Mon Sep 17 00:00:00 2001 From: Alessandro Luongo <2940017+Scinawa@users.noreply.github.com> Date: Tue, 7 Jan 2025 13:22:02 +0800 Subject: [PATCH 20/22] Fix typo --- data.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data.Rmd b/data.Rmd index d9e4cc9..5cc08a4 100644 --- a/data.Rmd +++ b/data.Rmd @@ -569,7 +569,7 @@ knitr::include_graphics("images/multiplexer.png") The most general version of the circuit is the following, which includes some optimization. -```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]. Importantly, only one $T$ gate is required to write in the target register a single memory entry. The memory entry is written using a Fan-Out gate (which can be decomposed into CNOT gates. Note that the depth of the circuit is linear in the number of memory entries.The angular lines in the gates are representing the so-called 'logical-AND', which is a CCNOT gate targeting an ancilla qubit starting in a particular state (ground state on which we apply a $T$ gate) and gets uncomputed using measurament-based uncomputation."} +```{r, multiplexer-babbush, echo=FALSE, fig.width=10, fig.cap="The implementation of the multiplexer of [@babbush2018encoding]. Importantly, only one $T$ gate is required to write in the target register a single memory entry. The memory entry is written using a Fan-Out gate (which can be decomposed into CNOT gates. Note that the depth of the circuit is linear in the number of memory entries.The angular lines in the gates are representing the so-called 'logical-AND', which is a CCNOT gate targeting an ancilla qubit starting in a particular state (ground state on which we apply a $T$ gate) and gets uncomputed using measurement-based uncomputation."} knitr::include_graphics("algpseudocode/decomposedlookups.png") ``` From 7cb04e73dfb6dfb8bc5199fd7f3e80451ec09b41 Mon Sep 17 00:00:00 2001 From: Alessandro Luongo <2940017+Scinawa@users.noreply.github.com> Date: Tue, 7 Jan 2025 13:23:24 +0800 Subject: [PATCH 21/22] FanOut -> Fan-Out --- data.Rmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data.Rmd b/data.Rmd index 5cc08a4..fee08ca 100644 --- a/data.Rmd +++ b/data.Rmd @@ -369,15 +369,15 @@ Most importantly, when using this oracle in our algorithm, we consider the cost -: Table for QRAM for $N=2^n$ memory elements of size $m$. 2 is [@giovannetti2008architectures], 4 is [@low2018trading], 5 and 6 are form [@allcock2023quantum], 8 is Lemma 10 from [@yuan2023optimal]. Gate count or depth with * is expressed in number of $T$ gates. Results expressed with + are in terms of FanOut gates of arity $O(n)$. TODO number 4 should have a parameter lambda for number of ancilla qubits? +: Table for QRAM for $N=2^n$ memory elements of size $m$. 2 is [@giovannetti2008architectures], 4 is [@low2018trading], 5 and 6 are form [@allcock2023quantum], 8 is Lemma 10 from [@yuan2023optimal]. Gate count or depth with * is expressed in number of $T$ gates. Results expressed with + are in terms of Fan-Out gates of arity $O(n)$. TODO number 4 should have a parameter lambda for number of ancilla qubits? | | Method | Size | Ancilla | Depth | Comment | |---|-------------------------|--------------------------------------|--------------------------------------|--------|-------------------| | 1 | Multiplexer | O(nm) | | O(nm) | | | 2 | Bucket Brigade | | | | | -| 3 | FanOut BB | | | | Uses FanOut gates | +| 3 | Fan-Out BB | | | | Uses Fan-Out gates | | 4 | Trading | $O(n)$ | $2n + 2$ | $O(n)$ | | -| 5 | One-hot encoding FanOut | $6n\log{n} + O(n\log\log{n})$ $\:^+$ | $2n\log{n}\log\log{n} + O(n\log{n})$ | $O(1)$ | | +| 5 | One-hot encoding Fan-Out | $6n\log{n} + O(n\log\log{n})$ $\:^+$ | $2n\log{n}\log\log{n} + O(n\log{n})$ | $O(1)$ | | | 6 | One-hot encoding GT-gate| $6n\log{n} + O(n\log\log{n})$ $\:^+$ | $2n\log{n}\log\log{n} + O(n\log{n})$ | $O(1)$ | | | 7 | Fourier | | | | | | 8 | Circuit | $O(N2^m)$ | $\lambda$ | | $\lambda > Nm$ | From 3f92803951b29936a63bb529f4d8cbb725c1e04f Mon Sep 17 00:00:00 2001 From: Alessandro Luongo <2940017+Scinawa@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:58:24 +0800 Subject: [PATCH 22/22] Fix typo on adjacency matrix size --- data.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data.Rmd b/data.Rmd index fee08ca..84e3508 100644 --- a/data.Rmd +++ b/data.Rmd @@ -555,7 +555,7 @@ Let $V \in \mathbb{R}^{n \times d}$, there is an oracle that allows to perform t The previous definition is also called *adjacency array* model. The emphasis is on the word *array*, contrary to the adjacency list model in classical algorithms (where we usually need to go through all the list of adjacency nodes for a given node, while here we can query the list as an array, and thus use superposition) [@Durr2004]. -It is important to recall that for Definition \@ref(def:oracle-access-adjacencymatrix) and \@ref(def:oracle-access-adjacencylist) we could use a $\QRAM$, but we also expect **not** to use a $\QRAM$, as there might be other efficient circuit for performing those mapping. For instance, when working with graphs (remember that a generic weighted and directed graph $G=(V,E)$ can be seen as its adjacency matrix $A\in \mathbb{R}^{|E| \times |E|}$), many algorithms call Definition \@ref(def:oracle-access-adjacencymatrix) **vertex-pair-query**, and the two mappings in Definition \@ref(def:oracle-access-adjacencylist) as **degree query** and **neighbor query**. When we have access to both queries, we call that **quantum general graph model** [@hamoudi2018quantum]. This is usually the case in all the literature for quantum algorithms for Hamiltonian simulation, graphs, or algorithms on sparse matrices. +It is important to recall that for Definition \@ref(def:oracle-access-adjacencymatrix) and \@ref(def:oracle-access-adjacencylist) we could use a $\QRAM$, but we also expect **not** to use a $\QRAM$, as there might be other efficient circuit for performing those mapping. For instance, when working with graphs (remember that a generic weighted and directed graph $G=(V,E)$ can be seen as its adjacency matrix $A\in \mathbb{R}^{|V| \times |V|}$), many algorithms call Definition \@ref(def:oracle-access-adjacencymatrix) **vertex-pair-query**, and the two mappings in Definition \@ref(def:oracle-access-adjacencylist) as **degree query** and **neighbor query**. When we have access to both queries, we call that **quantum general graph model** [@hamoudi2018quantum]. This is usually the case in all the literature for quantum algorithms for Hamiltonian simulation, graphs, or algorithms on sparse matrices. #### Circuits {#sec:implementation-circuits}