From 73445025f2beea4ea53def2a2560f01c90c36667 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 12 Aug 2019 16:22:44 -0400 Subject: [PATCH 01/29] Added QRW Tutorial Notebook --- examples/random_walk_tutorial.ipynb | 660 ++++++++++++++++++++++++++++ 1 file changed, 660 insertions(+) create mode 100644 examples/random_walk_tutorial.ipynb diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb new file mode 100644 index 00000000000..9f60e42f11b --- /dev/null +++ b/examples/random_walk_tutorial.ipynb @@ -0,0 +1,660 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum Random Walks With Cirq - Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", + "\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Classical Random Walks**\n", + "\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $|0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "

\n", + "
\n", + "$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$\n", + "
\n", + "

\n", + "Where we know:\n", + "

\n", + "
\n", + "$|\\text{Final}\\rangle \\ = \\ |\\text{Initial} \\ + \\ j\\rangle$\n", + "
\n", + "

\n", + "So for our case, the final position vector is simply $|j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "

\n", + "
\n", + "$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", + "
\n", + "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", + "

\n", + "
\n", + "$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", + "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$\n", + "
\n", + "

\n", + "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", + "

\n", + "\n", + "**Quantum Random Walks**\n", + "\n", + "
\n", + "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", + "\n", + "
\n", + "\n", + "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", + "$|j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "\n", + "

\n", + "
\n", + "\n", + "
\n", + "\n", + "Going back to our original idea of some position vector $|j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "$H_W$ spanned by the following set:\n", + "

\n", + "
\n", + "$H_W \\ = \\ \\{|j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$\n", + "
\n", + "

\n", + "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", + "

\n", + "
\n", + "$H_C \\ = \\ \\{|i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$\n", + "
\n", + "

\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $|j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "


\n", + "\n", + "
\n", + "$|0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\ \\text{and} \\ \\ |1\\rangle \\ = \\ |\\downarrow\\rangle$\n", + "
\n", + "

\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as\n", + " $|i\\rangle \\ \\otimes \\ |j\\rangle$\n", + "\n", + "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", + "

\n", + "
\n", + "$U \\ = \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j|$\n", + "
\n", + "

\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $|0\\rangle$ and $|1\\rangle$, we know that any possible, general basis state vector formed from qubits\n", + "$|n\\rangle^{\\otimes \\ N}$\n", + " will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is\n", + " $|j \\ \\pm \\ 1\\rangle$\n", + " , depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle$ and we apply the $U$ operator:\n", + "\n", + "

\n", + "
\n", + " $U (|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle) \\ \\ = \\ \\Big( \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| \\Big )(|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle)$\n", + " $\\Rightarrow \\ |\\uparrow\\rangle\\langle\\uparrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| 1\\rangle \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| 1\\rangle$\n", + "

\n", + " $\\Rightarrow \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle \\ + \\ 0|\\downarrow\\rangle \\ \\otimes \\ |0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle$\n", + "
\n", + "

\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector\n", + " $|i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + "\n", + "

\n", + "\n", + "\n", + "
\n", + " $H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H | \\uparrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ + \\ | \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H | \\downarrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ - \\ | \\downarrow\\rangle }{\\sqrt{2}}$\n", + "
\n", + "\n", + " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", + "\n", + "

\n", + "
\n", + " $S \\ = \\ U \\ (H \\ \\otimes \\ I)$\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " **Tutorial: Building a QRW With Cirq**\n", + "

\n", + " Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" + ] + } + ], + "source": [ + "import cirq\n", + "import random\n", + "import numpy as np\n", + "import copy\n", + "import sympy\n", + "import itertools\n", + "from matplotlib import pyplot as plt\n", + "\n", + "number_qubits = 7\n", + "\n", + "qubits = []\n", + "for i in range(0, number_qubits):\n", + " qubits.append(cirq.GridQubit(0, i))\n", + "\n", + "print(qubits)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "
\n", + "
    \n", + "
  1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.
  2. \n", + "
    \n", + "
  3. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:
  4. \n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", + "

\n", + "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", + "

\n", + "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", + "

\n", + "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" + ] + } + ], + "source": [ + "ancilla = []\n", + "for i in range(0, number_qubits):\n", + " ancilla.append(cirq.GridQubit(1, i))\n", + "\n", + "print(ancilla)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "

\n", + "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 0): ───@───────────────────────@───\n", + " │ │\n", + "(0, 1): ───@───────────────────────@───\n", + " │ │\n", + "(0, 2): ───┼───@───────────────@───┼───\n", + " │ │ │ │\n", + "(0, 3): ───┼───┼───@───────@───┼───┼───\n", + " │ │ │ │ │ │\n", + "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", + " │ │ │ │ │ │ │\n", + "(1, 0): ───X───@───┼───┼───┼───@───X───\n", + " │ │ │ │ │\n", + "(1, 1): ───────X───@───┼───@───X───────\n", + " │ │ │\n", + "(1, 2): ───────────X───@───X───────────\n" + ] + } + ], + "source": [ + "number_qubits = 4\n", + "\n", + "def apply_n_qubit_tof(ancilla, args):\n", + "\n", + " if (len(args) == 2):\n", + " yield cirq.CNOT.on(args[0], args[1])\n", + "\n", + " elif (len(args) == 3):\n", + " yield cirq.CCX.on(args[0], args[1], args[2])\n", + "\n", + " else:\n", + "\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + " for k in range(2, len(args)-1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + "\n", + " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", + "\n", + " for k in range(len(args)-2, 1, -1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + "\n", + "\n", + "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", + "circuit = cirq.Circuit()\n", + "circuit.append(apply_n_qubit_tof(ancilla, control))\n", + "print(circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", + "
\n", + "
    \n", + "
  1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.
  2. \n", + "
    \n", + "
  3. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.
  4. \n", + "
    \n", + "
  5. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.
  6. \n", + "
    \n", + "
  7. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.
  8. \n", + "
    \n", + "
  9. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.
  10. \n", + "\n", + "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", + "

    \n", + "
    \n", + "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", + "
    \n", + "

    \n", + "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", + "

    \n", + "
    \n", + " $A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$\n", + "
    \n", + "

    \n", + "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", + "

    \n", + "
    \n", + " $$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", + "
    \n", + "

    \n", + "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def walk_step():\n", + " \n", + " #\"Flip\" the coin qubit\n", + "\n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " \n", + " #Implement the Addition Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits, 0, -1):\n", + "\n", + " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " for i in range(number_qubits+1, 1, -1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " #Implement the Subtraction Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits+1, 1, -1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " for i in range(1, number_qubits+1):\n", + "\n", + " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the ``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector qubits, we have:" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({12: 48, 14: 22, 20: 18, 10: 15, 16: 11, 28: 9, 18: 8, 52: 7, 30: 7, 40: 6, 54: 6, 42: 6, 32: 5, 22: 5, 26: 5, 38: 5, 44: 3, 36: 3, 48: 3, 34: 3, 24: 2, 50: 1, 8: 1, 46: 1})\n" + ] + } + ], + "source": [ + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the number of occurences of that position vector value on the y-axis. This gives us a probability distribution for the position of the random walker. It is important to note that the graphs will only have either even or odd numbered data point, depending on the initial position of the walker and the number of steps taken:" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 25, 48: 9, 54: 8, 44: 7, 50: 6, 16: 5, 42: 5, 46: 5, 12: 4, 22: 3, 38: 2, 36: 2, 34: 2, 30: 2, 56: 2, 10: 2, 20: 2, 40: 2, 28: 2, 24: 2, 18: 1, 32: 1, 26: 1})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + "\n", + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)\n", + "\n", + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", + "

    \n", + "
    \n", + " $$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", + "
    \n", + "

    \n", + "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 26, 12: 25, 50: 20, 54: 13, 16: 13, 10: 12, 14: 10, 48: 10, 20: 10, 18: 8, 44: 7, 36: 7, 46: 6, 24: 4, 26: 4, 28: 4, 38: 4, 34: 3, 42: 3, 30: 3, 40: 2, 56: 2, 22: 2, 32: 2})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " \n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)\n", + "\n", + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we get a probability distribution that is much more symetric!\n", + "

    \n", + "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From c9fe7cd4223863dfaeda197159be0f4f37e787ea Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 12 Aug 2019 16:37:02 -0400 Subject: [PATCH 02/29] QRW --- .../random_walk_tutorial-checkpoint.ipynb | 658 ++++++++++++++++++ examples/random_walk_tutorial.ipynb | 8 +- 2 files changed, 661 insertions(+), 5 deletions(-) create mode 100644 examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb new file mode 100644 index 00000000000..f945c11cfd0 --- /dev/null +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -0,0 +1,658 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum Random Walks With Cirq - Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", + "\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Classical Random Walks**\n", + "\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $|0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "\n", + "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", + "\n", + "Where we know:\n", + "

    \n", + "
    \n", + "$|\\text{Final}\\rangle \\ = \\ |\\text{Initial} \\ + \\ j\\rangle$\n", + "
    \n", + "

    \n", + "So for our case, the final position vector is simply $|j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "

    \n", + "
    \n", + "$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", + "
    \n", + "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", + "

    \n", + "
    \n", + "$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", + "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$\n", + "
    \n", + "

    \n", + "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", + "

    \n", + "\n", + "**Quantum Random Walks**\n", + "\n", + "
    \n", + "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", + "\n", + "
    \n", + "\n", + "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", + "$|j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "\n", + "

    \n", + "
    \n", + "\n", + "
    \n", + "\n", + "Going back to our original idea of some position vector $|j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "$H_W$ spanned by the following set:\n", + "

    \n", + "
    \n", + "$H_W \\ = \\ \\{|j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$\n", + "
    \n", + "

    \n", + "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", + "

    \n", + "
    \n", + "$H_C \\ = \\ \\{|i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$\n", + "
    \n", + "

    \n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $|j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "


    \n", + "\n", + "
    \n", + "$|0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\ \\text{and} \\ \\ |1\\rangle \\ = \\ |\\downarrow\\rangle$\n", + "
    \n", + "

    \n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as\n", + " $|i\\rangle \\ \\otimes \\ |j\\rangle$\n", + "\n", + "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", + "

    \n", + "
    \n", + "$U \\ = \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j|$\n", + "
    \n", + "

    \n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $|0\\rangle$ and $|1\\rangle$, we know that any possible, general basis state vector formed from qubits\n", + "$|n\\rangle^{\\otimes \\ N}$\n", + " will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is\n", + " $|j \\ \\pm \\ 1\\rangle$\n", + " , depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle$ and we apply the $U$ operator:\n", + "\n", + "

    \n", + "
    \n", + " $U (|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle) \\ \\ = \\ \\Big( \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| \\Big )(|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle)$\n", + " $\\Rightarrow \\ |\\uparrow\\rangle\\langle\\uparrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| 1\\rangle \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| 1\\rangle$\n", + "

    \n", + " $\\Rightarrow \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle \\ + \\ 0|\\downarrow\\rangle \\ \\otimes \\ |0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle$\n", + "
    \n", + "

    \n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector\n", + " $|i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + "\n", + "

    \n", + "\n", + "\n", + "
    \n", + " $H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H | \\uparrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ + \\ | \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H | \\downarrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ - \\ | \\downarrow\\rangle }{\\sqrt{2}}$\n", + "
    \n", + "\n", + " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", + "\n", + "

    \n", + "
    \n", + " $S \\ = \\ U \\ (H \\ \\otimes \\ I)$\n", + "
    " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " **Tutorial: Building a QRW With Cirq**\n", + "

    \n", + " Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" + ] + } + ], + "source": [ + "import cirq\n", + "import random\n", + "import numpy as np\n", + "import copy\n", + "import sympy\n", + "import itertools\n", + "from matplotlib import pyplot as plt\n", + "\n", + "number_qubits = 7\n", + "\n", + "qubits = []\n", + "for i in range(0, number_qubits):\n", + " qubits.append(cirq.GridQubit(0, i))\n", + "\n", + "print(qubits)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "
    \n", + "
      \n", + "
    1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.
    2. \n", + "
      \n", + "
    3. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:
    4. \n", + "
    \n", + "\n", + "\n", + "\n", + "\n", + "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", + "

    \n", + "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", + "

    \n", + "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", + "

    \n", + "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" + ] + } + ], + "source": [ + "ancilla = []\n", + "for i in range(0, number_qubits):\n", + " ancilla.append(cirq.GridQubit(1, i))\n", + "\n", + "print(ancilla)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "

    \n", + "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 0): ───@───────────────────────@───\n", + " │ │\n", + "(0, 1): ───@───────────────────────@───\n", + " │ │\n", + "(0, 2): ───┼───@───────────────@───┼───\n", + " │ │ │ │\n", + "(0, 3): ───┼───┼───@───────@───┼───┼───\n", + " │ │ │ │ │ │\n", + "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", + " │ │ │ │ │ │ │\n", + "(1, 0): ───X───@───┼───┼───┼───@───X───\n", + " │ │ │ │ │\n", + "(1, 1): ───────X───@───┼───@───X───────\n", + " │ │ │\n", + "(1, 2): ───────────X───@───X───────────\n" + ] + } + ], + "source": [ + "number_qubits = 4\n", + "\n", + "def apply_n_qubit_tof(ancilla, args):\n", + "\n", + " if (len(args) == 2):\n", + " yield cirq.CNOT.on(args[0], args[1])\n", + "\n", + " elif (len(args) == 3):\n", + " yield cirq.CCX.on(args[0], args[1], args[2])\n", + "\n", + " else:\n", + "\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + " for k in range(2, len(args)-1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + "\n", + " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", + "\n", + " for k in range(len(args)-2, 1, -1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + "\n", + "\n", + "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", + "circuit = cirq.Circuit()\n", + "circuit.append(apply_n_qubit_tof(ancilla, control))\n", + "print(circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", + "
    \n", + "
      \n", + "
    1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.
    2. \n", + "
      \n", + "
    3. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.
    4. \n", + "
      \n", + "
    5. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.
    6. \n", + "
      \n", + "
    7. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.
    8. \n", + "
      \n", + "
    9. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.
    10. \n", + "\n", + "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", + "

      \n", + "
      \n", + "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", + "
      \n", + "

      \n", + "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", + "

      \n", + "
      \n", + " $A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$\n", + "
      \n", + "

      \n", + "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", + "

      \n", + "
      \n", + " $$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", + "
      \n", + "

      \n", + "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def walk_step():\n", + " \n", + " #\"Flip\" the coin qubit\n", + "\n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " \n", + " #Implement the Addition Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits, 0, -1):\n", + "\n", + " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " for i in range(number_qubits+1, 1, -1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " #Implement the Subtraction Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits+1, 1, -1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " for i in range(1, number_qubits+1):\n", + "\n", + " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the ``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector qubits, we have:" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({12: 48, 14: 22, 20: 18, 10: 15, 16: 11, 28: 9, 18: 8, 52: 7, 30: 7, 40: 6, 54: 6, 42: 6, 32: 5, 22: 5, 26: 5, 38: 5, 44: 3, 36: 3, 48: 3, 34: 3, 24: 2, 50: 1, 8: 1, 46: 1})\n" + ] + } + ], + "source": [ + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the number of occurences of that position vector value on the y-axis. This gives us a probability distribution for the position of the random walker. It is important to note that the graphs will only have either even or odd numbered data point, depending on the initial position of the walker and the number of steps taken:" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
      " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 25, 48: 9, 54: 8, 44: 7, 50: 6, 16: 5, 42: 5, 46: 5, 12: 4, 22: 3, 38: 2, 36: 2, 34: 2, 30: 2, 56: 2, 10: 2, 20: 2, 40: 2, 28: 2, 24: 2, 18: 1, 32: 1, 26: 1})\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl8lNW5B/DfMzPZM9nIJEBYwhJZFEGIoALuCFpbUat1Q3vrldrqvbXX0oq1t9jaSl1qt1stVT+lFbvQKnqtCohclipoWJSdIJBIWJJMyDKTZCaTOfePmTeEZJJMMu9s7/y+nw+fZN55Z96TF+bJ4ZznPEeUUiAiovhninYDiIhIHwzoREQGwYBORGQQDOhERAbBgE5EZBAM6EREBsGATkRkEAzoREQGwYBORGQQlkheLD8/XxUXF0fykkREcW/btm21SilbX+dFNKAXFxejrKwskpckIop7IlIRzHkcciEiMggGdCIig2BAJyIyCAZ0IiKDYEAnIjIIBnQiIoNgQCciMog+A7qIDBeR9SKyV0T2iMi3/MeXiEiViOz0/7ku/M0lIqKeBLOwyAPgYaXUdhGxAtgmImv9zz2nlHomfM0jItLPqh1VeHr1ARyvb8HQnDQsmjsO8y8oinazdNNnQFdKnQBwwv99k4jsA2CcO0BECWHVjiosfm0XWtraAQBV9S1Y/NouADBMUO/XGLqIFAO4AMBW/6EHReRTEXlZRHJ1bhsRkW6eXn2gI5hrWtra8fTqA1Fqkf6CDugikgngHwAeUko1AngewBgAU+DrwT/bw+sWikiZiJTV1NTo0GQiov47Xt/Sr+PxKKiALiJJ8AXzFUqp1wBAKXVKKdWulPIC+D2A6YFeq5RappQqVUqV2mx9FgsjIgqLoTlp/Toej4LJchEALwHYp5T6eafjQzqddiOA3fo3j4hIH4vmjkOy+eyQl5ZkxqK546LUIv0Fk+UyE8ACALtEZKf/2KMAbheRKQAUgKMAvh6WFhIR6WD+BUX416FarNx2DABQlKBZLpsBSICn3ta/OURE4TMsNx0AcO7QLPzzP2dHuTX640pRIkoYdqcLAFDT5IpyS8KDAZ2IEobd4QYA1DpcaPeqKLdGfwzoRJQwah2+nrlXAXVOd5Rboz8GdCJKGHVON5LMvilBIw67MKATUcKwO90YY8sEAFQ3tUa5NfpjQCeihOBp9+J0sxsTh2QBYA+diChunW5ug1LAuMFWAEA1AzoRUXzSUhaH5abDmmJhD52IKF5pKYuDMpNhs6YwoBMRxSstZTE/Mxn5DOhERPGro4eekYICawqzXIiI4lWd0w2zSZCdlsQhFyKieGZ3upCXkQyTSVBgTYXT3Q6nyxPtZumKAZ2IEkKtw41BGckAAJs1BYDxctEZ0IkoIdgdLgzK9AX0Ai2gOxjQiYjijt3pxqAMXyDXeujVjQzoRERxx+5wd++hGyzThQGdiAyvta0dDpcH+Zm+QJ6bngyLSQy3/J8BnYgMz+7UctB9PXSTSZCfabzURQZ0IjK8uo5l/ykdx2zWFPbQiYjiTa2/MJc2hg7AkIuLGNCJyPC0Zf/5GWd66AXWFKYtEhHFG7s/cOd16aHbDbZZNAM6ERme3elGisWEjGRzx7ECawq86kyddCNgQCciw6t1uJCfmQIR6ThmxMVFDOhEZHidFxVpbNZUAMZa/s+ATkSGZ3e6OnLQNR2rRdlDJyKKH3UO91k56ECniovsoRMRxQelFGqd3YdcUpPMsKZaUN1onHouDOhEZGgOlwduj7fbkAvgX1zEHjoRUXzovJdoVwUGWy3aZ0AXkeEisl5E9orIHhH5lv94noisFZFy/9fc8DeXiKh/7AGW/Wts1lRD1XMJpofuAfCwUmoigIsAPCAiEwE8AmCdUqoEwDr/YyKimFKrLfvPZA8dSqkTSqnt/u+bAOwDUATgBgDL/actBzA/XI0kIhqojiGXgD30FDS7fbXSjaBfY+giUgzgAgBbARQqpU74nzoJoFDXlhER6aDOP+SSF2BStMBgm0UHHdBFJBPAPwA8pJRq7PycUkoBCFjhRkQWikiZiJTV1NSE1Fgiov6qdbhhTbUgxWLu9tyZ5f/GSF0MKqCLSBJ8wXyFUuo1/+FTIjLE//wQANWBXquUWqaUKlVKldpsNj3aTEQUNLvTHXD8HAAKDLb8P5gsFwHwEoB9Sqmfd3rqTQD3+L+/B8Ab+jePiCg0docr4HAL0Gm1aAINucwEsADAlSKy0//nOgBLAcwRkXIAV/sfExHFFLvDHXBREQDkpCUhyWyczaItfZ2glNoMQHp4+ip9m0NEpC+704WpIwMvkzHaZtFcKUpEhtXuVahzupEfIGVRY6TNohnQiciw6pvd8Cr0OOQCGGtxEQM6ERlWnVNbVBQ4ywXwF+hqSqC0RSKieFTbyypRjc2aCrvTDU+7N1LNChsGdCIyLK0wV0956ICvh66UL1893jGgE5FhaXVcespDB4y1/J8BnYgMy+5wQQTITe89ywVgQCciimm1Tjfy0pNhNvW0lOZMD73aABOjDOhEZFh2h6vXCVHgzPg6e+hERDHMt+y/5wlRwLdZdHZakiEWFzGgE5Fh1TndffbQAS0XnQGdiChm1TpcvaYsamyZxlj+z4BORIbk9njR2OrpNWVRU5DFHjoRUcw6s+w/iCGXzBRUN7XCt/la/GJAJyJDqvXvQtTXpCjg66G3tnnjfrNoBnQiMiRtKX9vpXM1RllcxIBORIZk13roQUyKanuLxvvEKAM6ERlSv8bQ2UMnIopdtQ43ks0mWFP63Gmz0/J/BnQiopijLfsX6bmOiybbv1k0e+hERDHI7nQHlYMOACLSkboYzxjQiciQfD30vidENbasVPbQiYhiUa3Djfwge+iAb3ERAzoRUYxRSsHu7Lt0bmdGWP7PgE5EhtPsbkdrm7d/Qy6ZKahrdqMtjjeLZkAnIsPpyEHvx5BLQZZ/s2hH/G4WzYBORIaj1XEJpnSuxmaAnYsY0InIcLRedv/G0LXl//GbusiATkSGY3f6etnB5qEDxlj+z4BORIZTq/XQgyidq9GqMsbz8n8GdCIyHLvDjYxkM9KSzUG/JsViRk56krF76CLysohUi8juTseWiEiViOz0/7kuvM0kIgqeLwc9+N65Jt6X/wfTQ/8DgHkBjj+nlJri//O2vs0iIho4u8PdrwlRTbwvLuozoCulNgKoi0BbiIh0YXe6+zV+rrFlpqDGYeCA3osHReRT/5BMrm4tIiIKkd3hCmrrua4KslJR3eiK282iBxrQnwcwBsAUACcAPNvTiSKyUETKRKSspqZmgJcjIgqO16tQ5xzYkIstMwUujxdNcbpZ9IACulLqlFKqXSnlBfB7ANN7OXeZUqpUKVVqs9kG2k4ioqA0trbB41XIG8CQS0GWf+eixvgcdhlQQBeRIZ0e3ghgd0/nEhFFkpaDPpAhl3hf/t/nZnsi8mcAlwPIF5FjAH4I4HIRmQJAATgK4OthbCMRUdDs/knNgUyKdvTQ4zR1sc+ArpS6PcDhl8LQFiKikNmd/a/jorFl+uq5xGsPnStFichQQgnoWWkWJFtMDOhERLFAG3LJS+9/QNc2i2ZAJyKKAXaHG7npSbCYBxbebNb4XVzEgE5EhmJ3uvpVNrerAmtKYqUtEhHFqlqHe0CFuTTsoRMRxYiBLvvXFFhTUed0w+2Jv82iGdCJyFAGWphLo+1cpO16FE8Y0InIMNravahvbhtQyqKmwBq/y/8Z0InIME43aznooffQ4zF1kQGdiAzDrtVxCSXLxb/8Px4nRhnQicgwtIAeSg9dG3/nkAsRURRpE5mh5KEnW0zITU9CjSP+CnQxoBORYYRSOrezAmsqe+hERNFkd7hgMQmyUpNCep94XVzEgE5EhmF3uJGXkQyTSUJ6n3hd/s+ATkSGYXe6QpoQ1Wg99HjbLJoBnYgMw+50hzx+DvgCutvjRWNLfG0WzYBORIZhd7gxKIQMF03H4qI4y3RhQCciw7A79BlyKbD6tqKrjrPVogzoRGQILe52ON3tIeWga+J1+T8DOhEZgraoSI8x9I7l/wzoRESR17HsP4TSuRprigUpFhOHXIiIokHroYdSOlcjIr7URQZ0IqLI66i0qMOkKOBfXNTELBciooizO7VKi6H30AGwh05EFC12hwtpSWakJ1t0eb8CayrH0ImIokGr46IXmzUF9c1tcHnadXvPcGNAJyJDqNVp2b9G21tUG5uPBwzoRGQIeq0S1WiLi+Jp2IUBnYgMQa86Lhpt+X88TYwyoBNR3FNK6VY6V3Omhx4/qYt9BnQReVlEqkVkd6djeSKyVkTK/V9zw9tMIqKeNbk8aGtXuo6hD8pMhojxeuh/ADCvy7FHAKxTSpUAWOd/TEQUFR3L/nUM6ElmE/LSk401hq6U2gigrsvhGwAs93+/HMB8ndtFRBQ0u3//Tz3quHQWb4uLBjqGXqiUOuH//iSAQp3aQ0TUb7X+HrqeeeiAL6AbqofeF+XbdK/HjfdEZKGIlIlIWU1NTaiXIyLq5kzpXP176LUJENBPicgQAPB/re7pRKXUMqVUqVKq1GazDfByREQ9s4eph15gTUVNU/xsFj3QgP4mgHv8398D4A19mkNE1H92hwtZqRYkW/TNxLZZU+Bu96KhpU3X9w2XYNIW/wzgQwDjROSYiNwLYCmAOSJSDuBq/2MioqjwLfvXd7gFOLP8P14mRvssS6aUur2Hp67SuS1ERANS53DrmrKo6bz8v6TQqvv7602fOpNERCFYtaMKT68+gOP1LRiak4ZFc8dh/gVFQb/e7nRhdH6m7u2Ktx46l/4TUVSt2lGFxa/tQlV9CxSAqvoWLH5tF1btqAr6Pexh76HHx/J/BnQiiqqnVx9AS9vZNcdb2trx9OoDQb2+3atQ16xvYS5NZooFqUkm9tCJiIJxvL6lX8e7Ot3shlLQtTCXRkTiauciBnQiiqqhOWn9Ot5VOOq4dBZPy/8Z0Ikoqv5tZnG3Y6kWExbNHRfU68NVx0VTwIBORBScWocbJgEGZ6V2HLthSlHQWS61Tl8PXc/SuZ3FUz0Xpi0SUdS4PO1YWfY5rp5QiGV3l0IphS+/8CHWH6hGs9uD9OS+Q1Sd1kMPwxg64OuhN7T4NotOsZjDcg29sIdORFGzes8p2J1u3HnRSAC+ScjF145HdZMLL28+EtR72J2+Hn5OWlJY2njstG9ydtxj72Lm0vf7lU4ZaQzoRBQ1r26twPC8NMwem99xrLQ4D3MmFuKFDYdR5x9O6U2tw428jGSYTKJ7+1btqMJr288E8IHkyEcSAzoRRcWhage2HK7DHdNHdgvG35s3Ds1uD379fnmf72N3uMI2Ifr06gNwt3vPOtafHPlIY0Anoqh4dWslksyCW0qHdXtubIEVt5YOxytbKvB5XXOv72N3hmeVKBB6jnykMaATUcS1trXj79s+x9xzB/dYJfGhq8+B2SR4Zk3vvWG7wxW2CdFQc+QjjQGdiCLurU9PoLHVgztnjOzxnMHZqfjazFF4Y+dx7K5q6PE8uyM8y/4BYNHccUhLOjuzJS3JHHSOfKQxoBNRxK3YWoHRtgxcNDqv1/Puv3wMctKT8LN39wd83uVpR5PLE7Yc9PkXFOHJmyZ1vH9eejKevGlSvypBRhIDOhFF1J7jDdhRWY87Z4yESO+ZKVmpSXjwirHYVF6LTeXd9yTWsmDCNeQC+IL6h4uvQmaKBfMmDY7ZYA4woBNRL1btqMLMpe9j1CP/1C0H+9WtlUixmHDz1OAC44KLR6IoJw1L39kPr/fsvT076riEachFk2Q24aLRedhcXhvW64SKAZ2IAtKjTnlXDpcHq3ZU4frzhyInPbggnGIx4ztzz8Ge443430+Pn/Vcbccq0fAGdACYNTYflXXNqLT3nnUTTQzoRBRQqHXKA3ljZxWc7nbcedGIfr3uhslFmDgkC0+vPgCX50ybzvTQwzfkopl9jg0AsOlQ96GfWMGATkQBVemcg62UwootlZgwJAsXDM/p12tNJsEj147HsdMtWLGlsuO43Rm5Hvro/AwMzU7FpoOxO+zCgE5EAWX3UBtloDnYnxxrwN4Tjbhzxog+J0MDmV2Sj5ljB+HX75ejsbUNgK+HnmwxITMl/HUGRQSzSvLxwWe1aO8ylh8rGNCJqJsPPqtFU2sbupZHMQnw8DXnDOg9V2ypQHqyGTdMGTqg14sIHpk3Aaeb27Bsw2EAvjou+RnJA/oFMRCzS2xobPXg02P1EblefzGgE9FZPq9rxgMrtmOMLRM/vXESinLSIPD12L0KqOxjKX4gDc1t+N9Pj+OGKUWwpg68KuKkYdn44uSheHHzYVQ3tqLOGb5VooHMHJsPEcRstgvroRNRB6fLg/v+WIZ2r8Lv7y5FcX4Gbpvum8BUSmHR3z/FL94rx/jBWZh33uCg3/e1HcfQ2ubFnTP6NxkayKJrxuHd3Sfw3HvlYa3jEkheRjLOHZqFTeW1+I+rSiJ23WCxh05EAHwB+zsrP8HBU034zR1TUZyfcdbzIoIn5p+HycNz8F9/24n9JxuDft8VWysxeXgOzivKDrmdIwal484ZI/HXjyux61gD/u9ATUTrlM8aa8P2ytNwuDwRuV5/MKATEQDgN+8fwju7T2LxtRNwqT9Fr6vUJDOWLZiGzBQLFv5xG+qb+65X/tGROhyqdujSO9eMtWXCqwBtajKSdcovLcmHx6uw9bA97NfqLwZ0IsKaPSfx7NqDuPGCIvz77FG9nluYlYoXFkzDyYZWPPjqDni61AvvasXWSlhTLfji+QObDA3k+Q2fdTsWqTrl04pzkZpkwqYYHEdnQCdKcOWnmvDtv+7E+cOy8eRNk4LKGJk6IhdP3HgeNh+qxZPvBC6cBfhWcr6z+wRunjoMacn67ccZzTrlKRYzpo8aFLC2TLQxoBMlsIbmNtz3xzKkJVvwuwXTkJoUfNC9tXQ4vnpJMV7afAR/33Ys4Dl/33YMbe1K1+EWIPp1yi8tycdnNU6caIitjS4Y0IkSlKfdiwf/vB1V9S343YKpGJLd/2D4/S9MwCVjBuHR13dhR+Xps57zehVe3VqJ6aPyUFJo1avZAKJfp3xWiW8P1FgbdmFAJ0pQT60+gE3ltfjRDedh2sje65L3JMlswv/cMRWFWSm4/5VtqG5s7Xhu86FaVNY16947B87UKddy5Ity0iJap3xcoRU2a0rM5aOHlIcuIkcBNAFoB+BRSpXq0SgiCq/XdxzDso2HcffFI3H79NACbm5GMn5/dylu+u0H+Por2/CXhRchxWLGq1srkZeR3K989f6Yf0FR1GqTiwhmjc3HhoM18HpVt02uo0WPhUVXKKVi69dUFKzaUYWnVx/A8foWDM1Jw6K542K6ED4lHu3fqFZ0a4wtAz+4fqIu7z1+cBaevWUyvrFiOxa89BEq7c042diKzBQL3tl10pCfhdkl+Xh9RxX2nmjUJb9eDxxy0UE46kYT6anzv1FN1ekW/PPTE7pd49pJQ3DNxEJ8dKQOJ/1DLw6Xx7CfhVljfePomw/FTn821ICuAKwRkW0islCPBsWjp97dr3vdaCI9Bapt3urx6v5vNNBmzkb9LBRkpWJcoTWm0hdDHXKZpZSqEpECAGtFZL9SamPnE/yBfiEAjBih/+RItNQ3u7H+QDXW7j2F4w2tAc+JRE4sUTAilbd9IsE+C7NL8vHHLRVobWvvV8pnuIQU0JVSVf6v1SLyOoDpADZ2OWcZgGUAUFpaGptFhIP0eV0z1uw9hbV7T+Ljo6fR7lWwWVOQnmxGs7u92/mRyokl6suQ7NSAHQ+9/40OzUkLuDGGUT8Ls0ry8eLmI/joSF2P5RIiacABXUQyAJiUUk3+768B8CPdWhYDlFLYVdWAtXtPYe3eU9h/sgkAcE5hJu6/bDTmTByM84uy8eYnx7H4tV1n/Zc21WKKWE4sUV8uHJWHN3aevR9nOPK2F80d1+2zEMn88EibMWoQks0mbD5UG98BHUAhgNf9y4QtAF5VSr2rS6uiyOVpx5bDdVi79yTe21uNk42tMAlQWpyHx74wAXMmFmLkoLOr0Gkz+J0zCL42a5QhZ/Yp/jS0tGHDwRqMG2yFo9UT1kyszp+FRMj4Sks2Y9rIXGw8WINHr5sQ7eYMPKArpQ4DmKxjW6KmobmtYzx8w8EaOFwepCebcWmJDXMmFuLK8QXIzei95rKWE9va1o6LnlyHihjeGZwSywsbPkN9cxteuXdGRNLropkfHg2zz8nHU+8eQE2TCzZr5DbbCMTwG1z0lB/+eV0z3tvnG0r56EgdPP7x8C9OHoI5EwtxyZj8AU1ypCaZ8eWpw/CHD46iuqkVBdbUMPxURME52dCKlzcfwfwpQ2MmV9poZo+14SkcwL8O1Ub9F5mhA7qWe6uN51XVt+A7Kz/BU+/u75ggKinIxMJLR2POxEJMHpajy4qv22eMwIubj2Bl2TE8cMXYkN+PaKCeW3sQSgEPX2PMMexYcO7QLOSmJ2FTOQN6WAXKvfV4FWodbnz/Ot94eNddWfQwxpaJS8YMwqtbK3H/ZWNgjpFlwZRYyk81YeW2z/HVS0ZheF56tJtjWCaTYObYfGwqr4FSKmIbVgdsS9SuHAE95b62tXtx36WjwxLMNXfOGImq+hZsPBg7iw4osfzs3QPISLbgwSv5v8Rwm12Sj+omF8qrHVFth6EDek8TFJHIiZ0zsRD5mSlYsbUi7Nci6urjo3V4b98p3H/5GOT1MaFPoZtV4ktZjHY5XcMG9KbWtoDHI5UTm2wx4SsXDsP7+6sDLrQgChelFJ58ex8KrCn42szet5MjfRTlpGF0fgY2R7kMgCEDuter8NBfdsLudOOBK8ZErWbybReOgALw148qI3I9IgBYs/cUtlfW49tzztF12zfq3eySfGw5XAeXp/uq8Ugx5KToz9cexLr91fjRDefi7ouLsWju+Ki0Y3heOi4/x4a/fPw5/uOqEiSZDfn7k2KIp92Lp97djzG2DNwybVi0m5NQZpXYsPzDCmyvqMfFYwZFpQ2GizBvfXocv1l/CLddOBwLLhoZ7ebgzhkjUd3kwrp9p6LWhlU7qjBz6fsY9cg/MXPp+4YsZUo+K7cdw2c1Tnx33nhY2IGIqItG58FsEmw+FL1hF0P9je893ohFKz/FtJG5ePyGc6OaPqS5fJwNQ7JTsWJrdIZdWKs9cTS7PXhu7UFMG5mLayYWRrs5CceamoSpI3KiOjFqmIBe53Tjvj+WITstCc/fNRUpltgYO7SYTbjtwhHYVF6LCrsz4tcPlItv1PrUie7lzUdQ3eTC4mvHx0RnJhHNGmvDrqoGnHa6o3J9QwT0tnYvvrliG2ocLvxuwbSYW27/lQuHw2wSvBrhyVGlVI8ZNkatT52o6pxuvLDhMOZMLERp8cA2fKbQzSrJh1LAB5/Zo3J9QwT0J97aiy2H67D0pkmYPDwn2s3pZnB2Kq6eUICVZcciNgN+pNaJu1/+qMfnUywmHDvNAmJG8ev3y9Hs9uB787jEP5omD8uGNdUStXH0uA/of/24Ess/rMB9s0fhpqmxO6t/54yRqHO68e7uk2G9TmtbO37x3kHM/cVG7Kysx81Ti5BqOfuv2WISeBUw5+cb8cKGz9DW7g1rmyi8Pq9rxitbKnBr6XCMLbBGuzkJzWI24ZIxg7DxYC2Uivx+PnEd0LdV1OGxVbsxuyQf35sXndTEYM0am48ReelhnRzdXF6La3+5Cb94rxxzzx2MdQ9fhmdvnYKlN59/Vi7+M7dMxvpFl2NWST6WvrMfX/jVJnx8tC5s7aLwembNAZhNgoeuPifaTSH40her6ltwNAoltOM2D/1EQwu+/qftGJqTht/cPjXmU7RMJsEdM0Zg6Tv7UX6qCSWF+vWkqpta8cRb+/DmJ8dRPCgdf7p3OmaXnNk9paf61L+/uxRr957Ckjf34JYXPsStpcPwyLUTuFQ8juyuasAbO4/jm5ePweDs2Jo7SlSzx+YDADaX12BUGOtFBRJXAV2rbV5V34Iks8Akglfvm4Hs9KRoNy0ot0wbhmfXHMCKrZVY8qVzB/Qeneu7D8lOxcVjBmHN3lNwtXnxratK8I3Lx/SrjvuciYWYOXYQfrXuEF7cdBhr957C4msnwGIWPLvmYNh3nempXr3er4nltoXymqr6FpgEGJ7LaoqxYuSgdAzKSMZP3t6H/35jT0R3bZJIjvOUlpaqsrKyAb22a21zAEg2m/DUl8+Peg3i/vjPP+/A+gPV+OjRq/u9LDvQPQB8e5y+cNc0jLZlhtS2Ayeb8NiqXfj46GmYBPB2+qeRlmTWvWxCoJ+nr+sM5DWx3LZYvgc0MKt2VOHhlZ+gvdMHKNS/HxHZppQq7fO8eAnoM5e+HzAFrygnDf965MpQmxYxWw/b8ZVlW/D0l8/HLaXD+/Xanu7B0OxUfLD4Kl3a5/UqTP3xWtS3dC9upve97unnSbGYMG1kbsDXbKs4DZen+yRuLLctUq+Jt8+CUYUjVgUb0ONmyKWnvOl4y6eePioPYwsysWJrZb8Cem855Sf8uy/pwWQSNAQI5oC+99rr7fnncXm8PWbeBApkerfN0+7VtW2Rek28fRaMKpqxKm4C+tCctMC90wjUNteTiOCO6SPwo7f2YndVQ1D7PFbYnfjBG3t6fF7ve9DTvU5JMqGqvgVFIV5v34lGfP/1XT0+X5SThpX3XxLwuZ56P6lJZl32cN35eb3ubYvUa+Lts2BU0YxVsZ0a0smiueOQ1mWyL1K1zfV289RhSLGY+lw56vK041fryjHnuY3YXnEaN13QPac8HPcg0L22mATtXoWrn92AZRsHlrvudHnw07f34fpfb8ZRezPumD6i3z9PT21zt3tx1bMb8KctFWeNXQaroaUNj63ahRt/+y/UOlz46iXFurQtVl5DkRPNvx/zkiVLwn4RzbJly5YsXLhwQK8dPyQLw3LTsKuqAY5WD4py0vDfX5wYl5NAqUlmVNib8dYnx3HPJcVItnT/vfrBoVrcu7wMb+86iXnnDcbLX70QN08bhmG56WG/B4Hu9eNfOheLr52Aw7UOLP+wAmv3nsKEIdZh4Yl4AAAGmUlEQVSgex1r9pzEvX/4GP93sAZfKR2OZQtKcf3kof3+eXpq26K547D3RCOWf1CBDQdrMKkoGwVZfffWlVJ4Y+dx/PvyMnx0pA5fvaQYz981DXPPHaxL22LlNRQ54fj7efzxx08sWbJkWV/nxc2kqNHsqDyNG3/7AZ6Yfx7u6lTmt6bJhZ++vQ+v76jCiLx0/Hj+ebjsHFsv7xR5a/acxJI39+B4Qytuu3A4vjdvPHJ7yF0/droZS97cg/f2VWP8YCuemH9e2GqNKKXw5ifH8eO39qLO6cY9lxTjv+acA2tq4LTWz2oc+MGq3fjgMzsmD8vGT26cFNQQGFGkGS7LxWiUUpj1s/WobmxFm1dhaHYqZo7Nx+o9J9HS1o5vXDYG37xibL9yyiPJ6fLgl+vK8dLmI8hOS8Kj102AWYBn/LnrQ7JTMW1kLt7bVw0A+PacEvzbzFER2eSjoaUNz6w+gFe2VqDAmoIffvFcuNraz2rbpGHZWL+/BilJJnx33njcMX0EzCZWKKTYxIAe41btqMKilZ+grct4b0lBJp6/axrGFoSWUx4p+0404rFVu7GtonvuOgBMKsrGCwumhTyROhDaBOee440B2zZtRC6eXzA15qpzEnUVbECPm0lRo3l69YFuwRzw9XzjJZgDwIQhWVj59YuRk5bULWACvrKu0QjmADBleA7eeGAmsnto28nG0LNiiGIJA3qU9JSTqmdOeaREKnd9ICxmExpjtG1EemNAj5KeskPiNZc4ln+eWG4bkZ4Y0KPEaLnEsfzzxHLbiPQUNytFjUbLSY1E1cBIiOWfJ5bbRqSnkLJcRGQegF8CMAN4USm1tLfzmeVCRNR/Yc9yEREzgP8BcC2AiQBuF5GJA30/IiIKTShj6NMBHFJKHVZKuQH8BcAN+jSLiIj6K5SAXgTg806Pj/mPERFRFIQ9y0VEFopImYiU1dTUhPtyREQJK5SAXgWg8w4Nw/zHzqKUWqaUKlVKldpssVVkiojISEIJ6B8DKBGRUSKSDOA2AG/q0ywiIuqvAeehK6U8IvIggNXwpS2+rJTqeVsdIiIKq5AWFiml3gbwtk5tISKiEES0fK6I1ACo0OGt8gHU6vA+8Yz3gPcA4D0AEuMejFRK9TkJGdGArhcRKQtm1ZSR8R7wHgC8BwDvQWcszkVEZBAM6EREBhGvAb3P3a8TAO8B7wHAewDwHnSIyzF0IiLqLl576ERE1EXMB3QReVlEqkVkd6djeSKyVkTK/V9zo9nGcBKR4SKyXkT2isgeEfmW/3gi3YNUEflIRD7x34PH/cdHichWETkkIn/1r1g2NBExi8gOEXnL/zih7oGIHBWRXSKyU0TK/McS5rPQl5gP6AD+AGBel2OPAFinlCoBsM7/2Kg8AB5WSk0EcBGAB/x15xPpHrgAXKmUmgxgCoB5InIRgJ8BeE4pNRbAaQD3RrGNkfItAPs6PU7Ee3CFUmpKp1TFRPos9CrmA7pSaiOAui6HbwCw3P/9cgDzI9qoCFJKnVBKbfd/3wTfh7kIiXUPlFLK4X+Y5P+jAFwJ4O/+44a+BwAgIsMAfAHAi/7HggS7Bz1ImM9CX2I+oPegUCl1wv/9SQCF0WxMpIhIMYALAGxFgt0D/1DDTgDVANYC+AxAvVLK4z8lEerx/wLAdwF4/Y8HIfHugQKwRkS2ichC/7GE+iz0Ju43iVZKKRExfKqOiGQC+AeAh5RSjb7OmU8i3AOlVDuAKSKSA+B1AOOj3KSIEpHrAVQrpbaJyOXRbk8UzVJKVYlIAYC1IrK/85OJ8FnoTbz20E+JyBAA8H+tjnJ7wkpEkuAL5iuUUq/5DyfUPdAopeoBrAdwMYAcEdE6JQHr8RvITABfEpGj8G33eCV8G7Qn0j2AUqrK/7Uavl/s05Ggn4VA4jWgvwngHv/39wB4I4ptCSv/OOlLAPYppX7e6alEugc2f88cIpIGYA58cwnrAXzZf5qh74FSarFSaphSqhi+vQfeV0rdiQS6ByKSISJW7XsA1wDYjQT6LPQl5hcWicifAVwOX0W1UwB+CGAVgL8BGAFf9cZblVJdJ04NQURmAdgEYBfOjJ0+Ct84eqLcg/Phm+wyw9cJ+ZtS6kciMhq+3moegB0A7lJKuaLX0sjwD7l8Ryl1fSLdA//P+rr/oQXAq0qpn4jIICTIZ6EvMR/QiYgoOPE65EJERF0woBMRGQQDOhGRQTCgExEZBAM6EZFBMKATERkEAzoRkUEwoBMRGcT/A0Czti8WeJzgAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
      " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + "\n", + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)\n", + "\n", + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", + "

      \n", + "
      \n", + " $$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", + "
      \n", + "

      \n", + "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 26, 12: 25, 50: 20, 54: 13, 16: 13, 10: 12, 14: 10, 48: 10, 20: 10, 18: 8, 44: 7, 36: 7, 46: 6, 24: 4, 26: 4, 28: 4, 38: 4, 34: 3, 42: 3, 30: 3, 40: 2, 56: 2, 22: 2, 32: 2})\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl4W9WZP/Dvq8WWLNvyGsuxktjOCrGzQAg7IVBIoKWEMp2W0hZm5oFOS6ctpUyhM512pu0P2nSb+bVlBlqm0AY6UxoMBYJJWROWQBIncULi2FnsWN7keJUty1rO/CFdx3Fka/GV7qL38zx5Ystajm+i19fnfs97SAgBxhhj2mdQegCMMcbkwQWdMcZ0ggs6Y4zpBBd0xhjTCS7ojDGmE1zQGWNMJ7igM8aYTnBBZ4wxneCCzhhjOmFK54uVlJSIysrKdL4kY4xp3p49e3qFEKWx7pfWgl5ZWYndu3en8yUZY0zziKg1nvvxlAtjjOkEF3TGGNMJLuiMMaYTXNAZY0wnuKAzxphOcEFnjDGd4ILOGGM6wQWdMcZ0Iq0LixhjTEl1DS5srm9Cx4AXcwusuH/DUmxaXaH0sGTDBZ0xlhHqGlx4cGsjvP4gAMA14MWDWxsBQDdFnadcGGMZYXN900Qxl3j9QWyub1JoRPLjgs4YywgdA96EbtciLuiMsYwwt8Ca0O1axAWdMZYR7t+wFERn32Y1G3H/hqXKDCgF+KIoYywjrF8656zPK3SYcol5hk5E84jodSL6kIgOEdFXI7d/l4hcRLQv8ufG1A+XMcaS8+7xXggBLHPkwW414+0HrtFVMQfiO0MPALhPCLGXiPIA7CGi7ZGv/UwI8ePUDW/29J47ZYzF563mXuRmm3DTyrnYXN+EoTE/8i1mpYclq5gFXQjRCaAz8vEwER0GoImKmAm5U8ZYfHY29+KS6iJUFtsAAK5+L/LL9VXQE7ooSkSVAFYD2BW56ctEdICIHieiQpnHNmuZkDtljMXWdnoUbX2juGJRCZyF4VRLe79+4oqSuAs6EeUC+BOArwkhhgA8AmAhgFUIn8H/ZJrH3U1Eu4lot9vtlmHI8cuE3CljLLYdLeHac+WS0kkFfVTJIaVEXAWdiMwIF/MtQoitACCE6BZCBIUQIQCPAVgb7bFCiEeFEGuEEGtKS2NuWi2rTMidMsZi23G0F3PtFlSX2FBky4LVbMzMM3QiIgC/AXBYCPHTSbeXT7rbLQAOyj+82bl/w1JYTGd/i3rLnTLGZhYMCbxzrBdXLC4BEYGI4Cy06vIMPZ6Uy+UAPgegkYj2RW77FoDbiGgVAAHgJIAvpGSEs7BpdQWGx/z49nOHAACludn4p4+exxdEGcsgB9oHMDQWwJWLz8wQhAu6/s7Q40m57ARAUb70kvzDkV9NhX3i4x/cUoPrlzsUHA1jLN12NveCCLh8UcnEbc7CHOxtG1BwVKmh+6X/k38Kdw2NKTgSxpgSdjT3YvncfBTZsiZucxZaMej1Y2jMr+DI5JcxBd1AQOcgF3TGMonHF8Detn5csejsQIazMAdAOIuuJxlQ0EdRkGNGud2KLi7ojGWUXcdPIxASuGpxyVm36zWLrvvmXO39XjgLrbCYjFzQGcswO5p7YTEbcGHl2ese9ZpF1/0ZumvAC2dBDhx2C8+hM5ZhdjS7sbaqGNkm41m36zWLruuCLoRAe/8onIVWlNst6Bz0Qgih9LAYY2nQOejFMfcIrlxUcs7X9JpF1/WUy+mRcYz5Q3AWWhEICYz5QxjyBmDP0VdDHsbYuXY09wIArlxybkEH9JlF1/UZuvSP5SzMQbk9PGfWOaSvf0DGWHQ7m3tRmpeNpWV5Ub/uLMzhgq4l0q9TziIrHHYLAI4uMpYJQiGBnS29uGJReLl/NHrMouu8oId/+lYUnCnonHRhTP8+7BxC38g4rogyfy7RYxZd5wU9nEHPs5gxJy8bRFzQGcsEO1si8+eLZyro+sui67ygeyf+0cxGA0pzs7mgM5YBdjS7sbQsD3PyLdPeR49ZdP0X9IKcic/L7RZ0chadMV0b8wfxwcl+XDHD2Tmgzyy6bgv65Ay6pCzfgm4+Q2dM194/0YfxQGjG6RZAn1l03Rb0yRl0ibS4iDGmXztbepFlNODiquKY99VbFl23BX1yBl3isFsxNBbAiC+g1LAYYyn21lE3LlxQCGuWMeZ99ZZF13FBP5NBlzjs2QC4LzpjeuUe9uFI13DM+XOJ3rLoOi7oZzLoEkd++GOeR2dMn96OxBWvWhzfhvR6y6LruKCfyaBLynm1KGO6tqO5F4U5Ziyfmx/X/fWWRddxQfeedUEUwJnVojzlwpjuCCGwo9mNyxaVwGCIvtx/Kr1l0fVd0Cdl0AHAYjaiIMfMi4sY06HmHg96hn1R2+VOR29ZdF0W9GgZdIkj38JTLozpkNQuN94LosCZLDrPoatYtAy6pNxuQRe30GVMd3Y2u1FdYjsrqhwPZ6EV7QM85aJa0TLoEofdgq5BX7qHxBhLIV8giPeO9yV0di7RUxZdpwX93Ay6xJFvRa/Hh/FAKN3DYoylyN7WAXj9QVwZZ1xxMmehFQOjfgzrIIuu04J+bgZdIkUXuznpwphu7Gxxw2ggXFJdlPBjJ7LoA9o/S9dpQT83gy4p4+giY7qzo7kXq+cVRH3PxzIRXezjgq5K0TLoknLeuYgxXekfGUejazCp+XNAX1l0/Rb0guhXunkrOsb05Z1jpyEEkpo/B/SVRdddQZ8pgw4Aedkm2LKMnEVnTCd2triRZzFhpdOe1OOJCBU6aaOru4I+UwYdCP/jldktfFGUMR0QQuCto724tLoYJmPy5UwvWfSYR4CI5hHR60T0IREdIqKvRm4vIqLtRNQc+bsw9cONbSLhMsPiAt7ogjF9OHl6FK4Bb8zdiWLRy0YX8fxICwC4TwhxPoBLANxDROcDeADAq0KIxQBejXyuuIkM+jRn6EA4i85z6IxpW12DC5t++TYA4BevtaCuwZX0czkLc3SRRY9Z0IUQnUKIvZGPhwEcBlAB4GYAT0Tu9gSATakaZCLOnKHPUNDt2ege9iEYEukaFmNMRnUNLjy4tRGD3nAB7h724cGtjUkXdekEUOtZ9IQmnYioEsBqALsAlAkhOiNf6gJQJuvIktTePwq71Yz8GfKoDrsVwZDAaQ+3AGBMizbXN8HrD551m9cfxOb6pqSeT1pcpPUsetwFnYhyAfwJwNeEEEOTvyaEEACinu4S0d1EtJuIdrvd7lkNNh4zZdAl5fm80QVjWtYxzZn0dLfHopcselwFnYjMCBfzLUKIrZGbu4moPPL1cgA90R4rhHhUCLFGCLGmtDS5nGgiXHEUdAfvXMSYps2N0tZjpttjKbZlwWI2aP7CaDwpFwLwGwCHhRA/nfSl5wHcEfn4DgDPyT+8xIQz6N6Y7TMd3M+FMU27f8NSmKbsSmQ1G3H/hqVJPV+4L7r2uy7Gc4Z+OYDPAbiGiPZF/twI4GEA1xFRM4CPRD5XVN/IOLz+YMwz9KKcLGQZDXyGzphGbVpdgVqnHUYDgRBuxPfQJ2qxaXVF0s+phyy6KdYdhBA7AUy3Qd+18g5ndmbqgz6ZwUAos2eji7PojGmWdzyIdUtK8fidF8nyfM5CK/adGpDluZSiq5WiZwp67Hk03oqOMe0KhgSO945g0Zxc2Z5TD1l0nRX08K9LM2XQJQ67lefQGdOoU32jGA+EZC7o2s+i66yge2Nm0CXh5f9jCCcuGWNa0tzjAQDZz9ABbWfRdVbQp++yOFVZvgW+QAgDo9r99YqxTNWSkoKu/Sy6zgp67Ay6pJx3LmJMs5p7huHIt8T123i89JBF101BjzeDLuGNLhjTrmM9HlnPzgF9ZNF1U9DjzaBLynm1KGOaJIRASwoKOqD9LLpuCnq8GXRJaW42DMRTLoxpTefgGEbGg6kr6HyGrrxEMugAYDIaUJrHi4sY0xop4bI4JQVd21l0HRX0+DPoEofdylMujGlMc/cwAHkTLhKtZ9F1VNDjz6BLHPnZfFGUMY055vagyJaF4txs2Z9b61l0HRX0+DPoknK7lefQGdOY5m4PFpXKf3YOaD+LrqOCHn8GXeKwWzA8FoDHF0jRqBhjchJCoLnHg0VlqSnoWs+i66KgJ5pBl5RzFp0xTen1jGPQ60/ZGbrWs+i6KOiJZtAlZfm80QVjWiIt+V+cojN0IDztwhdFFZRoBl3Ci4sY05aWnnDCZfGcvJS9RjiLznPoikk0gy6RztA5i86YNrT0eJCbbUJZvvwJF4mzMAf9o35NXlvTSUFPPIMOABazEYU5Zj5DZ0wjmiNL/sNbHafGRBZdg/PoOinoiWfQJbzRBWPa0ZyiHi6TTWTRNTjtopOCnngGXSJtdMEYU7fBUT/cw76ULPmf7EwWnc/QFZFMBl3isFs4tsiYBrS4U7fkf7IzWXQ+Q0+7ZDPoEke+BadHxuELBGUeGWNMThORxRQmXABtZ9E1X9CTzaBLpI0ueoZ8cg6LMSaz5m4Psk2GhMMPydBqG13NF/RkM+gSzqIzpg0tbg8WlubCaEhdwkWi1Sy6jgp6kmfo+VJB195PY8YySXO3J6UrRCfTahZdBwU9uQy6RJpy4egiY+o14gvANeBNWQ+XqbSaRddBQfci32JKevfvPIsZudkmnnJhTMWOu0cApLaHy2RazaLroKCPJj1/LinjjS4YU7XmnvREFiUVBdrMomu+oLsGks+gS3ijC8bUraXHA5OBsKDYlpbXK8nNQrZJe1l0TRf02WbQJby4iDF1a+7xoLLEBrMxPSUrnEXXXnRR0wW9f9SP0fHkM+iScrsFPcM+BENCppExxuR0rMeT8iX/U2lxcVHMgk5EjxNRDxEdnHTbd4nIRUT7In9uTO0wo5N+HZptQS/LtyAYEuj18OIixtTGFwji5OmRtM2fS7SYRY/nDP23ADZGuf1nQohVkT8vyTus+Mx2UZGEFxcxpl4ne0cREum7ICrRYhY9ZkEXQrwFoC8NY0nYbDPoEoedN7pgTK2a07BLUTRazKLPZg79y0R0IDIlUyjbiBIgZdDt1uQy6JIzq0X5DJ0xtWnu9oAIqC5NT8JFcqaNrnamXZIt6I8AWAhgFYBOAD+Z7o5EdDcR7Sai3W63O8mXi06OhAsAFNmykGU0cHSRMRVqcXswvygHFrMxra97ZnGRzs/QhRDdQoigECIE4DEAa2e476NCiDVCiDWlpaXJjjOq2WxsMRkRcXSRMZVq6fakbcn/ZFrMoidV0ImofNKntwA4ON19U0WuDLrEwTsXMaY6gWAIJ3pHsChNS/4n02IW3RTrDkT0NICrAZQQUTuA7wC4mohWARAATgL4QgrHGJVcGXSJI9+C/e0DsjwXY0webX2jGA+GFDlDB7SXRY9Z0IUQt0W5+TcpGEtC5MqgS8rtFrx8aAxCiJTuKM4Yi9/ELkVl6U24SJyFVhzQ0ImeZleKypVBlzjsFowHQugf9cvyfIyx2WuOFPSFaU64SLSWRddwQZcngy7hjS4YU5+WHg/K7RbkJdkee7a0lkXXcEGXJ4Mu4Y0uGFOflh5P2leITqa1LLqmC7pc0y1AuIUuwIuLGFOLUEiooKBrK4uu4YIuTwZdUpKbBQOBs+iMqUTHoBdefzDtS/4n01oWXZMFXe4MOgCYjAbMyePFRYyphXRBVMkzdK1l0TVZ0OXOoEscdgsv/2dMJY5JkUUFCzqgrSy6Jgu63Bl0STmvFmVMNZq7PSi2ZaHQlqXoOJyFVrgGtFHQYy4sUiO5M+iSsnwLdjb3JvXYugYXNtc3oWPAi7kFVty/YSk2ra6QdXyMZZIWt7IXRCWDXj/6RsZR+cCLqFD5e1vTZ+hyZdAl5XYLhn0BDI8ltriorsGFB7c2wjXghUB44+oHtzairsEl6/gYyxRCCDR3Dyte0OsaXKg/1DXxudrf2xot6PJm0CXJZtE31zfB6w+edZvXH8Tm+ibZxsZYJnEP+zA0FlB8/nxzfRP8wbP3Glbze1uzBV3u6RYg+Y0uOqaZX5vudsbYzFomEi7KRRYB7b23NVrQ5c2gS6TFRYlGF+cWRB/LdLczxmbWPNGUS9kzdK29tzVX0FORQZfMyc8GkHhBv+OyBefcZjUbcf+GpbKMi7FM09LjQZ7FhDl52YqO4/4NS2GdslOSmt/bmivoqcqgA4DFbESxLQudCc6h7zs1gCyTYWLKhgj4/qYa1V4JZ0ztmnvCF0SVbmW9aXUFHvpE7URRryiw4qFP1Kr2va25gp6qDLqkLN+C7gTO0Bva+vFSYxe+uG4h3vvWtfivz10IIcLPwxhLTkvPiOIXRCWbVlfg79ctBBHw6n3rVFvMAY0V9LoGF+58/AMAwD/XHUxJdCiRxUVCCDy07QhKcrNw11XVAIB1S0qRk2XEtoOdso+NsUzQPzKOXo9P8cjiZFWlNggR3kFJzTRT0KWsd9/oOACgZ9iXkjxoIsv/X2/qwfsn+vCVaxcjNzu8RstiNmL9sjmoP9SNYEjEeAbG2FQtbmnJv7IJl8mqisMbbBx3jyg8kplppqCnK+vtyLegb2QcY1Nea6pgSOCH25pQWZyD29bOP+trN9Q40OvxYU9rv6xjYywTtKigKddUlSXhEMaJXi7oskhXHlRaXNQz5Jvxflv3tqOpexjf2LAUZuPZh3H90jnINhnwUiNPuzCWqOZuDyxmAypUFA3Ms5hRmpeNE70epYcyI80U9HTlQc9sdDH9D4oxfxA/3X4UK512fLS2/Jyv27JNuGpJKeoPdSHE0y6MJaTF7cHC0lwYDOrarL2qxMZn6HJJVx5UOkOfaR79iXdOonNwDN+8Ydm0saobahzoHBzDfg3tGM6YGrR0D6sm4TJZVbENJ3r5oqgspDxoRYEVhNTlQScK+jRJl4HRcfzy9RZcvbQUly0smfZ5rj2vDGYj4eWDXdPehzF2No8vgI7BMSwuU88FUUlVqQ29Hh+GEmzel06aap+7aXVFyjOgudkm5GWbpo0uPvLGMQz7AvjmxmUzPo/dasZlC0uw7WAXHpjhTJ4xdoa0qcXCUhWeoZeEky4ne0ewwlmg8Gii08wZejo57NG3onMNePHf75zELasrcF55fsznuaHGgba+UXzYOZSKYTKmOy0q6eESTXWkoKt5Hp0LehQOuyXq8v+fbT8KALjv+vjm7a87vwwGAk+7MBan5h4PzEbCgiL5ezXN1vziHBBxQdccR5Tl/0e6hvCnve2449IFccepinOzcXFVMccXGYtTS88wqkpsMBnVV5qyTUZUFFi5oGtNud2CnuExBIKhidt+9HIT8rJNuGf9ooSe68ZaB465R9DcPSz3MBnTnZYedWw7Nx21Rxe5oEdRZrcgJAC3J7y46L3jp/HakR58af0iFOQktmHthuUOEAHbeNqFsRmN+YNo6xtVfFOLmVSX2HDCPQIh1Lm+hAt6FOWTootSA65yuwV3XlaZ8HPNybfgwvmFXNAZi+FE7whCQl1L/qeqKrFh2BdAr2dc6aFExQU9Ckf+mZ2Lth3swv5TA7j3uiWwTFnYFK+NNQ4c7hxC62n1/qrGmNImdilScUGvlKKLKn0vxyzoRPQ4EfUQ0cFJtxUR0XYiao78XZjaYaaXdIbe3u/F5vomLCnLxa0XOJN+vo01DgA87cLYTFp6PDDQmby3GlWXhH/YnFBp18V4ztB/C2DjlNseAPCqEGIxgFcjn+vGG009AIAfvHQYJ3pHsG5JKYyz6CvhLMzBCqddloJe1+DC5Q+/hqoHXsTlD7+Wkp7wjKVbXYMLj751DCEBXPuTN1X7/7qi0AqzkXBcpRdGYxZ0IcRbAPqm3HwzgCciHz8BYJPM41JMXYML33r24Fm3/e7d1ln/B9tY48D+UwNwzaI7pNQT3jXghUB4oVMqesIzlk7S/+sxfzhVpub/10YDYUGxTbVdF5OdQy8TQkjh6i4AZTKNR3HR+q6PBUKz7rt+Q024K+NsFhmlqyc8Y+mktf/XlcXqjS7O+qKoCOd3ps3wENHdRLSbiHa73e7ZvlzKparvelWJDcsceXh5FlvTpasnPGPppLX/19WlNpw8ParK1tjJFvRuIioHgMjfPdPdUQjxqBBijRBiTWlpaZIvlz6p7Lu+scaB3a396BmOfxPqyUpys6PeLndPeMbSKV17HcilqsSG8UAIHTPsmaCUZAv68wDuiHx8B4Dn5BmO8lLZd/3G2nIIAdQf6k74sac9PgRCIUy9NJuKnvCMpdPfXF55zm1q/n9dpeImXfHEFp8G8C6ApUTUTkR/B+BhANcRUTOAj0Q+14VU9l1fPCcX1aW2hKdd/MEQvrhlL0bHg7j3uiVw5IdjlfkWU0p6wjOWTr2ecRgo3EMplXsdyEXNXRdj9kMXQtw2zZeulXksqpGqvutEhBtqHPjPN4+jb2QcRbb42gh874UP8f6JPvz8U6uwaXUFvnLtYlz5o9ewwlmg2v/0jMVjPBDCH3efwkfOK8Ojn1+j9HDiUpqXDVuWUZUFnVeKptkNNeUIhgS2fxhf2uXp99vw5LutuPuq6rOK94qKAjS2D6ZqmIylRf2hLpweGcftlyxQeihxIyJUqrRJFxf0NFs+Nx/OQmtci4x2n+zDvzx3EFcuLjlnh6Rapx1tfaMYGFVnTwnG4rFlVyvmFVlx5aLpt3NUI7V2XeSCnmbStMvbLb0Y9E6/N2HnoBd///u9qCiw4he3XXDOStUVFXYAQKOLz9KZNrX0ePDe8T58Zu0CGGaxElsJ1SU2nOobxXggFPvOacQFXQEba8rhDwq8diR62mXMH8QXfrcHY/4gHvv8GthzzOfcZ3mkoB/gaRemUU/taoPZSPjkmuT7JCmlssSGkADa+kaVHspZuKArYPW8ApTlZ2Nb47nTLkIIPLi1EQfaB/GzT62advdzu9WMyuIcnkdnmjTmD+KZPaewYblj2vUVajZ5w2g14YKuAIOBsHG5A28edWPEFzjra7/ecQLPNrhw33VLcN35M3dUqHUW8JQL06QXDnRiaCyA2y/WzsXQydSaReeCrpCNNeXwBUJ4o+lMO4S3jrrx0LbDuLHWgS9fE3uruxUVdrgGvOiN7KzEmFZs2dWK6lIbLqkuUnooSSnIyUKRLUt1XRe5oCtkbVURim1ZeCmyyOhk7wi+/NReLCnLw+a/Wgmi2BeJap18YZRpz6GOQTS0DeD2ixfE9f9crcJJF3V1XYy5sIilhtFAWFKWh5cOdKLywIswGQjZJgMe+/wa2LLj+2dZPjcfREBj+yDWL52T4hEzJo+ndrUh22TArRdoe1FcZbENO1vU1XCQz9AVUtfgwp7W/ok2lYGQgD8osKe1P+7nyLOYUV1i46QL0wyPL4C6Bhc+tmJuwhuuq011qQ3dQ75zroMpiQu6QjbXN2E8eHaGdTyYeN/1Fc4CNLoG5BwaYynz3D4XRsaDuP2S+UoPZdaqVLi/KBd0hcjVA7q2wo7uIR+6h5JryctYugghsOW9NpxXno/V8wqUHs6sqTHpwgVdIXL1gF4hXRjlaRemcvvbB/Fh5xBuv3i+pi+GSiqLIwVdRRtGc0FXiFx918+fmw8DAQc46cJUbst7rcjJMuLmVXOVHoosrFlGlNstOKGiKRdOuShE6py4ub4JHQNezC2w4v4NSxNuh5uTZcLiOXlobOd5dKZeg6N+/PlAB25Z7USe5dxWFlqltiZdXNAVJFff9VqnHW809UAIoYtfZZn+bG1ox5g/hNsv1v7F0MmqSmx4sTH5fYLlxgVdB1Y47XhmTzs6B8dUuw9jpqhrcM36ty41keP7EUJgy642rJxXgJpIUzm9qCqxYWDUj/6RcRTGuWFNKvEcug7UcudFVahrcOHBrY1wDXghALgGvHhwayPqGlxKDy0pcn0/75/oQ0uPR3dn58CZpItaWgBwQdeB88rzYTIQ59EVtrm+CV5/8KzbvP5gwmsL1EKu72fLrjbkWUy4aYU+LoZOpraui1zQdcBiNmJJWR4aXUNKDyWjybW2QC3k+H56PT5sO9iJWy9wwppljP0AjZlXlAOjgVRzYZQLuk6scNrR2D4AIUTsO7OUkGttgVpMN25btgne8WDUr031zJ52+INCl9MtAGA2GjC/KIcLOpNXrdOO/lE/2vu1eTaoB/8QpeWxxWRIeG2BWtx1ZdU5txmJ4PEFcP3P38TrR3pmfHwoJPDUrjasrSqadqMWPagszuE5dCavWt5jVHHByG9HpZN24Ll0YbFmUy6D3nDTqbK8bBCAigIrfvLXK/H0XZcgy2jA3/z2A3zx93vQORj9JGJnSy/a+kZ1e3YuqSrJxcneEVX8dsyxRZ1Y6siD2Ug40D6IG2vLlR5OxhFC4PeRPiUvfeUKEBHu+9/9+POBDrgGvKjQ2LRLIBjCHz5ow1VLSvHk36495+vbvnoVHttxHP/xajPeOurGvdctwZ2XVcJkPHOO+NSuNhTZsrCxxpHOoaddVakNXn8Q3UM+OOwWRcfCZ+g6kW0yYpkjn5MuCtl3agCHp/Qp+fr1SwAAP33lqJJDS8rrTW50Do7hM2ujn11nmQy4Z/0ibL93HS6qKsL3XzyMm37xNva29aOuwYVL/t+rePlQF8YDoah75+pJ9UR0UfnNLrig60it044D7YOq+NUv02zZ1QZblvGs6ZWKAivuvKwSWxvacaRLWwmkLbtaUZafjWvPm3njlPnFOfjvOy/CI7dfgP6Rcdz6q3dw3x/3oyvS/dPjC2g6ix8PNXVd5IKuIysq7BgeC6D19KjSQ8kog6N+/Hl/Bz6+qgK5U3ab+tLVC5GXbcIPtx1RaHSJO9U3ijePuvGpi+bDbIxdIogIN9SW4y/3rUNOthHB0NknFFrO4sfDkW9Btsmgiq6LXNB1RNpjlDsvptfWhnb4AtH7lBTkZOFL6xfh9SY33j12WoHRJe4PH7SBAHz6onkJPS4324RRX/Q4o1az+PEwGAhVJTZVbHTBBV1HlpTlIctk4M6LaRRPn5I7L6tEud2Ch7cdVv102HgghP/5oB3XLCtLKj+vtyx+vKpKbKqILnJB1xGz0YDzy/O5p0saxdOnxGI24t7rlmB/+yBeUvkFwu0fdqPX40t6izi5+vxRjFU9AAAPIElEQVRrTVWJDW2nRxGYsq1kunFB15kVTjsOugYRCqn7TFAv4u1TcusFTiwpy8Xm+iPwK/ymn8mWXa1wFlpx1eLSpB6/aXUFHvpELSoKrBPZ9Yc+UavZLH68KktsCISE4gv7ZpVDJ6KTAIYBBAEEhBBr5BgUS15thR1PvtuK470jWDQnV+nh6JrUp+T2ixfE7FNiNBC+uXEZ/u6J3fjD+2343KWV6RlkAo65PXjn2Gncv2EpjIbk++rL1edfS6onJV0qIx8rQY4z9PVCiFVczNVhhTO8+S7n0VMv0T4l1yybg7VVRfj3V5sx4gukeHSJe3pXG0wGwl+vSexiKFNPdJGnXHRmYakNVrOR59FTLJk+JUSEB25Yhl7POB7bcTzFI0zMmD+IZ/a2Y0ONA6V52bEfwM5SZMtCvsWk+YIuALxCRHuI6G45BsRmx2Q0YPncfDRyQU+pZPuUXDC/EDfUOPDYW8fhHvalaHSJe6mxEwOjft33XUkVIkJVaa7mC/oVQogLANwA4B4iumrqHYjobiLaTUS73W73LF+OxaPWacehjiHFr7jr2ZZdrUn3KfnGhqUYC4Tw/19rTsHIkrNlVxuqS2y4tLpY6aFoVlWx8m10Z1XQhRCuyN89AJ4FcE4XHyHEo0KINUKINaWlyV05Z4lZ4bTD6w/imApWrulR1+AY/nK4B5+80IlsU+KbNiwszcWnL5qHp3a1qWKnm8OdQ9jT2o/PTOpDwxJXVZKLjkEvxvzx9YpPhaQLOhHZiChP+hjA9QAOyjUwlrzaivCF0QO8wCgl/ueDUwiGBG6bpnFVPL567WKYjQZsfkX5JfFP7WpDlsmAWy9wKj0UTasqtUEIKNp6YzZn6GUAdhLRfgDvA3hRCPGyPMNis1FdYoMty8i90VNAait75eKSWcXT5uRbcNeVVXjxQCf2n1LuB++IL4BnG1z4WG25Knat17Iz0UXlui4mXdCFEMeFECsjf5YLIX4g58BY8gwGQk2FnZMuKfBGpK2sHBcP77qqGkW2LDy87YhiLQH+vL8DHl8g6ZWh7IzKiTa6yk2j8QYXOrXCaccT77bCHwzF1TFvqroGFzbXN6FjwIu5BVbcv2FpzMUi6XqMkrbsasWcvGxce17ZrJ8rz2LGV65ZhO/++UOs+f5f0DcynvZjsGVXG5Y58nDB/MK0vJ6e5WabUJqXrWjXRc6h61RNhR3jgRCOdg8n/Ni6Bhce3NoI14AXAoBrwBuzp3W6HqOkU32jeOOoG5++aF5SPySjyc02gQCcHhlP+zE40D6ARtfgWZtysNlRuusin6Hr1MSK0fZBLJ8bvQvgdDbXN8E75Uq91x/EN/90AH/ccyrqY3af7IcvEJLlMZvrm1R5li61lf3ULC6GTvWzvzRj6mRLuo7BlvfakDNlUw42O9UlNvzlcLdir88FXacWFOUgz2LCAdcgPp3gY6frXe0LhODzR8+2Ty3Ms3mMGntnn2krO0fW/UGn+15TfQwGvX48v78Dm1bPRZ7FnNLXyiRVJTb0esYx6PXDbk3/ceWCrlMGA6G2wp7UitHi3Cz0esbPub2iwIpnvnhZ1Mdc/vBrcEUpQsk8xmI2omdoDHPyld1wd7KJtrIXL5D1eecWWKMeg1T3D69rcMHrD+Iza+X9fjKddGH0ZO8IVs4rSPvr8xy6jtU67TjSNQRfIP6FDu39oxjzhzB1RjVWT+tk+mBHe4zJQPAHQ7j2J2/iiXdOnrOdmVK27GpFRYEVVy2Rd3FctGNgIODejyyW9XUmC2/K0YqVTvvELldMHlJ0Ual5dC7oOraiogD+oMDRrvhysd7xIO5+cg8IwAM3LEuop3UyfbCjPebHn1yJ7V9fh1XzC/Cd5w9h0y/fVrwvjdRW9ra182bVVjaaqcegMMeMkAD2pXBR2O7Wfhzt9uAz3LdFdvOLc0AEHFco6cJTLjq2YmKP0YGYZ2JCCNz/zH4c7hrC43dchPXL5uAL6xYm9HrJ9MGe7jFP/u1avHCgE//2woe4+Zc78blLFuC+DUuRr8B8b6rbyk49Bg9tO4z/evM4zi+3p6TobnmvFXnZJty0cuZNOVjisk1GOAutivV04YKuY85CKwpyzOEz3Itnvu8jbx7DCwc68c2Ny7B+2Zz0DHAGRISbVs7FuqWl+El9E558rxUvHezCv3zsfASCIfz4laMpz67XNbjwo5ePoGNwDBazAe8cO52WRMg/bliGI53D+M7zB7G4LBcXVRbJ8rx1DS48vO0IuobGYMsy4pVD3ZxwSYHKYptiBZ2nXHSMKHxhNNaK0deP9GBzfRNuWjkXf7+uOk2ji0++xYx/vbkGz91zORz5FvzD0w2474/7U55dlzLyHYNjAIAxfyht+XCjgfAft62GszAHX/z9HlkSL9L30zUU/n5GxoOqzvxrWXVJuKArsfqXC7rOrXDacbR7eNoOcMfcHnzl6QacX56PH926QrULTFY4C1B3z+WwW8NzzJNJuW05TZfFl/t1pmO3mvHY5y/EmD+Eu3+3G97x2XXwU/r7ySRVJTZ4fIGoSbFU44Kuc7UVBQiEBA53Dp3ztUGvH3c9sRtZJgMe/fyamPtiKs1oIAx5/VG/JmduOxAMRY0Syv06sSyak4eff2oVDnUM4YGtB5I+4/MFgqr4fjJFVWl4L18lpl24oOucdGF0aufFYEjga39oQFvfKH51+wWyLpZJpeny2RazET3DY7N+/n2nBvDxX7yd8OunykfOL8M3rl+K5/Z14NG3Et+27u2WXtzw8x3Tfj3d308mULLrIhd0nSu3W1CSm3XOPPqPX2nC601ufPfjy3GxhnapmS67Ph7Jrv/uvdaksuuDXj/+ua4Rt/zqbZwe8eHOyyphMZ399oiVq0+VL129EB+tLccPXz6CN5p64nqMe9iHr/2hAbf/eheCQuALV1UnvE6AJWdugRVZRoMiXRc55aJz0oXRyVnuP+/vwCNvHMNta+fjs5doa6WglMqY2qFxhdOObz93EN+uO4hn9rTjB5tqUFMRe9GMEALP7evA91/8EH0j47jzskp8/bolyLOYsWpegSo6QRIRNn9yBY73juAfnm7Ac/dcjurIr/VTBUMCT73fhh+9fAQ+fwhfuWYRvrR+ESxmI84rz1fF96N3RgNhfnGOIl0XKZ1XYtesWSN2796dttdjYT/dfhS/eK0ZB/91A467R/BX//kOauba8dRdlyDLpJ9f0oQQeH5/B773Qrg43zGpOEdzzO3Bt+sO4p1jp7HSaccPbqmN64eAUk71jeLjv9iJIlsW6u65/Jzv66BrEP9UdxD7Tw3gsoXF+N6mGiycpvCz1Lrryd1oPT2CV+5dJ8vzEdEeIcSamPfjgq5/33/hQ/x65wkAgJEIeRYTtn99HUrzshUeWWoMev34cX0Tfh/pXf6dm5bD5w9OZNfL7RbUOu14/Ygb2WYD/nHjMnxm7XzZV4GmwrvHTuOzv9mFZY489I+Mo3NwDA67BYvn5GJnSy+KbFn454+ej5tXzVVtYikT/O1vP8BrR8LTYxUy/DYUb0HnKRedq2tw4ffvtU58HhQCXn8Qb7f06vbXbbvVjO9tqsGtFzrxT8824ktb9sJAmIg7dgyOoWNwDBcuKMQjn70Ac/LU0wQslksXFmPTqrn4094z+fHOwTF0Do7h8oXF+NXtF8Kew90TlVTX4MKOZvfE59JaCQApf8/p5/dtFtXm+iaMTWlT6wuEMiJ/vGpeAZ6bJrsOAF2DY5oq5pJ3j52OevvJ06NczFVgc30T/MGz/8OlK/PPBV3nlOq3rRYmoyEt2fV06hyMHs/U6vejN0q+57ig69x0OeNMyh/r7Rjo7fvRGyX/fbig61wyfcr1Rm/HQG/fj94o+e/DF0V1brrctl4viEajt2Ogt+9Hb5T89+HYImOMqVy8sUWecmGMMZ3ggs4YYzrBBZ0xxnSCCzpjjOkEF3TGGNMJLuiMMaYTXNAZY0wnuKAzxphOpHVhERG5AbTGvGNsJQB6ZXgeLeNjwMcA4GMAZMYxWCCEKI11p7QWdLkQ0e54Vk3pGR8DPgYAHwOAj8FkPOXCGGM6wQWdMcZ0QqsF/VGlB6ACfAz4GAB8DAA+BhM0OYfOGGPsXFo9Q2eMMTaF6gs6ET1ORD1EdHDSbUVEtJ2ImiN/Fyo5xlQionlE9DoRfUhEh4joq5HbM+kYWIjofSLaHzkG/xq5vYqIdhFRCxH9DxFlKT3WVCMiIxE1ENELkc8z6hgQ0UkiaiSifUS0O3JbxrwXYlF9QQfwWwAbp9z2AIBXhRCLAbwa+VyvAgDuE0KcD+ASAPcQ0fnIrGPgA3CNEGIlgFUANhLRJQB+COBnQohFAPoB/J2CY0yXrwI4POnzTDwG64UQqyZFFTPpvTAj1Rd0IcRbAPqm3HwzgCciHz8BYFNaB5VGQohOIcTeyMfDCL+ZK5BZx0AIITyRT82RPwLANQCeidyu62MAAETkBPBRAL+OfE7IsGMwjYx5L8Si+oI+jTIhRGfk4y4AZUoOJl2IqBLAagC7kGHHIDLVsA9AD4DtAI4BGBBCBCJ3aUf4B52e/RzAPwIIRT4vRuYdAwHgFSLaQ0R3R27LqPfCTDS/SbQQQhCR7qM6RJQL4E8AviaEGAqfnIVlwjEQQgQBrCKiAgDPAlim8JDSiog+BqBHCLGHiK5WejwKukII4SKiOQC2E9GRyV/MhPfCTLR6ht5NROUAEPm7R+HxpBQRmREu5luEEFsjN2fUMZAIIQYAvA7gUgAFRCSdlDgBuBQbWOpdDuDjRHQSwB8Qnmr5d2TWMYAQwhX5uwfhH+xrkaHvhWi0WtCfB3BH5OM7ADyn4FhSKjJP+hsAh4UQP530pUw6BqWRM3MQkRXAdQhfS3gdwF9F7qbrYyCEeFAI4RRCVAL4NIDXhBC3I4OOARHZiChP+hjA9QAOIoPeC7GofmERET0N4GqEO6p1A/gOgDoA/wtgPsLdG/9aCDH1wqkuENEVAHYAaMSZudNvITyPninHYAXCF7uMCJ+E/K8Q4t+IqBrhs9UiAA0APiuE8Ck30vSITLl8QwjxsUw6BpHv9dnIpyYATwkhfkBExciQ90Isqi/ojDHG4qPVKRfGGGNTcEFnjDGd4ILOGGM6wQWdMcZ0ggs6Y4zpBBd0xhjTCS7ojDGmE1zQGWNMJ/4P+Q3Vo9sPOf4AAAAASUVORK5CYII=\n", + "text/plain": [ + "
      " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " \n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)\n", + "\n", + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we get a probability distribution that is much more symetric!\n", + "

      \n", + "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index 9f60e42f11b..f945c11cfd0 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -23,11 +23,9 @@ "**Classical Random Walks**\n", "\n", "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $|0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", - "

      \n", - "
      \n", - "$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$\n", - "
      \n", - "

      \n", + "\n", + "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", + "\n", "Where we know:\n", "

      \n", "
      \n", From 0263817598f295e77ecbca956a6f9f0932d906a0 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 12 Aug 2019 16:48:21 -0400 Subject: [PATCH 03/29] QRW2 --- .../random_walk_tutorial-checkpoint.ipynb | 233 +++++++++--------- examples/random_walk_tutorial.ipynb | 233 +++++++++--------- 2 files changed, 234 insertions(+), 232 deletions(-) diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb index f945c11cfd0..e75d0224727 100644 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -27,114 +27,106 @@ "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", "\n", "Where we know:\n", - "

      \n", - "
      \n", - "$|\\text{Final}\\rangle \\ = \\ |\\text{Initial} \\ + \\ j\\rangle$\n", - "
      \n", - "

      \n", + "\n", + "\n", + "$$|\\text{Final}\\rangle \\ = \\ |\\text{Initial} \\ + \\ j\\rangle$$\n", + "\n", + "\n", "So for our case, the final position vector is simply $|j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", - "

      \n", - "
      \n", - "$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", - "
      \n", + "\n", + "\n", + "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", + "\n", + "\n", "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", - "

      \n", - "
      \n", - "$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", - "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$\n", - "
      \n", - "

      \n", + "\n", + "\n", + "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", + "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", + "\n", + "\n", "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", - "

      \n", + "\n", + "\n", "\n", "**Quantum Random Walks**\n", "\n", - "
      \n", + "\n", "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", "\n", - "
      \n", "\n", "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", "$|j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", "\n", - "

      \n", - "
      \n", + "\n", "\n", - "
      \n", + "\n", "\n", "Going back to our original idea of some position vector $|j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", "$H_W$ spanned by the following set:\n", - "

      \n", - "
      \n", - "$H_W \\ = \\ \\{|j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$\n", - "
      \n", - "

      \n", + "\n", + "\n", + "$$H_W \\ = \\ \\{|j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "\n", + "\n", "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", - "

      \n", - "
      \n", - "$H_C \\ = \\ \\{|i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$\n", - "
      \n", - "

      \n", + "\n", + "\n", + "$$H_C \\ = \\ \\{|i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "\n", + "\n", "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $|j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", - "


      \n", "\n", - "
      \n", - "$|0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\ \\text{and} \\ \\ |1\\rangle \\ = \\ |\\downarrow\\rangle$\n", - "
      \n", - "

      \n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as\n", - " $|i\\rangle \\ \\otimes \\ |j\\rangle$\n", + "\n", + "$$|0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\ \\text{and} \\ \\ |1\\rangle \\ = \\ |\\downarrow\\rangle$$\n", + "\n", + "\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $|i\\rangle \\ \\otimes \\ |j\\rangle$.\n", "\n", "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", - "

      \n", - "
      \n", - "$U \\ = \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j|$\n", - "
      \n", - "

      \n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $|0\\rangle$ and $|1\\rangle$, we know that any possible, general basis state vector formed from qubits\n", - "$|n\\rangle^{\\otimes \\ N}$\n", - " will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is\n", - " $|j \\ \\pm \\ 1\\rangle$\n", - " , depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle$ and we apply the $U$ operator:\n", - "\n", - "

      \n", - "
      \n", - " $U (|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle) \\ \\ = \\ \\Big( \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| \\Big )(|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle)$\n", - " $\\Rightarrow \\ |\\uparrow\\rangle\\langle\\uparrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| 1\\rangle \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| 1\\rangle$\n", - "

      \n", - " $\\Rightarrow \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle \\ + \\ 0|\\downarrow\\rangle \\ \\otimes \\ |0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle$\n", - "
      \n", - "

      \n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector\n", - " $|i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", - "\n", - "

      \n", - "\n", - "\n", - "
      \n", - " $H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H | \\uparrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ + \\ | \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H | \\downarrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ - \\ | \\downarrow\\rangle }{\\sqrt{2}}$\n", - "
      \n", + "\n", + "\n", + "$$U \\ = \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j|$$\n", + "\n", + "\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $|0\\rangle$ and $|1\\rangle$, we know that any possible, general basis state vector formed from qubits $|n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $|j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle$ and we apply the $U$ operator:\n", + "\n", + "\n", + " $$U (|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle) \\ \\ = \\ \\Big( \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| \\Big )(|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle)$$\n", + " \n", + " $$\\Rightarrow \\ |\\uparrow\\rangle\\langle\\uparrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| 1\\rangle \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| 1\\rangle$$\n", + "\n", + "\n", + " $$\\Rightarrow \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle \\ + \\ 0|\\downarrow\\rangle \\ \\otimes \\ |0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle$$\n", + "\n", + "\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $|i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + "\n", + "\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H | \\uparrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ + \\ | \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H | \\downarrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ - \\ | \\downarrow\\rangle }{\\sqrt{2}}$$\n", + "\n", "\n", " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", "\n", - "

      \n", - "
      \n", - " $S \\ = \\ U \\ (H \\ \\otimes \\ I)$\n", - "
      " + "\n", + " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", + "\n", + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - " **Tutorial: Building a QRW With Cirq**\n", - "

      \n", - " Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + "**Tutorial: Building a QRW With Cirq**\n", + "\n", + "\n", + "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -172,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -187,22 +179,24 @@ "metadata": {}, "source": [ "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", - "
      \n", - "
        \n", - "
      1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.
      2. \n", - "
        \n", - "
      3. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:
      4. \n", - "
      \n", + "\n", + "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", + "\n", + "\n", + "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", "\n", "\n", "\n", "\n", "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", - "

      \n", + "\n", + "\n", "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", - "

      \n", + "\n", + "\n", "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", - "

      \n", + "\n", + "\n", "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" ] }, @@ -232,7 +226,8 @@ "metadata": {}, "source": [ "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "

      \n", + "\n", + "\n", "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" ] }, @@ -305,36 +300,41 @@ "metadata": {}, "source": [ "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", - "
      \n", - "
        \n", - "
      1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.
      2. \n", - "
        \n", - "
      3. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.
      4. \n", - "
        \n", - "
      5. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.
      6. \n", - "
        \n", - "
      7. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.
      8. \n", - "
        \n", - "
      9. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.
      10. \n", + "\n", + "\n", + "\n", + "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", + "\n", + "\n", + "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", + "\n", + "\n", + "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", + "\n", + "\n", + "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", + "\n", + "\n", + "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", "\n", "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", - "

        \n", - "
        \n", + "\n", + "\n", "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", - "
        \n", - "

        \n", + "\n", + "\n", "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", - "

        \n", - "
        \n", - " $A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$\n", - "
        \n", - "

        \n", + "\n", + "\n", + " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", + "\n", + "\n", "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", - "

        \n", - "
        \n", - " $$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", - "
        \n", - "

        \n", + "\n", + "\n", + "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", + "\n", + "\n", "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" ] }, @@ -539,11 +539,11 @@ "metadata": {}, "source": [ "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", - "

        \n", - "
        \n", - " $$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", - "
        \n", - "

        \n", + "\n", + "\n", + "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" ] }, @@ -622,7 +622,8 @@ "metadata": {}, "source": [ "So we get a probability distribution that is much more symetric!\n", - "

        \n", + "\n", + "\n", "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" ] }, diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index f945c11cfd0..e75d0224727 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -27,114 +27,106 @@ "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", "\n", "Where we know:\n", - "

        \n", - "
        \n", - "$|\\text{Final}\\rangle \\ = \\ |\\text{Initial} \\ + \\ j\\rangle$\n", - "
        \n", - "

        \n", + "\n", + "\n", + "$$|\\text{Final}\\rangle \\ = \\ |\\text{Initial} \\ + \\ j\\rangle$$\n", + "\n", + "\n", "So for our case, the final position vector is simply $|j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", - "

        \n", - "
        \n", - "$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", - "
        \n", + "\n", + "\n", + "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", + "\n", + "\n", "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", - "

        \n", - "
        \n", - "$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", - "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$\n", - "
        \n", - "

        \n", + "\n", + "\n", + "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", + "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", + "\n", + "\n", "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", - "

        \n", + "\n", + "\n", "\n", "**Quantum Random Walks**\n", "\n", - "
        \n", + "\n", "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", "\n", - "
        \n", "\n", "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", "$|j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", "\n", - "

        \n", - "
        \n", + "\n", "\n", - "
        \n", + "\n", "\n", "Going back to our original idea of some position vector $|j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", "$H_W$ spanned by the following set:\n", - "

        \n", - "
        \n", - "$H_W \\ = \\ \\{|j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$\n", - "
        \n", - "

        \n", + "\n", + "\n", + "$$H_W \\ = \\ \\{|j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "\n", + "\n", "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", - "

        \n", - "
        \n", - "$H_C \\ = \\ \\{|i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$\n", - "
        \n", - "

        \n", + "\n", + "\n", + "$$H_C \\ = \\ \\{|i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "\n", + "\n", "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $|j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", - "


        \n", "\n", - "
        \n", - "$|0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\ \\text{and} \\ \\ |1\\rangle \\ = \\ |\\downarrow\\rangle$\n", - "
        \n", - "

        \n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as\n", - " $|i\\rangle \\ \\otimes \\ |j\\rangle$\n", + "\n", + "$$|0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\ \\text{and} \\ \\ |1\\rangle \\ = \\ |\\downarrow\\rangle$$\n", + "\n", + "\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $|i\\rangle \\ \\otimes \\ |j\\rangle$.\n", "\n", "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", - "

        \n", - "
        \n", - "$U \\ = \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j|$\n", - "
        \n", - "

        \n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $|0\\rangle$ and $|1\\rangle$, we know that any possible, general basis state vector formed from qubits\n", - "$|n\\rangle^{\\otimes \\ N}$\n", - " will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is\n", - " $|j \\ \\pm \\ 1\\rangle$\n", - " , depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle$ and we apply the $U$ operator:\n", - "\n", - "

        \n", - "
        \n", - " $U (|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle) \\ \\ = \\ \\Big( \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| \\Big )(|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle)$\n", - " $\\Rightarrow \\ |\\uparrow\\rangle\\langle\\uparrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| 1\\rangle \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| 1\\rangle$\n", - "

        \n", - " $\\Rightarrow \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle \\ + \\ 0|\\downarrow\\rangle \\ \\otimes \\ |0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle$\n", - "
        \n", - "

        \n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector\n", - " $|i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", - "\n", - "

        \n", - "\n", - "\n", - "
        \n", - " $H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H | \\uparrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ + \\ | \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H | \\downarrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ - \\ | \\downarrow\\rangle }{\\sqrt{2}}$\n", - "
        \n", + "\n", + "\n", + "$$U \\ = \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j|$$\n", + "\n", + "\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $|0\\rangle$ and $|1\\rangle$, we know that any possible, general basis state vector formed from qubits $|n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $|j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle$ and we apply the $U$ operator:\n", + "\n", + "\n", + " $$U (|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle) \\ \\ = \\ \\Big( \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| \\Big )(|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle)$$\n", + " \n", + " $$\\Rightarrow \\ |\\uparrow\\rangle\\langle\\uparrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| 1\\rangle \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| 1\\rangle$$\n", + "\n", + "\n", + " $$\\Rightarrow \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle \\ + \\ 0|\\downarrow\\rangle \\ \\otimes \\ |0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle$$\n", + "\n", + "\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $|i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + "\n", + "\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H | \\uparrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ + \\ | \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H | \\downarrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ - \\ | \\downarrow\\rangle }{\\sqrt{2}}$$\n", + "\n", "\n", " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", "\n", - "

        \n", - "
        \n", - " $S \\ = \\ U \\ (H \\ \\otimes \\ I)$\n", - "
        " + "\n", + " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", + "\n", + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - " **Tutorial: Building a QRW With Cirq**\n", - "

        \n", - " Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + "**Tutorial: Building a QRW With Cirq**\n", + "\n", + "\n", + "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -172,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -187,22 +179,24 @@ "metadata": {}, "source": [ "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", - "
        \n", - "
          \n", - "
        1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.
        2. \n", - "
          \n", - "
        3. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:
        4. \n", - "
        \n", + "\n", + "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", + "\n", + "\n", + "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", "\n", "\n", "\n", "\n", "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", - "

        \n", + "\n", + "\n", "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", - "

        \n", + "\n", + "\n", "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", - "

        \n", + "\n", + "\n", "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" ] }, @@ -232,7 +226,8 @@ "metadata": {}, "source": [ "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "

        \n", + "\n", + "\n", "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" ] }, @@ -305,36 +300,41 @@ "metadata": {}, "source": [ "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", - "
        \n", - "
          \n", - "
        1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.
        2. \n", - "
          \n", - "
        3. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.
        4. \n", - "
          \n", - "
        5. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.
        6. \n", - "
          \n", - "
        7. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.
        8. \n", - "
          \n", - "
        9. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.
        10. \n", + "\n", + "\n", + "\n", + "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", + "\n", + "\n", + "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", + "\n", + "\n", + "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", + "\n", + "\n", + "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", + "\n", + "\n", + "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", "\n", "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", - "

          \n", - "
          \n", + "\n", + "\n", "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", - "
          \n", - "

          \n", + "\n", + "\n", "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", - "

          \n", - "
          \n", - " $A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$\n", - "
          \n", - "

          \n", + "\n", + "\n", + " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", + "\n", + "\n", "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", - "

          \n", - "
          \n", - " $$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", - "
          \n", - "

          \n", + "\n", + "\n", + "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", + "\n", + "\n", "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" ] }, @@ -539,11 +539,11 @@ "metadata": {}, "source": [ "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", - "

          \n", - "
          \n", - " $$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", - "
          \n", - "

          \n", + "\n", + "\n", + "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" ] }, @@ -622,7 +622,8 @@ "metadata": {}, "source": [ "So we get a probability distribution that is much more symetric!\n", - "

          \n", + "\n", + "\n", "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" ] }, From 7f24b294c8ebee2b178a117b7a6a45c120c0b51a Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 12 Aug 2019 16:56:58 -0400 Subject: [PATCH 04/29] QRW3 --- .../random_walk_tutorial-checkpoint.ipynb | 75 ++++++++---------- examples/assets/circ2.png | Bin 0 -> 34563 bytes examples/assets/cycle.png | Bin 0 -> 31484 bytes examples/random_walk_tutorial.ipynb | 75 ++++++++---------- 4 files changed, 68 insertions(+), 82 deletions(-) create mode 100644 examples/assets/circ2.png create mode 100644 examples/assets/cycle.png diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb index e75d0224727..c1697f85cb4 100644 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -22,17 +22,17 @@ "source": [ "**Classical Random Walks**\n", "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $|0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\bigr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", "\n", "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", "\n", "Where we know:\n", "\n", "\n", - "$$|\\text{Final}\\rangle \\ = \\ |\\text{Initial} \\ + \\ j\\rangle$$\n", + "$$\\bigr\\lvert \\text{Final}\\rangle \\ = \\ \\bigr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", "\n", "\n", - "So for our case, the final position vector is simply $|j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "So for our case, the final position vector is simply $\\bigr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", "\n", "\n", "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", @@ -56,54 +56,54 @@ "\n", "\n", "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$|j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "$\\bigr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", "\n", "\n", - "\n", + "\n", "\n", "\n", - "Going back to our original idea of some position vector $|j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "Going back to our original idea of some position vector $\\bigr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", "$H_W$ spanned by the following set:\n", "\n", "\n", - "$$H_W \\ = \\ \\{|j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "$$H_W \\ = \\ \\{\\bigr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", "\n", "\n", "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", "\n", "\n", - "$$H_C \\ = \\ \\{|i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "$$H_C \\ = \\ \\{\\bigr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", "\n", "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $|j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\bigr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", "\n", "\n", - "$$|0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\ \\text{and} \\ \\ |1\\rangle \\ = \\ |\\downarrow\\rangle$$\n", + "$$\\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\bigr\\lvert 1\\rangle \\ = \\ \\bigr\\lvert \\downarrow\\rangle$$\n", "\n", "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $|i\\rangle \\ \\otimes \\ |j\\rangle$.\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\bigr\\lvert i\\rangle \\ \\otimes \\ \\bigr\\lvert j\\rangle$.\n", "\n", "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", "\n", "\n", - "$$U \\ = \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j|$$\n", + "$$U \\ = \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert $$\n", "\n", "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $|0\\rangle$ and $|1\\rangle$, we know that any possible, general basis state vector formed from qubits $|n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $|j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle$ and we apply the $U$ operator:\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\bigr\\lvert 0\\rangle$ and $\\bigr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\bigr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\bigr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", "\n", "\n", - " $$U (|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle) \\ \\ = \\ \\Big( \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| \\Big )(|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle)$$\n", + " $$U (\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert \\Big )(\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle)$$\n", " \n", - " $$\\Rightarrow \\ |\\uparrow\\rangle\\langle\\uparrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| 1\\rangle \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| 1\\rangle$$\n", + " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle$$\n", "\n", "\n", - " $$\\Rightarrow \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle \\ + \\ 0|\\downarrow\\rangle \\ \\otimes \\ |0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle$$\n", + " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle \\ + \\ 0\\bigr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle$$\n", "\n", "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $|i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\bigr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", "\n", "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H | \\uparrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ + \\ | \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H | \\downarrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ - \\ | \\downarrow\\rangle }{\\sqrt{2}}$$\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\bigr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\bigr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ - \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", "\n", "\n", " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", @@ -126,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -164,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ "\n", "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", "\n", - "\n", + "\n", "\n", "\n", "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", @@ -202,7 +202,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -233,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -340,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -384,14 +384,14 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({12: 48, 14: 22, 20: 18, 10: 15, 16: 11, 28: 9, 18: 8, 52: 7, 30: 7, 40: 6, 54: 6, 42: 6, 32: 5, 22: 5, 26: 5, 38: 5, 44: 3, 36: 3, 48: 3, 34: 3, 24: 2, 50: 1, 8: 1, 46: 1})\n" + "Counter({12: 52, 14: 20, 20: 20, 16: 13, 10: 9, 54: 9, 30: 8, 52: 8, 18: 7, 38: 7, 26: 7, 22: 6, 42: 6, 28: 4, 36: 4, 32: 3, 24: 3, 34: 3, 48: 3, 44: 2, 40: 2, 50: 2, 8: 1, 46: 1})\n" ] } ], @@ -424,12 +424,12 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -469,19 +469,19 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 25, 48: 9, 54: 8, 44: 7, 50: 6, 16: 5, 42: 5, 46: 5, 12: 4, 22: 3, 38: 2, 36: 2, 34: 2, 30: 2, 56: 2, 10: 2, 20: 2, 40: 2, 28: 2, 24: 2, 18: 1, 32: 1, 26: 1})\n" + "Counter({52: 58, 50: 22, 54: 14, 46: 14, 48: 14, 44: 11, 12: 8, 24: 6, 16: 6, 42: 6, 10: 6, 34: 5, 40: 4, 36: 4, 32: 4, 28: 3, 22: 3, 38: 3, 8: 2, 14: 2, 26: 2, 18: 1, 30: 1, 20: 1})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl8nNV97/HPT6PVWixrsbwv2GCHBIxBgG0IawE30OBsJClwHQo1EAKkpIBpb169zW0uULInJA0JJG7YG4OhJgF8jUkAA8YbNmAcyxtYlqwNLZY1kiWd/jHPCFmesbbZNPN9v15+aeaZZ+b5zSPPT2fOc87vmHMOEREZ+dLiHYCIiESGErqISJJQQhcRSRJK6CIiSUIJXUQkSSihi4gkCSV0EZEkoYQuIpIklNBFRJJEeiwPVlJS4qZNmxbLQ4qIjHgbNmyoc86V9rdfTBP6tGnTWL9+fSwPKSIy4pnZ3oHspy4XEZEkMaCEbmaFZvZ7M3vfzLaZ2XwzKzKzVWa2w/s5JtrBiohIeANtof8YeN45NxuYA2wDlgKrnXPHA6u9+yIiEif9JnQzGw2cAzwI4JzrcM41ApcDy7zdlgGLohWkiIj0byAt9OlALfAbM9tkZr82s1ygzDlX5e1TDZSFerKZLTGz9Wa2vra2NjJRi4jIUQaS0NOBU4FfOOfmAq306V5xgVUyQq6U4Zx7wDlX7pwrLy3td9SNiIgM0UAS+j5gn3PuTe/+7wkk+ANmNh7A+1kTnRBFRGQg+k3ozrlq4EMzm+VtuhB4D3gWWOxtWww8E5UIRURkQAY6sehm4BEzywR2AdcQ+GPwpJldC+wFrohOiCIi8bFiUyX3vbCd/Y1tTCjM4fZLZrFo7sR4hxXWgBK6c24zUB7ioQsjG46ISGJYsamSu57aStvhLgAqG9u466mtAAmb1DVTVEQkhPte2N6TzIPaDndx3wvb4xRR/5TQRURC2N/YNqjtiUAJXUQkhAmFOYPangiU0EVEQrj9klnkZPiO2JaT4eP2S2aFeUb8KaGLiISwaO5E7v78ST1JPS8rnbs/f1LCXhAFJXQRkbAWzZ3IqVMLAVj4qXEJncxBCV1E5JiqmvwA1B9sj3Mk/VNCFxE5hgNeQq872BHnSPqnhC4iEkaL/zCtHYGx6Gqhi4iMYNVe63zC6GzqWjsIFJZNXEroIiJhVDcHEvonJ46mo7OblvbOOEd0bEroIiJhBC+IfmrCaADqE7wfXQldRCSM4AXRT04oAKAuwfvRldBFRMKoavZTlJvZM90/0S+MKqGLiIRxoMlPWUE2JXmZANSqy0VEZGSqbvYzriCLMbmBhK4WuojICFXd5Gfc6BwyfGmMGZWhi6IiIiNRe2cX9a0djCvIBqA4L0sXRUVERqKa5kDyHj86kNBL8jLVQhcRGYmCk4rKRquFLiIyogWn/Qe7XEqV0EVERqaehB5soedm0uzvpL2z61hPiysldBGREKqb/eRk+CjITgcCXS4ADa2J24+uhC4iEkJ1k5/xo7MxM4CeyUWJfGE0fSA7mdkeoAXoAjqdc+VmVgQ8AUwD9gBXOOc+ik6YIiKxVd0cmCUaFGyh1yZwP/pgWujnO+dOcc6Ve/eXAqudc8cDq737IiJJIdhCDyr1Enoit9CH0+VyObDMu70MWDT8cERE4q+723Gg2d8zZBGg2OtySeSRLgNN6A540cw2mNkSb1uZc67Ku10NlEU8OhGROKhv7aCz2/UMWQTIzUonJ8OX0PVcBtSHDpztnKs0s7HAKjN7v/eDzjlnZiHXZvL+ACwBmDJlyrCCFRGJhb5DFoOK8zITerHoAbXQnXOV3s8a4GngDOCAmY0H8H7WhHnuA865cudceWlpaWSiFhGJouAs0d4tdEj82aL9JnQzyzWz/OBt4GLgHeBZYLG322LgmWgFKSISS9VNbQBHXBQFKE3wei4D6XIpA572xmKmA4865543s7eAJ83sWmAvcEX0whQRiZ3qZj++NOsZqhhUnJvFln1NcYqqf/0mdOfcLmBOiO31wIXRCEpEJJ6qmvyU5WfhS7MjtpfkZ9LQ2kF3tyOtz2OJQDNFRUT66DtkMag4N4vObkdT2+E4RNU/JXQRkT6qm/xHXRAFKMn3Jhe1JuaFUSV0EZE+AkvPhUjo3tqitS2JeWFUCV1EpJcW/2FaO7pCttCDF0nVQhcRGQHCTSqCjysu1rUooYuIJLxwk4oACkdlkmaB0gCJSAldRKSXYAt9/Oicox7zpRlFuVkJO/1fCV1EpJdgQh9bkBXy8ZK8zISd/q+ELiLSS3WznzGjMsjO8IV8vCQvK2ErLiqhi4j0EhiyeHR3S1AiV1xUQhcR6aW62c+4MN0tEJgtqha6iMgI0F8LvSQ/k9aOLto6umIY1cAooYuIeNo7u6hv7Qg5ZDGoJDfQek/EC6NK6CIinprmQJLuWwe9t5L8wOSiRByLroQuIuIJTioKVWkxqDjYQk/A2aJK6CIinp5p/8fqckngiotK6CIinmPVcQkq9iouJuLQRSV0ERFPdbOfnAwfBdnhF3PLzvCRl5Wui6IiIomsusnP+NHZeGsoh1WSoJOLlNBFRDzVzX7KjtF/HlScoNP/ldBFRDzBFnp/SvIyqVcLXUQkMXV3u7CLQ/dVnJelPnQRkURV39pBZ7c75pDFoJK8LBoOddDV7WIQ2cApoYuIMLAhi0EleZk4Bw0JNltUCV1EhGMvPddXcLZook0uGnBCNzOfmW0ys5Xe/elm9qaZVZjZE2aWGb0wRUSiK5jQB3pRFKCuZeS20G8FtvW6fy/wQ+fcTOAj4NpIBiYiEkvVTW340ozivPC10IOC+4zIFrqZTQIuBX7t3TfgAuD33i7LgEXRCFBEJBaqm9opy8/Cl3bsSUUApXnBErojs4X+I+AOoNu7Xww0Ouc6vfv7gIkRjk1EJGaqm9sGNGQRoCAnnQyfJdzQxX4TupldBtQ45zYM5QBmtsTM1pvZ+tra2qG8hIhI1FU3+Qd0QRTAzBJyKbqBtNDPAj5rZnuAxwl0tfwYKDSzYAWbSUBlqCc75x5wzpU758pLS0sjELKISOQFlp4bWEKHxFwsut+E7py7yzk3yTk3DfgK8JJz7kpgDfBFb7fFwDNRi1JEJIpa/Idp7egacAsdErOey3DGod8J3GZmFQT61B+MTEgiIrF1oHngk4qCErHiYviivyE4514GXvZu7wLOiHxIIiKxVTWAlYr6KvHquTjn+i23GyuaKSoiKW8w0/6DSvIyae/s5mB7Z/87x4gSuoikvGBCH0gt9KCe6f8J1O2ihC4iKa+62c+YURlkZ/gG/Jxib/p/Is0WVUIXkZQXGLKYM6jnlHizRWsTqJ6LErqIpLzqZj/jCvqv4dJbSQLWc1FCF5GUd6B58C30otzEq7iohC4iKa29s4u6gx2DGrIIkJmexuicDLXQRUQSRU1zICGPGz24LhcITi5SQhcRSQg9KxUNsssFgotFq8tFRCQhVA9hlmhQSV5mQtVzUUIXkZQ2lDouQSVqoYuIJI6qJj85GT4KsgdV2goIzBZtajtMR2d3/zvHgBK6iKS06mY/40dnD6nAVkl+YOhiQ2titNKV0EUkpVU3+QdVw6W3YD2XRBnpooQuIiltsCsV9VbqtdCV0EVE4qy723mzRIfXQk+UiotK6CKSsupbO+jsdkMasgiJV3FRCV1EUtZwhiwC5GWlk5WeljBDF5XQRSRlDWXpud7MrGcpukSghC4iKSs47X/8EFvokFiLRSuhi0jKqm5qw5dmFOcNvjBXUHFeVsJM/1dCF5GUVd3Uztj8LHxpg59UFJRIFReV0EUkZVU3tw35gmhQoIXegXMuQlENnRK6iKSs6ib/kC+IBhXnZtLZ7WhqOxyhqIZOCV1EUtaB5vZht9BL84PT/+N/YbTfhG5m2Wa2zszeNrN3zexfve3TzexNM6swsyfMLDP64YqIREaL/zAH2zsj0EIPzhaNfz/6QFro7cAFzrk5wCnAQjObB9wL/NA5NxP4CLg2emGKiETWcCcVBZX01HMZAS10F3DQu5vh/XPABcDvve3LgEVRiVBEJAqGO6koqKeFngDT/wfUh25mPjPbDNQAq4CdQKNzrtPbZR8wMcxzl5jZejNbX1tbG4mYRUSGrWfpuWG20ItyMzGDupYRktCdc13OuVOAScAZwOyBHsA594Bzrtw5V15aWjrEMEVEIivY5TLUWuhBvjSjaFQmdQmwyMWgRrk45xqBNcB8oNDMgms2TQIqIxybiEjUVDX5GTMqg+wM37Bfqzgvc2S00M2s1MwKvds5wEXANgKJ/YvebouBZ6IVpIhIpAXqoOdE5LVK8rKoHyEt9PHAGjPbArwFrHLOrQTuBG4zswqgGHgwemGKiERWVZOfcQVDr+HSW6LUc+l3mWvn3BZgbojtuwj0p4uIjDgHmv2cPKkwIq+VKBUXNVNURFJOe2cXdQc7hj1kMagkL4uD7Z34D3dF5PWGSgldRFJOTXOge2Tc6Mh0uZTkJcZi0UroIpJyPp4lGpmLoomyWLQSuoiknEjNEg0qVgtdRCQ+IlXHJagkTy10EZG4qGryk5PhoyC734F+AxJM6HVxrueihC4iKae62c/40dmYDX3pud5yMn3kZvqoa1ELXUQkpqqb/MOu4dJXcV5W3CsuKqGLSMqpbvJHrP88KBEWi1ZCF5GU0t3tqGmJfEIPLhYdT0roIpJS6ls7ONzlIjZkMUgtdBGRGIv0kMWgkrwsGlo76Op2EX3dwVBCF5GUEulJRUHFuZl0O2g8FL9uFyV0EUkp1dFqoed7Y9Hj2I+uhC4iKeVAkx9fmvVMBoqUj+u5xK8fXQldRFJKVZOfsflZ+NIiM6koqDQ/UM+lVgldRCQ2AkvPRba7BRKj4qISuoiklKqmtohfEAUYnZOBL83iOnRRCV1EUsaKTZXsqm3lj+9Uc9Y9L7FiU2XEXjstzSjOzVQLXUQk2lZsqmTp8i0ER4lXNrZx11NbI5rUi/Oy1EIXEYm2+17Yjr+z+4htbYe7uO+F7RE7RkleJnWtaqGLiETV/sa2QW0fipK8LA1bFBGJtvFhRrZMKIzMuqLwcT0X5+Iz/V8JXURSwrmzSo/alpPh4/ZLZkXsGMV5WfgPd3OooytirzkY/SZ0M5tsZmvM7D0ze9fMbvW2F5nZKjPb4f0cE/1wRUQGr6vb8cauBiYW5jBhdDYGTCzM4e7Pn8SiuRMjdpzi3PguFj2QBfU6gW855zaaWT6wwcxWAV8DVjvn7jGzpcBS4M7ohSoiMjR/2FrF7rpWfn7lqXzmpPFRO07vei5Ti3Ojdpxw+m2hO+eqnHMbvdstwDZgInA5sMzbbRmwKFpBiogMVXe34/41FcwozWXhJ8dF9VglucGEHp8W+qD60M1sGjAXeBMoc85VeQ9VA2URjUxEJAJWv1/D+9UtfP28maRFuH5LXyVePZd4TS4acEI3szxgOfBN51xz78dc4JJuyMu6ZrbEzNab2fra2tphBSsiMhjOOX62poLJRTl89pQJUT9eUW4woSdwC93MMggk80ecc095mw+Y2Xjv8fFATajnOucecM6VO+fKS0uPvsosIhItr1XU8/aHjdxw7gwyfNEf1JeV7qMgOz1xu1zMzIAHgW3OuR/0euhZYLF3ezHwTOTDExEZup++tIOygiy+eNqkmB2zJC8rbrNFB/In6yzgauACM9vs/fsMcA9wkZntAP7Kuy8ikhDW72ngzd0NLDlnBlnpvpgdtzgvk7qWBB226Jx7FQh3JeHCyIYjIhIZP1tTQVFuJl89Y3JMj1uSl8WOmoMxPWaQZoqKSNLZuq+Jl7fXcu3Z0xmVOZDpNpFT7E3/jwcldBFJOvevqSA/O52r50+N+bFL8rJoPHSYw13d/e8cYUroIpJU/nKgheffreaaBdMoyM6I+fGLvcWnP4rDhVEldBFJKj9fU8GoTB/XnDU9LscvzYvfYtFK6CKSNPbWt/Ls2/u5at5UxniTfGIt2EKPx2xRJXQRSRq/eHkn6b40rjs7Pq1ziG/FRSV0EUkK+xvbWL5xH18un8zYgtCLWcRCsOKiWugiIkP0wJ934Rxcf+5xcY0jPyudTF+aWugiIkNR29LOY+s+4HNzJzJpzKi4xmJm3lJ0aqGLiAzag6/u5nBXNzeeNyPeoQCBC6P1rWqhi4gMSuOhDn73+h4uPXkCx5XmxTsc4OPFomNNCV1ERrTfrt1Da0cXN52fGK1z8FrocehyiW2RAxGREFZsquS+F7azv7GNCYU53H7JrH4Xb16xqZJ7n3+fqiY/2elpvF/VwuxxBTGK+NhxPf9ONQfbO1lw92ruWDg7ogtRH4sSuojE1YpNldz11FbaDncBUNnYxl1PbQUImwj7Psff2d3vc2Khb1z7m/wxjUsJXUTi6r4XtvckwKC2w118e8U77K5rDfmch17dHfI5972wPa4JPdx7iVVcSugiEleVjW0ht7e0d/Lj1TsG9Vr7w7xWrIQ7fqziUkIXkbh5bksVRugV5icW5vDa0gtCPu+se14K+YdgQmFOZAMcpAmFOXGNS6NcRCTmDnd1839XvsdNj25kSvEostOPTEU5GT5uv2RW2OfffskscjKOXFauv+fEQrzjUgtdRGKqptnPNx7dxLo9DSyeP5V/vvRE/rC1alCjXIKPDXZkTLTFOy5zLtSXnegoLy9369evj9nxRCSxrNvdwE2PbuSgv5O7P39S3BPwSGFmG5xz5f3tpxa6iESdc44HX93N3X98n8ljcvjdtWckxJjxZKOELiJR1dreyR3Lt/DcliouPrGM710xJy5Lw6UCJXQRiajesz5L87MwC1RDvHPhbG449zjMLN4hJi0ldBGJmL4zJWtaAgWqvn7ejISphJjMNGxRRCIm1ExJgGc2749DNKmn34RuZg+ZWY2ZvdNrW5GZrTKzHd7PMdENU0RGgnjPlEx1A2mh/xZY2GfbUmC1c+54YLV3X0RSXJG3QHJf8Z7BmSr6TejOuT8DDX02Xw4s824vAxZFOC4RGWH2N7bhP9xF30ueiTCDM1UMtQ+9zDlX5d2uBsoiFI+IjEAdnd18/ZGNmBl3fWY2EwtzMAL1WDSBKHaGPcrFOefMLOx0UzNbAiwBmDJlynAPJyIJ6LvPvcfmDxv5j6tOZeGnxrPkHI1oiYehttAPmNl4AO9nTbgdnXMPOOfKnXPlpaWlQzyciCSqZzZXsuz1vVx39nQWfmp8vMNJaUNN6M8Ci73bi4FnIhOOiIwkOw60sHT5Vk6fNoY7/3p2vMNJef12uZjZY8B5QImZ7QP+BbgHeNLMrgX2AldEM8hYG8r6hiKp5mB7Jzc8vIHcrHR+9renkuHTtJZ46zehO+e+GuahCyMcS0IYyvqGIqnGOcfS5VvYXdfKI9fNo6wgO94hCZopepRjrQkoIgG/XbuHlVuquP2S2cyfURzvcMSjhN5HuPUNNdNNJGDD3o/47nPb+KtPlHHDucfFOxzpRcW5PB82HDrmgrSa6SYCdQfbuemRjUwozOH7V8xR5cQEk/IJ/UCzn5+9VMHjb32AmXHuCaW8uasef2d3zz5Z6Wma6SYpr6vbcevjm/joUAdPfX0Bo3NU0zzRpGxCb2jt4BcvV/Cfr++lq9txxemTufmCmYwfndMzyqWysY00g7KCbP5mzoR4hywSVz9c9Rdeq6jn379wMp+cMDre4UgISZ/Q+w5B/Mb5M6lqauPBV3fTdriLRXMn8s0LT2BK8aie5yyaO7FnRMszmyu59fHN/HbtHq49e3pUYxvpwyOT7f0IRzRuAOZNL+KK0yfHOSoJJ6kTesghiE8HhiB+5qRx3HbRCcwcm3/M1/jsnAms2FTJ917YzsUnljG5aNQx9x9WbCN4eGSyvR85+ncKsPnDRlZsqtTvNEEl9SiXcMX2S/Oy+PmVp/WbzAHMjH/73EmkGfzT01txLmzZmmHHNpKHRybb+5HQv1N/Z7d+pwksqRN6uKGGdQfbB/U6EwtzuGPhbF7ZUcfTmyojEVrSLQSg4Z7J5UCzX7/TESipu1wKR2Xw0aHDR20fyhDEq+dN5ZnNlXxn5Xucc0IpJXlZw4qtICeDprbIxBZv6/c0kGbQHeLLy0h8P8Mx0q8j9B4sEE6q/U5HkqRtoa/csp/GtsOk9RkmO9Ri+2lpxr1fOJlD7V1857/fG1Zsj775AU0hYvOZ8Y8XnzCs144l5xwPvbqbrzzwBkW5mWSlH/3f6ap5qVMyecWmSpYu30JlYxuOj68jrIjQt7poamo7zA9e3M6n732JB1/dzWUnT+Dbl36CnAzfEftpsYrElpQJ/cV3q/nm45s5fWoRd3/+pIgV2z++LJ+bzp/Js2/v56X3DwzpNZ7auI9/XrGV82eV8u9fOLkntvzsdLqc41CIPv9E1NreyS2Pb+Y7K9/jvFljWf2t87i31/spy8+iIDudh17bw+661niHGzXOOXbVHuR3b+xl6VNbjpi/AIHrCP/23Hu0dybm7/VQRyf3r6ngnH9fw09equC8WWN58R/O4ftXzOHaTx8X0c+PRJ9F6iLfQJSXl7v169dH9Rh/+kstf79sPSdOKOB3155BfnZkJz90dHZz2U9focXfyarbziUva+C9Vs9tqeLmxzYyf0YxDy4+nexerZ/ubsffLXuLtRX1/P7G+Zw8qTCicUfSrtqD3PDwBipqDvKti2dx47kzSOv7dQOoqGnhy798g8z0NJ68fn7ERgjFSrjuk/2NbazdWc/aijrW7qynutnf72tlZ6Rx+rQi5s8oZsGMEk6aOBqfd85i1U3T+zjjR2dz5nHFvLKjlrqDHVwweyy3XXQCn5qo8eWJyMw2OOfK+90vmRL62p11XPObt5hRmsdjfz+P0aOiM5Nt4wcf8YVfrOXqeVP5zuWfGtBzVr13gBsf3sDcKYUs+7szGJV59B+Cj1o7uOynrwKw8uazGRNmwd14ev6dKv7xv7aQmZ7GT74yl7OPLznm/u/tb+arv3qDgpx0nrx+PuNHj4z+11BD9nxpRtGoTGq9i+pFuZlegi7mrBkl/O2v3mB/09HJvSg3k8tPmcDainq2H2gBAt/IzpxeTH52On/YWkV7r5Z9ToYv4i3hUO8H4PixedzzhZM5beqYiB1LIi/lEvqGvQ1c/eA6Jhbm8MT188OuPh4p/+fZd1n2+h7+6/r5lE8rOua+wW8Nn5hQwMP9fGt4+8NGvvQfr7NgZjEPLT49ZMs3Hjq7AsPVfvnnXcyZXMgvrjx1wBfH3v6wkat+/Sal+Vk8fv08xuYnfqnVs+55KeQoj+z0NG5fOJsFM4qZVZZ/xO8nVNLsm5xrW9p5fVc9r++s47WKej5oOBTy+BNGZ7P2rshUqG481MEF3/sTDYc6jnpsYmEOry29ICLHkehJqYS+ZV8jV/7qTUrys3giRgmjtb2Ti3/4Z3IyfTx3y9lkpftC7vf6znq+9pt1g/rW8PAbe/nfK97htotO4JYLj4906APS++t5WUE2ednpVNQc5Kp5U/j2ZSeGfb/hrN/TwP96aB2TxuTw+JLh/cGNRRfFtKXPhdxuwO57Lo1YbOGOA/Cl0yZx1swS5s8oPqre+LGO09reyVt7GgLdQjvreHd/M+E+5v29H0kMKZPQt1U185UH3iA/O/CVPpZDql7eXsPXfvMWt1x4PLdddPTolA17P+LqB99kYmEOjy+ZR/EAhzo657jtybdZsbmSZdecwTknxHYt1nBfz688cwrf/dxJQ37dYJfYzLF5PHrd0LrEBtIKHo7Orm7uff59fvXK7pCPR7pFG/abQEYaWem+nqGtM8fmscDrf68/2M6/PbftiHOQ6Uvj/NmlNLR2sOmDRjq7HZm+NOZOKWTBjBJ+98Ye6g6qhT5SpURCr6g5yJd/+XpcL7r9wxObWbllPytv/jSzxn0883Trvib+9ldvUJyXyZPXz2fsIFd0OdTRyefuX0tNi5+Vt3yaiTH8QxUuyUTiw//y9hqW/OcGTpxQwMPXnTmoi8oAC+5eHbKfOhKx1bT4+cajm1i3u4GzZ5awfk/DEaNWYtW3HTzO38yZwLaqZtZ63TPrdjeEnPnc25xJo1kws4QFM4opn1pETqav3+No1EriS/qEvre+lSt++TrdDp5YMo/jSvMi8rqD1dDawV/94E9MKRrF8hsX4EsztlUFLgTmZQ3vW8Ou2oN89mevMXNsHk9eP5/MEOO8I62r2zHjn/4Q8rFIfT1/8d1qbnxkI6dNGcOyvzujJ+mE4pxjb/0hXtsZGFHy3JaqqMT21p4GbnpkI83+w9zz+ZNZNHdiXEafHOs4HZ3dvL0vcI0lnD0R7A6SxJGUCb135TefGdkZaTx901mcUNZ/TZZoClZkHO3N/kwzyM/OYOXNZw/7W8Mft1Zx4yMbWTx/Kv86wBE1Q9Hd7fjjO9X8YNV2dtaGHjceya/n//32fm59fBMzx+Zx0N9JVZO/J8nMO66YtV4Cf31nfc+3hbKCLJrbOkO2UnMyfDz/zU8ztTh3UHE45/jNa3v4f3/YxqQxOfzH1acxe1xBRN5jtETzG5QkpoEm9BEz9b/vV8Yu5+jsdry3vznuCb2725Fm9PR3djvwH+5iw96Php3Q//qk8Vx39nR+/epuTp06hstPiWyLyjnHmu01fP/Fv/Du/maOH5vHNQum8di6D47qbojkDMG/mTOB13fW8+i6D3q2VTa28Q9PbCbYxBgzKoP5M4q54bwZnDWjmOkluTyzef9RXQfpaUZndzcXfv9PfKl8MrdcOHNAwyNb2zu5c/kWVm6p4qITy/j+FXMoiPC8hWi4/ZJZIbtPNINTRkxCD1X5rd2r/Bbvr43fe/EvR9UxiWRsd/71bN7e18jS5Vs5cXwBx0foD9jaijq+9+J2Nn7QyJSiUfzwy3P47JyJ+NKMOZMLo/71/E9/qT1qmwMKstN5bMk8PjGu4Khhm8EY+sa2YEYxP1tTwWPrPmD5xn1cdeZUbjxvBqX5oS9EV9Qc5MaHN7Cz9iB3LJzFDeeEnhyViMKdg3h/DiT+RkyXy/SlzxEq0kQYdhWL2A40+7n0J6+QZoYvzaju1UXR3we5b9/pl06bxDpvWNu4gmxuufB4vlQWvql3AAAFhElEQVQ+iQxfbCtBROO8fdhwiJ+s3sHyjfvISvdxzVnTuP6cGazZXtNzDsaMyqS1o5O8rHR+8tW5nDXz2JOjROIt6bpcJhTmhOw3TITKb7GIrawgmy+fPpn71+zs2TaQRSRCLTzxo9U7yMtK59uXnciVZ045ogRBLEXjvE0uGsV9X5rDDefN4Ef/fwc/f3knD722m86uQBcdQMOhDszg5gtmKplLUhkxCT2R+w1jFduKTfuP2tZ2uIs7lm/h8bc+CPEM2PhBIx19CkZBYOp5pJfUG6xonrcZpXn89Ktz+fp5M/jc/a/1JPMg5+BXr+zma2fF9xyIRNKwErqZLQR+DPiAXzvn7olIVCEkcr9hrGILt7BAR2d3yFrkwcdCqQ4xljvWYnHePjG+4Ig6Kb1poQZJNkNO6GbmA+4HLgL2AW+Z2bPOueEVCz+G3os3J5pYxBaui2JiYQ5PXj8/5HPCDXFLhK4qiO95S5RzIBIpw7kKdgZQ4Zzb5ZzrAB4HLo9MWBLK7ZfMGvSCA0N5TrLROZBUMZwul4nAh73u7wPO7LuTmS0BlgBMmZI6q9dEw1C6KBK5qypWdA4kVQx52KKZfRFY6Jy7zrt/NXCmc+4b4Z4TiwUuRESSzUCHLQ6ny6USmNzr/iRvm4iIxMFwEvpbwPFmNt3MMoGvAM9GJiwRERmsIfehO+c6zewbwAsEhi0+5Jx7N2KRiYjIoAxrHLpz7g9A6FqrIiISU7Et3iEiIlGjhC4ikiSU0EVEkoQSuohIkohpPXQzqwX2xuyARyoB6uJ07EShc6BzADoHMPLOwVTnXGl/O8U0oceTma0fyEyrZKZzoHMAOgeQvOdAXS4iIklCCV1EJEmkUkJ/IN4BJACdA50D0DmAJD0HKdOHLiKS7FKphS4iktSSMqGb2UNmVmNm7/TaVmRmq8xsh/dzTDxjjCYzm2xma8zsPTN718xu9ban0jnINrN1Zva2dw7+1ds+3czeNLMKM3vCqxSa1MzMZ2abzGyldz+lzoGZ7TGzrWa22czWe9uS8rOQlAkd+C2wsM+2pcBq59zxwGrvfrLqBL7lnDsRmAfcZGYnklrnoB24wDk3BzgFWGhm84B7gR8652YCHwHXxjHGWLkV2Nbrfiqeg/Odc6f0GqqYlJ+FpEzozrk/Aw19Nl8OLPNuLwMWxTSoGHLOVTnnNnq3Wwh8mCeSWufAOecOenczvH8OuAD4vbc9qc8BgJlNAi4Ffu3dN1LsHISRlJ+FpEzoYZQ556q829VAWTyDiRUzmwbMBd4kxc6B19WwGagBVgE7gUbnXKe3yz4Cf+iS2Y+AO4Bu734xqXcOHPCimW3w1jiGJP0sDKse+kjlnHNmlvTDe8wsD1gOfNM51xxonAWkwjlwznUBp5hZIfA0MDvOIcWUmV0G1DjnNpjZefGOJ47Ods5VmtlYYJWZvd/7wWT6LKRSC/2AmY0H8H7WxDmeqDKzDALJ/BHn3FPe5pQ6B0HOuUZgDTAfKDSzYEMm2dfBPQv4rJntAR4n0NXyY1LrHOCcq/R+1hD4w34GSfpZSKWE/iyw2Lu9GHgmjrFElddP+iCwzTn3g14PpdI5KPVa5phZDnARgWsJa4Aversl9Tlwzt3lnJvknJtGYM3fl5xzV5JC58DMcs0sP3gbuBh4hyT9LCTlxCIzeww4j0BFtQPAvwArgCeBKQQqPl7hnOt74TQpmNnZwCvAVj7uO/0nAv3oqXIOTiZwsctHoOHypHPuO2Z2HIHWahGwCbjKOdcev0hjw+ty+Ufn3GWpdA689/q0dzcdeNQ5910zKyYJPwtJmdBFRFJRKnW5iIgkNSV0EZEkoYQuIpIklNBFRJKEErqISJJQQhcRSRJK6CIiSUIJXUQkSfwP27xb4ieSK8gAAAAASUVORK5CYII=\n", "text/plain": [ "
          " ] @@ -549,19 +549,19 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 26, 12: 25, 50: 20, 54: 13, 16: 13, 10: 12, 14: 10, 48: 10, 20: 10, 18: 8, 44: 7, 36: 7, 46: 6, 24: 4, 26: 4, 28: 4, 38: 4, 34: 3, 42: 3, 30: 3, 40: 2, 56: 2, 22: 2, 32: 2})\n" + "Counter({52: 34, 12: 28, 50: 14, 10: 13, 20: 11, 14: 11, 44: 10, 36: 8, 30: 8, 16: 7, 54: 7, 22: 7, 32: 5, 48: 5, 46: 5, 42: 4, 40: 4, 34: 4, 18: 3, 24: 3, 38: 3, 26: 3, 28: 2, 8: 1})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -626,13 +626,6 @@ "\n", "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/examples/assets/circ2.png b/examples/assets/circ2.png new file mode 100644 index 0000000000000000000000000000000000000000..21e2273f8baf03b308f4b664dff65284183b8814 GIT binary patch literal 34563 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 PcNYI*Y;Kfm=yKsdAp?s# literal 0 HcmV?d00001 diff --git a/examples/assets/cycle.png b/examples/assets/cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..283339faf70e34c5596bfccdd0c14f3bb9329220 GIT binary patch literal 31484 zcmc$GhgVZs7w<(>bOe#1N>vP?q5>jaibD-mL_-gV2+{?l1p-kg7%PqGf25a@Py?a+DMz_=b^*7W^GI?n-r8zQ+>0P=~ z=7~rqZn4Nidhm%34NZmA*{$p-j?!6Gg|WZd-(k+%_RJgnF2J{ij^T~xkyZcy{nJ>^ z&%xBFZu#7C3MGIVK#?QRlj4?Xj+U?hY?DgqLb){^fMPo5P%5YaQS!KPYw2n73`#+~ z`mLF-O;5f$6nWsBeU(Q%MHqe5pv(j&!E=|s_)dI5O^I##!m`BebL4z9CXySXT0Et6 zpaM*Ml2O4D1EEFf4EyTj4pAIX1#b1e+CFfhMnFzab67$h!<}{0<(zE22uF)w@ zh#)K{Nxsz`s&8NL$Szl+`d!=+h~70%+^%VHi*@V9+WU60^6{npbBHx+2M&=ZUzynB zPR`l6n}LVjQynMD)7?oY$X(^>ckr5UL(b09hu>ZGx58}tUgICq4lGByLsS+4R8Rmc z5!VoxlP%*qyK>tq0hi0~o7vD$);RV--%<{s)#NHfJtr_L6pYU`NlS$% zqGh;|?`NbJNA#WIUYFF#kWJN$Au2k~V5=|Bv~BjCHThW)r3zE#4!gzrrSeabQi{8brK_`j!q=MI zSwu;3c_ZiPF1F|*HWc@|Z^Lph7zIJnY!ybqr)Z{JuF3bJYLj#F6YExI$1y8an2Q$& zKdz8mymZ(B>6U0U>6+@`SMirKf8S_$nJ4Et6Qb?i6X3X`HZLL13`sw%F!0%>Mv=3v z$iHN-8;;Wbu1Qw6-Z}Esq)AgAvd{UZzw)xPbzrYg-+1Af)x-*BC9$)QKMcL~-~2IfiH3q zGZ6s8I9Zt>!egZq>j_*_15Ncv>1f4Xy=AZ#_Ed84TGBH1|NFr*RSHG?&rAJoUNqfIxz=G2yWI_E)+ zRf0C{r44+r)vX(n1Fzr6VZHJolH-d*1mTM?rE_E~)CE@3{JTkrC}_IV*covIiZPIR zG^#?*)cpI?FiPr8=#SFUMRBMRH*(6hc%SEpK8BUd-I;8sUidZ&oA%SPm6<@ks6dV% znd%o|w=D8DlN@;SMq$DAKZx{E$U;LZ$Z)4``(*S)nv2)r3hdCmP;mGppz2+ByylZ4 zYSURd9)O)Cyg%MZDJ zkY>+xgnHlkJP&VLit9;=hs2zDq&e_80m5L?it)MEAnJyyr^p=S1vt zEF1UXK8$;l5009s65)!hQTGEwHKly0V|vEWC|XgRWX7 zt%>$!$;6*@Wjo2F`U!CQ$lKZ7zNW5x->P%uc|d9G+jbmp$pzTZx79BdaAs2SUkxe6 zhArzUeTjaF>a3yUsXwf-5e^8EAS?AI&#>7yGxj`2Ja=4IMh>-mc|n1R(E07SB_``IsP@3TJ5W9tXE2q z-Tx)}wgkVjh7`h?E5B%@lNZjK82H?-R0tD_dw-D7S#y%?)xXy_*1Z(J!_=q0vNOXH z3S{w*7yX)ids>QL^F`~sVX4(0Acyg>$+dmSWS6Sy*jze(0URphfNfIa)L| z7{?k|n^W3TlW?7=p5Yk3KioQCA`~Q3f$SV>zVaqY9UR;TbM^E4R?E-^XT8S}x5|A&uR> zgV+!q^o3ch&G|cGx$G8KHYal)taLMMPJ6%aqRPR-KE>?mg75^1f$t!4;Y-e*&GH$; z_{Jb_{J_~u zT8`u%_!U&-m<$LLaFLp1f{0!ya^-AwU@gWcG`)|%z>2(+>>Ar3F)#}3bzGC|_) zg(y4s3m^Sm#d2wPWvbuC*X7246KL)2c(nDM$=*t}OqPY$mzIKAdC`_KTCm#eWkvSP zwydN7liR!xI6@k}SRvUNzwG39 zm9AnfYyXW{GziR_AGA)jaxINJ4%xeUJf#F@OLk0_!_M#FhSsYxo4-3RSI}SB352|j z#bQOx zrk@{NOFwi!)cJrg-+mLLm1n4a@qv2|4X$622vDBfjFvaNs7_`>d(Ley+7Y*v$VQx- zyyp#8l2D5?TnUhdS8_b%p^Liv?aqy`)+|)8*nr$TzDEIk{lz%7^b+|Ox(yvX@AA)E z<1+1B3_UOI7zldYd-7L2>%UZ8Ap0F38@bxOO2@#d_G44Noj@OEt+D|GN<7)q(A#Whx-t6n<#|cf@p%QJy@OqNV#?)D@0(wzCQWUOJ7ZpxO!h%g_gt;^vx>`P zd{6bWPf`2Bza3kuJK+Ee*qlw&TQh_;zcBPUxtW04OQtZPC+U%34sZb)%N30FzJilA zP?r1F-94Iu$78#fR2F7W?V~@-J+^P>jxpR#oE!VKV*t+)*K94~2hg4glqJ+w&W>IN z@EZD;rZBlXr$733g$n+Bi4GmyT;B%`cNwD>(kSw&%D2+XMXr3mS2|l}oVq+^-0JO< zyK6bLG{qynX;z~yJ(+^q>&tfr+T)*g6a4MvpPbt}zlrWI94k?kMm~23kJzY)4P4^c zVSt zBMlD@L5-*lJ=2&XBcEUnCWz8#?9o%?Nq-s%1~l)wEcSO49otF-zwNfSMAx_&4F=x? zSBxBL!F3Zj`jVm$Vej1ycs7bYy&nuWeETS8G=`=PJd_PyDVMxV;d9^%vWz;}F6!fK zU0XW@EwxVq@WNEr_Nn82fEI}_G?>{b)ir<>YH;?N=U07@X}-y$-%9=URwVimFn8EGfuiyzc2h_MBnBwSRdWU2Vo@cM^X1%papd1B6 z@FhP(N$_g-$)V+WIe{DMkwlrvs#kt*77jL{A7?}wpvr0iN6V?*Gp|(m6ri=!@;PNZ zt3+9nEGWYS#SF}$!p_YUf~}qa^5W!Wh`+t0hD=-;EZ<{Q%*z33c;uqKMm?CB1y2)8 zym(goR#3H(fbQC2uBM(ZsNg6-_eXz|vaGz?C*b==x=`BMsgzpoYkSCg=-(ARc4BqO z2!{s>QMud)dbrW@e*(i>glALw4_9D62VIQP7dV|Yo79Q3HJTaSW%U?frl6d84s?m3<&Obk%PkWrSy^f-Dr6hLwojDJ{Ng3mf4~CW3o>kSgT8>ttkJC? z_~p{cMIGlrMhKvNu9@bZN0&WJ1dA^{%Q|h9OgRP?|CSi8EN5AXn`Z{=92{v7vozz< zNW$jZIpH-5hH8P^Ah-hQiXI{6V(1D$g!Cb`>s+dCL_tKd)BI|UTlF}CFDZM*=x6S0DogoC_Z(V^KcveRS(34SzA*w{X0si5_2ZSmWcCWnUG%-;q z!_FNM>=GpgBes~Fe&!4X84PFFi*)h9@E_-wO zj@kvVkNN<2)5ZTW77OGcvHB#r0$C#1TEfz*2S4^V7*Mbfk27me02A5U*S*PHQ@N%E zX%xRCQev_Q)rw?M836XhJVakOH`DM=Sxyw}G!Qc*d6yj#`o^H^nrs{Qz?Ml4-6(VJ zhhL@On8?GB{f`*bW{@chmgp!8#*==GXm^&$lTU)R`7BrhTzpeQZr5Q=rtf;(((1CT&KPg=TLy@nU$LGZS9c_Ze+kO;e3T(Aw^&p)IhxE ze4rF~Nc6zK-BJ4hPAmXeMR=l(zHnitWlZAbd9e0HAtL>+K~u264~%gCRZTTC;D#g6 z87o;!is$E5$|2~-3mtg-P2QyuG=X*Ce zIqJcLFPJRj!?Lz2a4Z+V&*I~f+NGtJ$!(11PtY&8{eCTjpPOe(dMbk(uwd6QUCGzH zsG;UymRkU*^@`dz;f0px;sk2A{3iT0ioO!CY<~i>k4a0U|1~fHcuU~t1c&qX2~fb? zNee3tqGSgdCMdhJT>XPBc-^QtqO@jt022R?(*c+~*R*?Vkl}yJ+A`i|FysCH`N912 zwY{n7$W3X@%=elKB?7J`qP)(`wE3Zrg2#8=PN73nahk2MpTUGE%M|*DE4fYK;ULHi zvYCk;N1x`@`MQ$}|`i4MwBLv)Al4YY_FE zC>r3Er)`Ib(H2U9=fEd(gj}vIoN3$z6GZ;(tMECec`&E}Tfi8@Qbb^9x^8Ljhd#|_ zpxmPW`B?;bXP;D;ooCQ5uB4>}Nv9Z}jrteF1{TNwq7iI!qbK)|dSp#_lskIvw+my0 z>bp!Gd?Z*P@SDL(LYB0m3d1-_w>n8EW#^em=^=VTS`eE=|I+si84)pDnTf$a10$9| z@}MT`#Kse312@McXL^Aa0=J*FV()y^{a*AMU>79oK4$DOSme0_tiJu-`Tnbi>g)hT zv`BVtzu6=d3(#N(yV;{ee}HHT{7euoy`8Hwk7?KibV~;=B;aJf@iLzO9*^K(s~6oz z_#h)ee%bUnEcEgdK8P^NP`*N2xhP+te8YbZLDxSJ-XCW)(*5Pt-*+BbHi{$ z9awWnb>VYX8cCe&1ZLV@TW~0|OQzT(LOXGEuIKH@%wPamjo!b2#&B`&NPtt&NLQ@L za|0T|ObhBrueUT@Q9un~kOdyk!^0Lmm3Ew9iS*js(YX~wBV@GKp=Jkqm_tUAKpno>j3%C zNashd6l9H(7-Fp96>KK+ve>|<3c1I=kNjPSJpC4Dfe4V?9sw`m@%9nqcr-%t^MXOp zY6+-KuD@zHt{^smSZUTsTNOFaO8UAY2b0EP^{ttqyfI*9po8D6&AigRfftq$5Q9>x zPOSTLqai-&Xrc|a=RT zoC;Ya8n-ddkZ##o;Cy-4R03-G?&@CZ`78za^eqK3riMLZKwm+c<3rlEb(auhKzOemkVdU7^fZplOvC~ACTGlpSa?R9x{e6J$=|zKYS?7T36S}s(QnEqNukTC zkp(U$i&xj=5lz5p8>X}5jJ{e?LYSea+K`E<2NvCarqyU=%Hf|~131WGAEZGl#2zHP z9FO`Nf_g%3F+omG7ir8;BlWv14~VC>#`6KPAKasu9{BSelsD zgebCK5S$961-ey+n1<9HZNNmTP!fG@vLDzqsQH&szQR3q8z49CC~|Ss;nk>eg#Z@t z!t)aY!44%>PXTt|9=#CFFXB5edFmDNWXH(xPvn-T|?NI4??)U9?B= zXjt1}A7M4vXh!nNIxzB(VN|U`&uB3?`|Sec?igkucL$*Sz_VRvOXU}Wsvh2oCi~uo zRS`mou85&i-X;S12vd|M4?2v8JOZa}uU}W2_o-jJngoP){3Oh5i_Kx95gwMRpFQ!}u3Lfg<6dt`= zt8N5{$wJh-A>ogDhiEaxDEiJKS{_UrJ}J~hsl32&dI)JgSK;^CLVNOHV|xAuWm$WY*-K#a8XNU09hx3bj1R0AQiSx>v7XeWny)&yy zpBaL}KUPXYe0s$u_=l4hkmc%qrh2x9>Va~lahjY3d8-e!-oTHF5c7DI!!_%dj_lxU zH0%b?lcTam_sSzddX+`Y(%SHj7oyl{?<;v%cWY3OA`cO;>%Sc?ZUw`!h#28LykW_x znmu0RDrpqs0ud{H7P%pZ+VAA;h=3n)opq=wZqDz(4F=8-KoRCp&RnZ|2hco`hY8r< zWj*HhPY{j8`aD>k21x-1kQ@t8{oI`W0mvO>o(|R)DPbIMhIvSNVmU@)05NjXPuGmf z-cVW8M8OgtLS3Y;`6ZW(N+C<%5jjV{FNZz~6qf8fOOvCY2Yj9}l?M_T;6IoEQ8KKt zn=ukdXMF#clq;2OS5pi6_OBAU?VNbtZ{jx)bwaEUgV1f~>EY^PFD1pHoFU(9b~l3< z(wBF+DpNP`MI@AHj3~#%#8Aeb_0=!X{{?{+u+81SRGVIv%aaj*pOAU4*4U(@$Sx2V zuEe9Y5|);RdPrOZvA#Fq-ud_j75w-RA%Csa;Ud7k5%-;tS>Xr2)*f5(1JV?~@C;|x zY!37_q_;8?G5Qk=B<3u`{4v@7F@FRUV*Y6CxeOOme28dfcO?iMB5<4(-()@t%mV8g z3W!%1CI*JSbkqX(v++Fe-*0s4+B|bSCBr0bIcj65JPQkgm;$m_JvvWg9icx~0QZGl zatprQ^zZKjKs=y_6VajLIVhFrLxjile?B?Bi$<3Ccp-H()7oxX3DC+BppUOzOh&jJ z^U?a6mw^v3etdC=h9!QBFZ~IomsUn>AB{J+IXn~Md!(BiN|`4jvJ~?{hE28kl=l8c zi*trPH)Tpw(i|&*Z70Yirc&6o)4drw&%PY{lK$mC5@WIKSd(U4hmWcn?H7%`I*S%J08M$r^5i53(V#eF0D7rDYte$? zt8}!+MWG$ha4Ryu;RE2@*wREKfY`4F0XxT)4z3tLS5=EMS%L_WP}S=o^sbGe;1mjx z5CnGhplY@mAa338+=2Y!kYN)bs*PNM8k$lompPc8mao6Jx@O3yjwmJRhoRSKr}{r* z>mXE6*i3GiAP6o1_$sH$wnGx#$LG0)vbB3ItDq`AZbZzncDCibkD6MmRO?U)((7*=)8z5Qglhn~y)?+K`fL!-l@#_4{V`oVy@O_^|rR;ctsS z@C2l4kGNC2zXCa!SaUSZ#v-jCA^=n3 zHa%cVhkbm4aYp!G<47n2;W{`4a4$g^AkD`kUY)1-b5HFpQusu2L1M4aNk;6Iu}6|$ z<&H+69Ef@|z>DgF6%!@wRv?;}bH^MxW7>T$E_`blN+s%0Mi{;6I3?5wZbf)bdxlsFni9iOXzT^v znK3$=ei9sM2D@rOW`9sgBt-v&*c)T2vjjt4GT2+uK2DvBDd~>&i4bng;F{gDjR1rp z_&Id}TpBN+sS@OXYR0v8Zy}GFe{5-w`QqUs?fo6KYBnjK`%y|7h=f7krN}c`dz%@N z5U#tPO=5{1#M=mY2C$f?h|`y4sBlWSEGY17`K`x31L#5b+IMRz@HK9Z1H65^F<^v%2fJL6754|gOcVr>EH>pH5T;U~!l2zI#O2)Sky2LW zg*a*d^$1jooI=LDO&jenQw0t!=erYRyJ*gN%Rgo^qhJ73h|q5E-or^j&C|c~i@An% z!AV203j-b2r0ZJH1OneibIyUA4{opP*m-&Z1E^~JjxSWK2IxO<%|U&JM>=q^)n-qD z8=5>MZfTZcF@|`s1eq<3PUj-D571&di;tSne&|0&Qran5tU8BU87eAD=nT@BX+4n6 z_})ACre^zUy6C>VRwEx{Z&6h#a)=B#wU{Ab-g)r-N~xo)gbQiObp1wV21PgbdOLzu zfqy<*2|UMWPAUS(L5Y{t^-1eX0O8s&Up#M|_6LsxD%iKyxVX27Js6nC-GNawhFhX7 z4mp1NE_@mF6GjXHjrNv`#$N?#!XAi3N>5i9``|m{@W60;0LV>2aFAv=$CMJN3tqftFgoiAh+ZDgIr+_ zWNU`ih~3&5U_=JeF}t~nN^cnk4XDx9RArJyrP_R~=)QKSc@ZLnZROB*SeW2Lyxl$ z?>lJIoo&g0Ita(tpGS<&n~Lr`*!vMggA$G1#BV&nGii(gNuWyYJ%7gD4t5q?EB-MC z7z8xwgfN@xFffU%NkznS=Z!<`5J}c(-we|h31D!J6*l3PAl*Q(AyI=y`+zF>OIG?; zRV3kxcP&6WI7e%da!!0CXH7l=iVllD2mek-&QIy$IpO zAklsFRwTh;?2e$okjB{Nl^NA1mB%dZ7;pu(RI>}K0Q75#bBG|@`h9BeM=$Ku2i8E_RV0^zws>@sl5U56R z5@Hz-&pkjL`Hbv%od>n)*14A&@AxE-TeoI9V zP)#smL*Kg$!1fZ15rqhDPyZc$YwrO~H2&2^BLNIdfn-mX!+0-|DO zL^fIL*ofOjRQ9l;>61)3BNNw(OVknI1k#*1%%(aHL?&klhzzep&REloGFVyqWjsY; z`MglZqq+;LU+A`s>F+J{bx77*X*J#(P$S1S9iEm%t`MJFXf<9}0U_hK77au@fEH2!4}M}0RSAST-uSHXKVc?irHHIVjEbY*o~5^# zA&_z6U+e~?<73^3bZNB63gG@@i9VF*{u|zYt+DT$@ zZE;9&09E>oMPOGzeoFi+2K`pjSaA&DCuAE^OqECw9{^i$+|ctbvm{cGI1tK+#uE!K z(7ymPn3%W2Z+uAvG2IZGnxKLXWJcX;LQnp|#2~^!>zvV~$rjOl&9mxeUKQ&gG6hGg zFXc&<*|XJZv_MSs}wt$$Tx2mK@2F=Og+g)ngj`{802!C zH9oD5I6=_FJ%>&&1R&>N%3gju?g;Sld4%naibCI~&)2S|dhv2}IJToCqdCdB2wNKW z<7=oYKs;=lANpUt}a6 zphQPtuWrz?5n(pefa{7BErFAVpkV+$edLd8_ry={MIQPN!ozVb?-a&!2fNesE?~!x zaj;evb4xt_h4x3>TFA_u;p5Q^L?8V0TklE!MPdl1AyMHHEiZtZgEid}Z7gZb3XV+! zL?Qq{Wr(s_SpW3x`zKc@J(5GZh$MUhcc0bWxx=v;_YL#)PG~#N4HBGjZIj-yt$&ky&HTGbH zTU2j5N%|mzMYKvO9+pjzU_{grLAcTyaWjKcA~V8-k{oTl343vj0i0fv^dSZ=PD=-M zlxL4F{7GJbG|^|onZPedsgR^QbcK^~#99dk!_KIZp z7X)dOxibhK>B9(iyR(?9y`MDu#6?}Xe28hAp#!8(j9StfK-Th#R!1-}Y&L>*h!#NZ zG~cmgRP`Hbcv$Cj{C(k-#Gd5usyC41Voh|Gr+th&#zA|6WS@?HX9OkS1+$Ystj@Eu z)P&}Fd>Hr1?OL(om@Z>P9>54b@0}M-3>uQCE>*nRz#!}3aAkD;2II0g^*Kj{-@5^W zO93Q>FjU*k955TFenvD=3BfZ2GZq;)M{}H{9ae|rs~)`czUF=R&n*S_9wl$&Go5ub1V z{Ex=coKfe;O(r}(lr!1~lHx}{doj-FJ$-JbBoCX0!W{KJj@_>OOZZ`3G{D(E{=!+;R4cPG=%A6NZGtu5pT)dgD zkQrQoh|Z7n%MFQmnF|Hb4JUj2s>L3az_hwHNxjj1E4S1Far$FJUC2$1Qws=#qf_&lG*Ss#SpF{T1 zn0UE3vp@7zq&$U*u$H~odHrN!1v1V5Ai-$WLO5gN$~YQYkFl_)CP4aQR+e)x{sTsV+aus zh&Y~_-=H7J%kiNh30TLb`v4t{ZDPD}$VRT%#-cJw`R)-DW75hNib3itoU5kPt`^4! zbx_BhQKUzv+tCKWK2)faq$Q=h4fJOq!Jsc-&>X3%(M^;edZ z-AhLk4w<=KJMX9GOv)HBh`s)NqN8PJdYG*i>$~8b-I*V=3>v$~W7$;c&qN*gTG1;l zAqkYOsw?i(8%xN`K z)-^fwE`VZz)+Mf)Y>~r9==8Y9kyq~8!|$6k_7Fr4%E-mPqRujKYifW5Pk6}x!Wl@F z0s8IioB;@>Rs+s)rgbz80dXMek#;ZYvdGD-d|CH`a9`qFl4Ckjf+a>4NArjcNR!7= z3a?0qhsw$ouzLoux`dJfxe47DyE67(nw$>L4gcEl?Hb*3eSZ_#xvCeaCF&mKbi-dT z3NE_2c{*&Y5T)X``wfd;GYpP(2uBJ05^>}Dx)LWBb)*}cttdgZyJd7U<6!>>G&YH% zi}utfSq;)^N`D7q2RBLYqQchQ_(S{gc%&h#!+c?+W457Y1@6LZ$kYyes~VXdD_-EMpMO}Q64 zax3WV!e|T+e$PAg{rwh+O}vv+?Dzwelzwn63inyZCG7QL(s6#S%1~Q)Ey}HOeeBmM zU?~apYj3j_?OwdBt)A>Fp6%X^`st)r_EHvf2g$D5aSATZMxflhR@-;e)*{@&A{u*x zpg5*-X0zX~Zy(M(c6<=kZgg=-SAldC9h_Z;-qn~gX*yB;EA?gzQmO{opSUcySGRXv zz0h=9nLNKGGZ#A4WiwE6ke(zf40@sRz7L9rr_18YN<>^~6lUceW(CHSeG0@VtB)Sf{IlH?&oL(zFXc({Exp0v?C>BR&p?9 zV}X6AL!UdkiTt9};CEMRUpKkklnl~w?tCMsUHra?qFY4yS>)JfaqvG8c<#q3(CbI2 zFTVxL>NFgcu8qH(6~A5e?uGP?S*`}qw6a+EI0hFxURLhKbnEY7$?Vbn9^O+6d6GGI zH3}D3r!XrUn2Q1B%#0s{K3f7weDL$9rN_RAak_zO|$Fg_t7tbp>- z?t$C_!4qTXiw?+r(=bVlr);?l6Sw5>6*|kSm@@lI3WMk5_t&VrJ$g4>cxch}Tyflc z*wToZq7ABrLD2edLci*EA!cP+%{E&x^Ih|`x2A$_hYH6yyEit-i)+)3RlkaGzkXQ6 zubBZ?7$Us%wcr;yw?3+7m%ZWXT=d!|H!vl0slCD&wB6`QZeCAkk4d(Z^57SA7Juoc z2Szl;BqlV^$6}RExN)Vs(JQ{gDC^^Y?{zHoelTbKukp@%7!>^8uh&QDC*}Vv2w$J2 zt%a8vFT*)3LVOAhPh18&Mr{b5;P->g4^aL7?372Em!z$VDD%BPHs1e6m}!_l z=D+xLOx4kiYpkg6^b6EWbwlQfpCg~Xd;ND%ry$;DOrPflv!mS<$eTlne{TgWwkX^Y zQ(*n6+@#ja-=yg@u9+mK89tE-I)ZSA;^JfB%X#$sj}+4xl$`E6y(>wM(Bva`PJDBl z`Sy8VpB`N6w>Nv)NiQzJ=kD;QO+6(QepNpK{9YW~&Fv05lou%c&|Gp|T zjah668|**rq#EzMa0etoP-8QD(^%Sg3}iv~WU2_4@h{JePsnf~Vd8yd++saMw09q=xQvI#)a^XNBqbtb!8Ol-_bmRacO>1x3 zcs-^%b=T;~0NNDz1v&Wz|6y$NW^9(}VxcLmL&(A)CK^S4KQel!$-@;)Cv911da1@g zWz(pB8rxV?w`CnBb74mCt$rCs4S9VABT?=2XFpXAfA-^d8=eLIU+J;Y!%rz?o?d?; z;wj!=J-gQu7Afj-Qs9$9eCql>c+frc%<aFVws%eKBT0o#flotnt+K1c$=feC2u`gXjTX-+2B7_L5`ry}c&#u!=OkDtuZ(YYoCVwTmFI)z4 z0eVlqmYe6-(56HLVYw)g%9-~`f)@*!Db6FBN*VEm!b|tPjU)%M`1uz7jv^A~vit!k zx5*;P8z#GKixGWK>mt+bz(kf7lG)oiQdlEP3-Qf;(8Ar;CIV)cKJRb1HR}zuZ7v(o zwzWwM^))Re>`(3d*_|gaKFfroF~BJ(bhQuZsYXsTr&pqOeHwI*l9_9CK(En2o>jJD zQ-|JB6JRm)0^G$44lWghtC%z2a)IaB5c8FYQ4z1s3~s0g?XEbeK{?Rky$SpY*x-iJ@c7$ppB~HWCgrP+iVQf?H=#_ zf(noZ5Fe;35lUM7)EgzdJA$v*K^k3iT~fzSYu?;Zvt_BgBDsl9KN=HvsmPT+a{_!$ zdlFIncblu2$ZR)Y|9e>52pCoA{WU`;$d-PD-&SN^y1RYdYnQ9#aEK&1@+24nLLn4c zVHO+uD!wkKz3+5=pFYo}BGZ(Yj?YeB9g-r$m)`o+zhjp-vhLJ>a=dlCcK|KF+6maJ zVKQ);oSwWz&#i>x@k>{$EBzRbNC9zfK3gOeFtRj=a5*C$WDl4pK4N@wJI`Tv&Xe2J ze88eqG4UBhg@SMOc^*drJabU0?yhk&QYu6+e@@fB9MByl+c*$Nq zz1yLG)Gc;lF}XoP>9Z~?SRDWJDEckGZF^Wh#;2LJ*wkiFUs!%nE{Z!Ne) zG0>ML*MPHXFGuJPK}joa2G3HEX2nI#f}G~ zE9Md!b?NQ|&>z2oDmJ(nJQo%+feJA4(HIQanNMA7y(%C+@anhhY}an{co&NI^-lRW zU*fhrIo~Dh{Jn3UGuv63aG`e!A^~H`scV&mYsMGDz$8~-6$vH9dE1CJ{W4!TwhP;k z*t=N`TrH3=M@_vV)!o&BIlHm7eDCDY*i=f9i_`<@he!2SzQ*AFN`J}~%WXEunvad| zsrTw4hKl*;bR~6NclqCsX%^Xva`PTZi8`my!pUph+g7R@H5bT();sUqVE4&vKnbC~ z0=>KX_+PNv(@~pj3z$;9+2UdQjnI_J{&Pk6I2W&kCAMzwg2-_&GwpoJjV}5ob z>J9)g#6{@?kDGqftC9N{AX8e!?ZIF}zu85TC-_{dFG~*Iz^?Mj?o9-{ z(J%PIzyxoe^h$3hDEsBZ8u1EB99dM4AGpT|W-UMamXDDWvjU=9?%0AAp_Ork?U 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 KgE\n", + "\n", "\n", "\n", - "Going back to our original idea of some position vector $|j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "Going back to our original idea of some position vector $\\bigr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", "$H_W$ spanned by the following set:\n", "\n", "\n", - "$$H_W \\ = \\ \\{|j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "$$H_W \\ = \\ \\{\\bigr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", "\n", "\n", "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", "\n", "\n", - "$$H_C \\ = \\ \\{|i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "$$H_C \\ = \\ \\{\\bigr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", "\n", "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $|j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\bigr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", "\n", "\n", - "$$|0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\ \\text{and} \\ \\ |1\\rangle \\ = \\ |\\downarrow\\rangle$$\n", + "$$\\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\bigr\\lvert 1\\rangle \\ = \\ \\bigr\\lvert \\downarrow\\rangle$$\n", "\n", "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $|i\\rangle \\ \\otimes \\ |j\\rangle$.\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\bigr\\lvert i\\rangle \\ \\otimes \\ \\bigr\\lvert j\\rangle$.\n", "\n", "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", "\n", "\n", - "$$U \\ = \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j|$$\n", + "$$U \\ = \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert $$\n", "\n", "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $|0\\rangle$ and $|1\\rangle$, we know that any possible, general basis state vector formed from qubits $|n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $|j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle$ and we apply the $U$ operator:\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\bigr\\lvert 0\\rangle$ and $\\bigr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\bigr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\bigr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", "\n", "\n", - " $$U (|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle) \\ \\ = \\ \\Big( \\ |\\uparrow\\rangle\\langle\\uparrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| \\Big )(|\\uparrow\\rangle \\ \\otimes \\ |1\\rangle)$$\n", + " $$U (\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert \\Big )(\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle)$$\n", " \n", - " $$\\Rightarrow \\ |\\uparrow\\rangle\\langle\\uparrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ + \\ 1\\rangle\\langle j| 1\\rangle \\ + \\ |\\downarrow\\rangle\\langle\\downarrow| \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ |j \\ - \\ 1\\rangle\\langle j| 1\\rangle$$\n", + " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle$$\n", "\n", "\n", - " $$\\Rightarrow \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle \\ + \\ 0|\\downarrow\\rangle \\ \\otimes \\ |0\\rangle \\ = \\ |\\uparrow\\rangle \\ \\otimes \\ |2\\rangle$$\n", + " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle \\ + \\ 0\\bigr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle$$\n", "\n", "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $|i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\bigr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", "\n", "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H | \\uparrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ + \\ | \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H | \\downarrow\\rangle \\ = \\ \\frac{| \\uparrow\\rangle \\ - \\ | \\downarrow\\rangle }{\\sqrt{2}}$$\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\bigr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\bigr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ - \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", "\n", "\n", " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", @@ -126,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -164,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -185,7 +185,7 @@ "\n", "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", "\n", - "\n", + "\n", "\n", "\n", "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", @@ -202,7 +202,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -233,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -340,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -384,14 +384,14 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({12: 48, 14: 22, 20: 18, 10: 15, 16: 11, 28: 9, 18: 8, 52: 7, 30: 7, 40: 6, 54: 6, 42: 6, 32: 5, 22: 5, 26: 5, 38: 5, 44: 3, 36: 3, 48: 3, 34: 3, 24: 2, 50: 1, 8: 1, 46: 1})\n" + "Counter({12: 52, 14: 20, 20: 20, 16: 13, 10: 9, 54: 9, 30: 8, 52: 8, 18: 7, 38: 7, 26: 7, 22: 6, 42: 6, 28: 4, 36: 4, 32: 3, 24: 3, 34: 3, 48: 3, 44: 2, 40: 2, 50: 2, 8: 1, 46: 1})\n" ] } ], @@ -424,12 +424,12 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -469,19 +469,19 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 25, 48: 9, 54: 8, 44: 7, 50: 6, 16: 5, 42: 5, 46: 5, 12: 4, 22: 3, 38: 2, 36: 2, 34: 2, 30: 2, 56: 2, 10: 2, 20: 2, 40: 2, 28: 2, 24: 2, 18: 1, 32: 1, 26: 1})\n" + "Counter({52: 58, 50: 22, 54: 14, 46: 14, 48: 14, 44: 11, 12: 8, 24: 6, 16: 6, 42: 6, 10: 6, 34: 5, 40: 4, 36: 4, 32: 4, 28: 3, 22: 3, 38: 3, 8: 2, 14: 2, 26: 2, 18: 1, 30: 1, 20: 1})\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl8lNW5B/DfMzPZM9nIJEBYwhJZFEGIoALuCFpbUat1Q3vrldrqvbXX0oq1t9jaSl1qt1stVT+lFbvQKnqtCohclipoWJSdIJBIWJJMyDKTZCaTOfePmTeEZJJMMu9s7/y+nw+fZN55Z96TF+bJ4ZznPEeUUiAiovhninYDiIhIHwzoREQGwYBORGQQDOhERAbBgE5EZBAM6EREBsGATkRkEAzoREQGwYBORGQQlkheLD8/XxUXF0fykkREcW/btm21SilbX+dFNKAXFxejrKwskpckIop7IlIRzHkcciEiMggGdCIig2BAJyIyCAZ0IiKDYEAnIjIIBnQiIoNgQCciMog+A7qIDBeR9SKyV0T2iMi3/MeXiEiViOz0/7ku/M0lIqKeBLOwyAPgYaXUdhGxAtgmImv9zz2nlHomfM0jItLPqh1VeHr1ARyvb8HQnDQsmjsO8y8oinazdNNnQFdKnQBwwv99k4jsA2CcO0BECWHVjiosfm0XWtraAQBV9S1Y/NouADBMUO/XGLqIFAO4AMBW/6EHReRTEXlZRHJ1bhsRkW6eXn2gI5hrWtra8fTqA1Fqkf6CDugikgngHwAeUko1AngewBgAU+DrwT/bw+sWikiZiJTV1NTo0GQiov47Xt/Sr+PxKKiALiJJ8AXzFUqp1wBAKXVKKdWulPIC+D2A6YFeq5RappQqVUqV2mx9FgsjIgqLoTlp/Toej4LJchEALwHYp5T6eafjQzqddiOA3fo3j4hIH4vmjkOy+eyQl5ZkxqK546LUIv0Fk+UyE8ACALtEZKf/2KMAbheRKQAUgKMAvh6WFhIR6WD+BUX416FarNx2DABQlKBZLpsBSICn3ta/OURE4TMsNx0AcO7QLPzzP2dHuTX640pRIkoYdqcLAFDT5IpyS8KDAZ2IEobd4QYA1DpcaPeqKLdGfwzoRJQwah2+nrlXAXVOd5Rboz8GdCJKGHVON5LMvilBIw67MKATUcKwO90YY8sEAFQ3tUa5NfpjQCeihOBp9+J0sxsTh2QBYA+diChunW5ug1LAuMFWAEA1AzoRUXzSUhaH5abDmmJhD52IKF5pKYuDMpNhs6YwoBMRxSstZTE/Mxn5DOhERPGro4eekYICawqzXIiI4lWd0w2zSZCdlsQhFyKieGZ3upCXkQyTSVBgTYXT3Q6nyxPtZumKAZ2IEkKtw41BGckAAJs1BYDxctEZ0IkoIdgdLgzK9AX0Ai2gOxjQiYjijt3pxqAMXyDXeujVjQzoRERxx+5wd++hGyzThQGdiAyvta0dDpcH+Zm+QJ6bngyLSQy3/J8BnYgMz+7UctB9PXSTSZCfabzURQZ0IjK8uo5l/ykdx2zWFPbQiYjiTa2/MJc2hg7AkIuLGNCJyPC0Zf/5GWd66AXWFKYtEhHFG7s/cOd16aHbDbZZNAM6ERme3elGisWEjGRzx7ECawq86kyddCNgQCciw6t1uJCfmQIR6ThmxMVFDOhEZHidFxVpbNZUAMZa/s+ATkSGZ3e6OnLQNR2rRdlDJyKKH3UO91k56ECniovsoRMRxQelFGqd3YdcUpPMsKZaUN1onHouDOhEZGgOlwduj7fbkAvgX1zEHjoRUXzovJdoVwUGWy3aZ0AXkeEisl5E9orIHhH5lv94noisFZFy/9fc8DeXiKh/7AGW/Wts1lRD1XMJpofuAfCwUmoigIsAPCAiEwE8AmCdUqoEwDr/YyKimFKrLfvPZA8dSqkTSqnt/u+bAOwDUATgBgDL/actBzA/XI0kIhqojiGXgD30FDS7fbXSjaBfY+giUgzgAgBbARQqpU74nzoJoFDXlhER6aDOP+SSF2BStMBgm0UHHdBFJBPAPwA8pJRq7PycUkoBCFjhRkQWikiZiJTV1NSE1Fgiov6qdbhhTbUgxWLu9tyZ5f/GSF0MKqCLSBJ8wXyFUuo1/+FTIjLE//wQANWBXquUWqaUKlVKldpsNj3aTEQUNLvTHXD8HAAKDLb8P5gsFwHwEoB9Sqmfd3rqTQD3+L+/B8Ab+jePiCg0docr4HAL0Gm1aAINucwEsADAlSKy0//nOgBLAcwRkXIAV/sfExHFFLvDHXBREQDkpCUhyWyczaItfZ2glNoMQHp4+ip9m0NEpC+704WpIwMvkzHaZtFcKUpEhtXuVahzupEfIGVRY6TNohnQiciw6pvd8Cr0OOQCGGtxEQM6ERlWnVNbVBQ4ywXwF+hqSqC0RSKieFTbyypRjc2aCrvTDU+7N1LNChsGdCIyLK0wV0956ICvh66UL1893jGgE5FhaXVcespDB4y1/J8BnYgMy+5wQQTITe89ywVgQCciimm1Tjfy0pNhNvW0lOZMD73aABOjDOhEZFh2h6vXCVHgzPg6e+hERDHMt+y/5wlRwLdZdHZakiEWFzGgE5Fh1TndffbQAS0XnQGdiChm1TpcvaYsamyZxlj+z4BORIbk9njR2OrpNWVRU5DFHjoRUcw6s+w/iCGXzBRUN7XCt/la/GJAJyJDqvXvQtTXpCjg66G3tnnjfrNoBnQiMiRtKX9vpXM1RllcxIBORIZk13roQUyKanuLxvvEKAM6ERlSv8bQ2UMnIopdtQ43ks0mWFP63Gmz0/J/BnQiopijLfsX6bmOiybbv1k0e+hERDHI7nQHlYMOACLSkboYzxjQiciQfD30vidENbasVPbQiYhiUa3Djfwge+iAb3ERAzoRUYxRSsHu7Lt0bmdGWP7PgE5EhtPsbkdrm7d/Qy6ZKahrdqMtjjeLZkAnIsPpyEHvx5BLQZZ/s2hH/G4WzYBORIaj1XEJpnSuxmaAnYsY0InIcLRedv/G0LXl//GbusiATkSGY3f6etnB5qEDxlj+z4BORIZTq/XQgyidq9GqMsbz8n8GdCIyHLvDjYxkM9KSzUG/JsViRk56krF76CLysohUi8juTseWiEiViOz0/7kuvM0kIgqeLwc9+N65Jt6X/wfTQ/8DgHkBjj+nlJri//O2vs0iIho4u8PdrwlRTbwvLuozoCulNgKoi0BbiIh0YXe6+zV+rrFlpqDGYeCA3osHReRT/5BMrm4tIiIKkd3hCmrrua4KslJR3eiK282iBxrQnwcwBsAUACcAPNvTiSKyUETKRKSspqZmgJcjIgqO16tQ5xzYkIstMwUujxdNcbpZ9IACulLqlFKqXSnlBfB7ANN7OXeZUqpUKVVqs9kG2k4ioqA0trbB41XIG8CQS0GWf+eixvgcdhlQQBeRIZ0e3ghgd0/nEhFFkpaDPpAhl3hf/t/nZnsi8mcAlwPIF5FjAH4I4HIRmQJAATgK4OthbCMRUdDs/knNgUyKdvTQ4zR1sc+ArpS6PcDhl8LQFiKikNmd/a/jorFl+uq5xGsPnStFichQQgnoWWkWJFtMDOhERLFAG3LJS+9/QNc2i2ZAJyKKAXaHG7npSbCYBxbebNb4XVzEgE5EhmJ3uvpVNrerAmtKYqUtEhHFqlqHe0CFuTTsoRMRxYiBLvvXFFhTUed0w+2Jv82iGdCJyFAGWphLo+1cpO16FE8Y0InIMNravahvbhtQyqKmwBq/y/8Z0InIME43aznooffQ4zF1kQGdiAzDrtVxCSXLxb/8Px4nRhnQicgwtIAeSg9dG3/nkAsRURRpE5mh5KEnW0zITU9CjSP+CnQxoBORYYRSOrezAmsqe+hERNFkd7hgMQmyUpNCep94XVzEgE5EhmF3uJGXkQyTSUJ6n3hd/s+ATkSGYXe6QpoQ1Wg99HjbLJoBnYgMw+50hzx+DvgCutvjRWNLfG0WzYBORIZhd7gxKIQMF03H4qI4y3RhQCciw7A79BlyKbD6tqKrjrPVogzoRGQILe52ON3tIeWga+J1+T8DOhEZgraoSI8x9I7l/wzoRESR17HsP4TSuRprigUpFhOHXIiIokHroYdSOlcjIr7URQZ0IqLI66i0qMOkKOBfXNTELBciooizO7VKi6H30AGwh05EFC12hwtpSWakJ1t0eb8CayrH0ImIokGr46IXmzUF9c1tcHnadXvPcGNAJyJDqNVp2b9G21tUG5uPBwzoRGQIeq0S1WiLi+Jp2IUBnYgMQa86Lhpt+X88TYwyoBNR3FNK6VY6V3Omhx4/qYt9BnQReVlEqkVkd6djeSKyVkTK/V9zw9tMIqKeNbk8aGtXuo6hD8pMhojxeuh/ADCvy7FHAKxTSpUAWOd/TEQUFR3L/nUM6ElmE/LSk401hq6U2gigrsvhGwAs93+/HMB8ndtFRBQ0u3//Tz3quHQWb4uLBjqGXqiUOuH//iSAQp3aQ0TUb7X+HrqeeeiAL6AbqofeF+XbdK/HjfdEZKGIlIlIWU1NTaiXIyLq5kzpXP176LUJENBPicgQAPB/re7pRKXUMqVUqVKq1GazDfByREQ9s4eph15gTUVNU/xsFj3QgP4mgHv8398D4A19mkNE1H92hwtZqRYkW/TNxLZZU+Bu96KhpU3X9w2XYNIW/wzgQwDjROSYiNwLYCmAOSJSDuBq/2MioqjwLfvXd7gFOLP8P14mRvssS6aUur2Hp67SuS1ERANS53DrmrKo6bz8v6TQqvv7602fOpNERCFYtaMKT68+gOP1LRiak4ZFc8dh/gVFQb/e7nRhdH6m7u2Ktx46l/4TUVSt2lGFxa/tQlV9CxSAqvoWLH5tF1btqAr6Pexh76HHx/J/BnQiiqqnVx9AS9vZNcdb2trx9OoDQb2+3atQ16xvYS5NZooFqUkm9tCJiIJxvL6lX8e7Ot3shlLQtTCXRkTiauciBnQiiqqhOWn9Ot5VOOq4dBZPy/8Z0Ikoqv5tZnG3Y6kWExbNHRfU68NVx0VTwIBORBScWocbJgEGZ6V2HLthSlHQWS61Tl8PXc/SuZ3FUz0Xpi0SUdS4PO1YWfY5rp5QiGV3l0IphS+/8CHWH6hGs9uD9OS+Q1Sd1kMPwxg64OuhN7T4NotOsZjDcg29sIdORFGzes8p2J1u3HnRSAC+ScjF145HdZMLL28+EtR72J2+Hn5OWlJY2njstG9ydtxj72Lm0vf7lU4ZaQzoRBQ1r26twPC8NMwem99xrLQ4D3MmFuKFDYdR5x9O6U2tw428jGSYTKJ7+1btqMJr288E8IHkyEcSAzoRRcWhage2HK7DHdNHdgvG35s3Ds1uD379fnmf72N3uMI2Ifr06gNwt3vPOtafHPlIY0Anoqh4dWslksyCW0qHdXtubIEVt5YOxytbKvB5XXOv72N3hmeVKBB6jnykMaATUcS1trXj79s+x9xzB/dYJfGhq8+B2SR4Zk3vvWG7wxW2CdFQc+QjjQGdiCLurU9PoLHVgztnjOzxnMHZqfjazFF4Y+dx7K5q6PE8uyM8y/4BYNHccUhLOjuzJS3JHHSOfKQxoBNRxK3YWoHRtgxcNDqv1/Puv3wMctKT8LN39wd83uVpR5PLE7Yc9PkXFOHJmyZ1vH9eejKevGlSvypBRhIDOhFF1J7jDdhRWY87Z4yESO+ZKVmpSXjwirHYVF6LTeXd9yTWsmDCNeQC+IL6h4uvQmaKBfMmDY7ZYA4woBNRL1btqMLMpe9j1CP/1C0H+9WtlUixmHDz1OAC44KLR6IoJw1L39kPr/fsvT076riEachFk2Q24aLRedhcXhvW64SKAZ2IAtKjTnlXDpcHq3ZU4frzhyInPbggnGIx4ztzz8Ge443430+Pn/Vcbccq0fAGdACYNTYflXXNqLT3nnUTTQzoRBRQqHXKA3ljZxWc7nbcedGIfr3uhslFmDgkC0+vPgCX50ybzvTQwzfkopl9jg0AsOlQ96GfWMGATkQBVemcg62UwootlZgwJAsXDM/p12tNJsEj147HsdMtWLGlsuO43Rm5Hvro/AwMzU7FpoOxO+zCgE5EAWX3UBtloDnYnxxrwN4Tjbhzxog+J0MDmV2Sj5ljB+HX75ejsbUNgK+HnmwxITMl/HUGRQSzSvLxwWe1aO8ylh8rGNCJqJsPPqtFU2sbupZHMQnw8DXnDOg9V2ypQHqyGTdMGTqg14sIHpk3Aaeb27Bsw2EAvjou+RnJA/oFMRCzS2xobPXg02P1EblefzGgE9FZPq9rxgMrtmOMLRM/vXESinLSIPD12L0KqOxjKX4gDc1t+N9Pj+OGKUWwpg68KuKkYdn44uSheHHzYVQ3tqLOGb5VooHMHJsPEcRstgvroRNRB6fLg/v+WIZ2r8Lv7y5FcX4Gbpvum8BUSmHR3z/FL94rx/jBWZh33uCg3/e1HcfQ2ubFnTP6NxkayKJrxuHd3Sfw3HvlYa3jEkheRjLOHZqFTeW1+I+rSiJ23WCxh05EAHwB+zsrP8HBU034zR1TUZyfcdbzIoIn5p+HycNz8F9/24n9JxuDft8VWysxeXgOzivKDrmdIwal484ZI/HXjyux61gD/u9ATUTrlM8aa8P2ytNwuDwRuV5/MKATEQDgN+8fwju7T2LxtRNwqT9Fr6vUJDOWLZiGzBQLFv5xG+qb+65X/tGROhyqdujSO9eMtWXCqwBtajKSdcovLcmHx6uw9bA97NfqLwZ0IsKaPSfx7NqDuPGCIvz77FG9nluYlYoXFkzDyYZWPPjqDni61AvvasXWSlhTLfji+QObDA3k+Q2fdTsWqTrl04pzkZpkwqYYHEdnQCdKcOWnmvDtv+7E+cOy8eRNk4LKGJk6IhdP3HgeNh+qxZPvBC6cBfhWcr6z+wRunjoMacn67ccZzTrlKRYzpo8aFLC2TLQxoBMlsIbmNtz3xzKkJVvwuwXTkJoUfNC9tXQ4vnpJMV7afAR/33Ys4Dl/33YMbe1K1+EWIPp1yi8tycdnNU6caIitjS4Y0IkSlKfdiwf/vB1V9S343YKpGJLd/2D4/S9MwCVjBuHR13dhR+Xps57zehVe3VqJ6aPyUFJo1avZAKJfp3xWiW8P1FgbdmFAJ0pQT60+gE3ltfjRDedh2sje65L3JMlswv/cMRWFWSm4/5VtqG5s7Xhu86FaVNY16947B87UKddy5Ity0iJap3xcoRU2a0rM5aOHlIcuIkcBNAFoB+BRSpXq0SgiCq/XdxzDso2HcffFI3H79NACbm5GMn5/dylu+u0H+Por2/CXhRchxWLGq1srkZeR3K989f6Yf0FR1GqTiwhmjc3HhoM18HpVt02uo0WPhUVXKKVi69dUFKzaUYWnVx/A8foWDM1Jw6K542K6ED4lHu3fqFZ0a4wtAz+4fqIu7z1+cBaevWUyvrFiOxa89BEq7c042diKzBQL3tl10pCfhdkl+Xh9RxX2nmjUJb9eDxxy0UE46kYT6anzv1FN1ekW/PPTE7pd49pJQ3DNxEJ8dKQOJ/1DLw6Xx7CfhVljfePomw/FTn821ICuAKwRkW0islCPBsWjp97dr3vdaCI9Bapt3urx6v5vNNBmzkb9LBRkpWJcoTWm0hdDHXKZpZSqEpECAGtFZL9SamPnE/yBfiEAjBih/+RItNQ3u7H+QDXW7j2F4w2tAc+JRE4sUTAilbd9IsE+C7NL8vHHLRVobWvvV8pnuIQU0JVSVf6v1SLyOoDpADZ2OWcZgGUAUFpaGptFhIP0eV0z1uw9hbV7T+Ljo6fR7lWwWVOQnmxGs7u92/mRyokl6suQ7NSAHQ+9/40OzUkLuDGGUT8Ls0ry8eLmI/joSF2P5RIiacABXUQyAJiUUk3+768B8CPdWhYDlFLYVdWAtXtPYe3eU9h/sgkAcE5hJu6/bDTmTByM84uy8eYnx7H4tV1n/Zc21WKKWE4sUV8uHJWHN3aevR9nOPK2F80d1+2zEMn88EibMWoQks0mbD5UG98BHUAhgNf9y4QtAF5VSr2rS6uiyOVpx5bDdVi79yTe21uNk42tMAlQWpyHx74wAXMmFmLkoLOr0Gkz+J0zCL42a5QhZ/Yp/jS0tGHDwRqMG2yFo9UT1kyszp+FRMj4Sks2Y9rIXGw8WINHr5sQ7eYMPKArpQ4DmKxjW6KmobmtYzx8w8EaOFwepCebcWmJDXMmFuLK8QXIzei95rKWE9va1o6LnlyHihjeGZwSywsbPkN9cxteuXdGRNLropkfHg2zz8nHU+8eQE2TCzZr5DbbCMTwG1z0lB/+eV0z3tvnG0r56EgdPP7x8C9OHoI5EwtxyZj8AU1ypCaZ8eWpw/CHD46iuqkVBdbUMPxURME52dCKlzcfwfwpQ2MmV9poZo+14SkcwL8O1Ub9F5mhA7qWe6uN51XVt+A7Kz/BU+/u75ggKinIxMJLR2POxEJMHpajy4qv22eMwIubj2Bl2TE8cMXYkN+PaKCeW3sQSgEPX2PMMexYcO7QLOSmJ2FTOQN6WAXKvfV4FWodbnz/Ot94eNddWfQwxpaJS8YMwqtbK3H/ZWNgjpFlwZRYyk81YeW2z/HVS0ZheF56tJtjWCaTYObYfGwqr4FSKmIbVgdsS9SuHAE95b62tXtx36WjwxLMNXfOGImq+hZsPBg7iw4osfzs3QPISLbgwSv5v8Rwm12Sj+omF8qrHVFth6EDek8TFJHIiZ0zsRD5mSlYsbUi7Nci6urjo3V4b98p3H/5GOT1MaFPoZtV4ktZjHY5XcMG9KbWtoDHI5UTm2wx4SsXDsP7+6sDLrQgChelFJ58ex8KrCn42szet5MjfRTlpGF0fgY2R7kMgCEDuter8NBfdsLudOOBK8ZErWbybReOgALw148qI3I9IgBYs/cUtlfW49tzztF12zfq3eySfGw5XAeXp/uq8Ugx5KToz9cexLr91fjRDefi7ouLsWju+Ki0Y3heOi4/x4a/fPw5/uOqEiSZDfn7k2KIp92Lp97djzG2DNwybVi0m5NQZpXYsPzDCmyvqMfFYwZFpQ2GizBvfXocv1l/CLddOBwLLhoZ7ebgzhkjUd3kwrp9p6LWhlU7qjBz6fsY9cg/MXPp+4YsZUo+K7cdw2c1Tnx33nhY2IGIqItG58FsEmw+FL1hF0P9je893ohFKz/FtJG5ePyGc6OaPqS5fJwNQ7JTsWJrdIZdWKs9cTS7PXhu7UFMG5mLayYWRrs5CceamoSpI3KiOjFqmIBe53Tjvj+WITstCc/fNRUpltgYO7SYTbjtwhHYVF6LCrsz4tcPlItv1PrUie7lzUdQ3eTC4mvHx0RnJhHNGmvDrqoGnHa6o3J9QwT0tnYvvrliG2ocLvxuwbSYW27/lQuHw2wSvBrhyVGlVI8ZNkatT52o6pxuvLDhMOZMLERp8cA2fKbQzSrJh1LAB5/Zo3J9QwT0J97aiy2H67D0pkmYPDwn2s3pZnB2Kq6eUICVZcciNgN+pNaJu1/+qMfnUywmHDvNAmJG8ev3y9Hs9uB787jEP5omD8uGNdUStXH0uA/of/24Ess/rMB9s0fhpqmxO6t/54yRqHO68e7uk2G9TmtbO37x3kHM/cVG7Kysx81Ti5BqOfuv2WISeBUw5+cb8cKGz9DW7g1rmyi8Pq9rxitbKnBr6XCMLbBGuzkJzWI24ZIxg7DxYC2Uivx+PnEd0LdV1OGxVbsxuyQf35sXndTEYM0am48ReelhnRzdXF6La3+5Cb94rxxzzx2MdQ9fhmdvnYKlN59/Vi7+M7dMxvpFl2NWST6WvrMfX/jVJnx8tC5s7aLwembNAZhNgoeuPifaTSH40her6ltwNAoltOM2D/1EQwu+/qftGJqTht/cPjXmU7RMJsEdM0Zg6Tv7UX6qCSWF+vWkqpta8cRb+/DmJ8dRPCgdf7p3OmaXnNk9paf61L+/uxRr957Ckjf34JYXPsStpcPwyLUTuFQ8juyuasAbO4/jm5ePweDs2Jo7SlSzx+YDADaX12BUGOtFBRJXAV2rbV5V34Iks8Akglfvm4Hs9KRoNy0ot0wbhmfXHMCKrZVY8qVzB/Qeneu7D8lOxcVjBmHN3lNwtXnxratK8I3Lx/SrjvuciYWYOXYQfrXuEF7cdBhr957C4msnwGIWPLvmYNh3nempXr3er4nltoXymqr6FpgEGJ7LaoqxYuSgdAzKSMZP3t6H/35jT0R3bZJIjvOUlpaqsrKyAb22a21zAEg2m/DUl8+Peg3i/vjPP+/A+gPV+OjRq/u9LDvQPQB8e5y+cNc0jLZlhtS2Ayeb8NiqXfj46GmYBPB2+qeRlmTWvWxCoJ+nr+sM5DWx3LZYvgc0MKt2VOHhlZ+gvdMHKNS/HxHZppQq7fO8eAnoM5e+HzAFrygnDf965MpQmxYxWw/b8ZVlW/D0l8/HLaXD+/Xanu7B0OxUfLD4Kl3a5/UqTP3xWtS3dC9upve97unnSbGYMG1kbsDXbKs4DZen+yRuLLctUq+Jt8+CUYUjVgUb0ONmyKWnvOl4y6eePioPYwsysWJrZb8Cem855Sf8uy/pwWQSNAQI5oC+99rr7fnncXm8PWbeBApkerfN0+7VtW2Rek28fRaMKpqxKm4C+tCctMC90wjUNteTiOCO6SPwo7f2YndVQ1D7PFbYnfjBG3t6fF7ve9DTvU5JMqGqvgVFIV5v34lGfP/1XT0+X5SThpX3XxLwuZ56P6lJZl32cN35eb3ubYvUa+Lts2BU0YxVsZ0a0smiueOQ1mWyL1K1zfV289RhSLGY+lw56vK041fryjHnuY3YXnEaN13QPac8HPcg0L22mATtXoWrn92AZRsHlrvudHnw07f34fpfb8ZRezPumD6i3z9PT21zt3tx1bMb8KctFWeNXQaroaUNj63ahRt/+y/UOlz46iXFurQtVl5DkRPNvx/zkiVLwn4RzbJly5YsXLhwQK8dPyQLw3LTsKuqAY5WD4py0vDfX5wYl5NAqUlmVNib8dYnx3HPJcVItnT/vfrBoVrcu7wMb+86iXnnDcbLX70QN08bhmG56WG/B4Hu9eNfOheLr52Aw7UOLP+wAmv3nsKEIdZh4Yl4AAAGmUlEQVSgex1r9pzEvX/4GP93sAZfKR2OZQtKcf3kof3+eXpq26K547D3RCOWf1CBDQdrMKkoGwVZfffWlVJ4Y+dx/PvyMnx0pA5fvaQYz981DXPPHaxL22LlNRQ54fj7efzxx08sWbJkWV/nxc2kqNHsqDyNG3/7AZ6Yfx7u6lTmt6bJhZ++vQ+v76jCiLx0/Hj+ebjsHFsv7xR5a/acxJI39+B4Qytuu3A4vjdvPHJ7yF0/droZS97cg/f2VWP8YCuemH9e2GqNKKXw5ifH8eO39qLO6cY9lxTjv+acA2tq4LTWz2oc+MGq3fjgMzsmD8vGT26cFNQQGFGkGS7LxWiUUpj1s/WobmxFm1dhaHYqZo7Nx+o9J9HS1o5vXDYG37xibL9yyiPJ6fLgl+vK8dLmI8hOS8Kj102AWYBn/LnrQ7JTMW1kLt7bVw0A+PacEvzbzFER2eSjoaUNz6w+gFe2VqDAmoIffvFcuNraz2rbpGHZWL+/BilJJnx33njcMX0EzCZWKKTYxIAe41btqMKilZ+grct4b0lBJp6/axrGFoSWUx4p+0404rFVu7GtonvuOgBMKsrGCwumhTyROhDaBOee440B2zZtRC6eXzA15qpzEnUVbECPm0lRo3l69YFuwRzw9XzjJZgDwIQhWVj59YuRk5bULWACvrKu0QjmADBleA7eeGAmsnto28nG0LNiiGIJA3qU9JSTqmdOeaREKnd9ICxmExpjtG1EemNAj5KeskPiNZc4ln+eWG4bkZ4Y0KPEaLnEsfzzxHLbiPQUNytFjUbLSY1E1cBIiOWfJ5bbRqSnkLJcRGQegF8CMAN4USm1tLfzmeVCRNR/Yc9yEREzgP8BcC2AiQBuF5GJA30/IiIKTShj6NMBHFJKHVZKuQH8BcAN+jSLiIj6K5SAXgTg806Pj/mPERFRFIQ9y0VEFopImYiU1dTUhPtyREQJK5SAXgWg8w4Nw/zHzqKUWqaUKlVKldpssVVkiojISEIJ6B8DKBGRUSKSDOA2AG/q0ywiIuqvAeehK6U8IvIggNXwpS2+rJTqeVsdIiIKq5AWFiml3gbwtk5tISKiEES0fK6I1ACo0OGt8gHU6vA+8Yz3gPcA4D0AEuMejFRK9TkJGdGArhcRKQtm1ZSR8R7wHgC8BwDvQWcszkVEZBAM6EREBhGvAb3P3a8TAO8B7wHAewDwHnSIyzF0IiLqLl576ERE1EXMB3QReVlEqkVkd6djeSKyVkTK/V9zo9nGcBKR4SKyXkT2isgeEfmW/3gi3YNUEflIRD7x34PH/cdHichWETkkIn/1r1g2NBExi8gOEXnL/zih7oGIHBWRXSKyU0TK/McS5rPQl5gP6AD+AGBel2OPAFinlCoBsM7/2Kg8AB5WSk0EcBGAB/x15xPpHrgAXKmUmgxgCoB5InIRgJ8BeE4pNRbAaQD3RrGNkfItAPs6PU7Ee3CFUmpKp1TFRPos9CrmA7pSaiOAui6HbwCw3P/9cgDzI9qoCFJKnVBKbfd/3wTfh7kIiXUPlFLK4X+Y5P+jAFwJ4O/+44a+BwAgIsMAfAHAi/7HggS7Bz1ImM9CX2I+oPegUCl1wv/9SQCF0WxMpIhIMYALAGxFgt0D/1DDTgDVANYC+AxAvVLK4z8lEerx/wLAdwF4/Y8HIfHugQKwRkS2ichC/7GE+iz0Ju43iVZKKRExfKqOiGQC+AeAh5RSjb7OmU8i3AOlVDuAKSKSA+B1AOOj3KSIEpHrAVQrpbaJyOXRbk8UzVJKVYlIAYC1IrK/85OJ8FnoTbz20E+JyBAA8H+tjnJ7wkpEkuAL5iuUUq/5DyfUPdAopeoBrAdwMYAcEdE6JQHr8RvITABfEpGj8G33eCV8G7Qn0j2AUqrK/7Uavl/s05Ggn4VA4jWgvwngHv/39wB4I4ptCSv/OOlLAPYppX7e6alEugc2f88cIpIGYA58cwnrAXzZf5qh74FSarFSaphSqhi+vQfeV0rdiQS6ByKSISJW7XsA1wDYjQT6LPQl5hcWicifAVwOX0W1UwB+CGAVgL8BGAFf9cZblVJdJ04NQURmAdgEYBfOjJ0+Ct84eqLcg/Phm+wyw9cJ+ZtS6kciMhq+3moegB0A7lJKuaLX0sjwD7l8Ryl1fSLdA//P+rr/oQXAq0qpn4jIICTIZ6EvMR/QiYgoOPE65EJERF0woBMRGQQDOhGRQTCgExEZBAM6EZFBMKATERkEAzoRkUEwoBMRGcT/A0Czti8WeJzgAAAAAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -549,19 +549,19 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 26, 12: 25, 50: 20, 54: 13, 16: 13, 10: 12, 14: 10, 48: 10, 20: 10, 18: 8, 44: 7, 36: 7, 46: 6, 24: 4, 26: 4, 28: 4, 38: 4, 34: 3, 42: 3, 30: 3, 40: 2, 56: 2, 22: 2, 32: 2})\n" + "Counter({52: 34, 12: 28, 50: 14, 10: 13, 20: 11, 14: 11, 44: 10, 36: 8, 30: 8, 16: 7, 54: 7, 22: 7, 32: 5, 48: 5, 46: 5, 42: 4, 40: 4, 34: 4, 18: 3, 24: 3, 38: 3, 26: 3, 28: 2, 8: 1})\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl4W9WZP/Dvq8WWLNvyGsuxktjOCrGzQAg7IVBIoKWEMp2W0hZm5oFOS6ctpUyhM512pu0P2nSb+bVlBlqm0AY6UxoMBYJJWROWQBIncULi2FnsWN7keJUty1rO/CFdx3Fka/GV7qL38zx5Ystajm+i19fnfs97SAgBxhhj2mdQegCMMcbkwQWdMcZ0ggs6Y4zpBBd0xhjTCS7ojDGmE1zQGWNMJ7igM8aYTnBBZ4wxneCCzhhjOmFK54uVlJSIysrKdL4kY4xp3p49e3qFEKWx7pfWgl5ZWYndu3en8yUZY0zziKg1nvvxlAtjjOkEF3TGGNMJLuiMMaYTXNAZY0wnuKAzxphOcEFnjDGd4ILOGGM6wQWdMcZ0Iq0LixhjTEl1DS5srm9Cx4AXcwusuH/DUmxaXaH0sGTDBZ0xlhHqGlx4cGsjvP4gAMA14MWDWxsBQDdFnadcGGMZYXN900Qxl3j9QWyub1JoRPLjgs4YywgdA96EbtciLuiMsYwwt8Ca0O1axAWdMZYR7t+wFERn32Y1G3H/hqXKDCgF+KIoYywjrF8656zPK3SYcol5hk5E84jodSL6kIgOEdFXI7d/l4hcRLQv8ufG1A+XMcaS8+7xXggBLHPkwW414+0HrtFVMQfiO0MPALhPCLGXiPIA7CGi7ZGv/UwI8ePUDW/29J47ZYzF563mXuRmm3DTyrnYXN+EoTE/8i1mpYclq5gFXQjRCaAz8vEwER0GoImKmAm5U8ZYfHY29+KS6iJUFtsAAK5+L/LL9VXQE7ooSkSVAFYD2BW56ctEdICIHieiQpnHNmuZkDtljMXWdnoUbX2juGJRCZyF4VRLe79+4oqSuAs6EeUC+BOArwkhhgA8AmAhgFUIn8H/ZJrH3U1Eu4lot9vtlmHI8cuE3CljLLYdLeHac+WS0kkFfVTJIaVEXAWdiMwIF/MtQoitACCE6BZCBIUQIQCPAVgb7bFCiEeFEGuEEGtKS2NuWi2rTMidMsZi23G0F3PtFlSX2FBky4LVbMzMM3QiIgC/AXBYCPHTSbeXT7rbLQAOyj+82bl/w1JYTGd/i3rLnTLGZhYMCbxzrBdXLC4BEYGI4Cy06vIMPZ6Uy+UAPgegkYj2RW77FoDbiGgVAAHgJIAvpGSEs7BpdQWGx/z49nOHAACludn4p4+exxdEGcsgB9oHMDQWwJWLz8wQhAu6/s7Q40m57ARAUb70kvzDkV9NhX3i4x/cUoPrlzsUHA1jLN12NveCCLh8UcnEbc7CHOxtG1BwVKmh+6X/k38Kdw2NKTgSxpgSdjT3YvncfBTZsiZucxZaMej1Y2jMr+DI5JcxBd1AQOcgF3TGMonHF8Detn5csejsQIazMAdAOIuuJxlQ0EdRkGNGud2KLi7ojGWUXcdPIxASuGpxyVm36zWLrvvmXO39XjgLrbCYjFzQGcswO5p7YTEbcGHl2ese9ZpF1/0ZumvAC2dBDhx2C8+hM5ZhdjS7sbaqGNkm41m36zWLruuCLoRAe/8onIVWlNst6Bz0Qgih9LAYY2nQOejFMfcIrlxUcs7X9JpF1/WUy+mRcYz5Q3AWWhEICYz5QxjyBmDP0VdDHsbYuXY09wIArlxybkEH9JlF1/UZuvSP5SzMQbk9PGfWOaSvf0DGWHQ7m3tRmpeNpWV5Ub/uLMzhgq4l0q9TziIrHHYLAI4uMpYJQiGBnS29uGJReLl/NHrMouu8oId/+lYUnCnonHRhTP8+7BxC38g4rogyfy7RYxZd5wU9nEHPs5gxJy8bRFzQGcsEO1si8+eLZyro+sui67ygeyf+0cxGA0pzs7mgM5YBdjS7sbQsD3PyLdPeR49ZdP0X9IKcic/L7RZ0chadMV0b8wfxwcl+XDHD2Tmgzyy6bgv65Ay6pCzfgm4+Q2dM194/0YfxQGjG6RZAn1l03Rb0yRl0ibS4iDGmXztbepFlNODiquKY99VbFl23BX1yBl3isFsxNBbAiC+g1LAYYyn21lE3LlxQCGuWMeZ99ZZF13FBP5NBlzjs2QC4LzpjeuUe9uFI13DM+XOJ3rLoOi7oZzLoEkd++GOeR2dMn96OxBWvWhzfhvR6y6LruKCfyaBLynm1KGO6tqO5F4U5Ziyfmx/X/fWWRddxQfeedUEUwJnVojzlwpjuCCGwo9mNyxaVwGCIvtx/Kr1l0fVd0Cdl0AHAYjaiIMfMi4sY06HmHg96hn1R2+VOR29ZdF0W9GgZdIkj38JTLozpkNQuN94LosCZLDrPoatYtAy6pNxuQRe30GVMd3Y2u1FdYjsrqhwPZ6EV7QM85aJa0TLoEofdgq5BX7qHxBhLIV8giPeO9yV0di7RUxZdpwX93Ay6xJFvRa/Hh/FAKN3DYoylyN7WAXj9QVwZZ1xxMmehFQOjfgzrIIuu04J+bgZdIkUXuznpwphu7Gxxw2ggXFJdlPBjJ7LoA9o/S9dpQT83gy4p4+giY7qzo7kXq+cVRH3PxzIRXezjgq5K0TLoknLeuYgxXekfGUejazCp+XNAX1l0/Rb0guhXunkrOsb05Z1jpyEEkpo/B/SVRdddQZ8pgw4Aedkm2LKMnEVnTCd2triRZzFhpdOe1OOJCBU6aaOru4I+UwYdCP/jldktfFGUMR0QQuCto724tLoYJmPy5UwvWfSYR4CI5hHR60T0IREdIqKvRm4vIqLtRNQc+bsw9cONbSLhMsPiAt7ogjF9OHl6FK4Bb8zdiWLRy0YX8fxICwC4TwhxPoBLANxDROcDeADAq0KIxQBejXyuuIkM+jRn6EA4i85z6IxpW12DC5t++TYA4BevtaCuwZX0czkLc3SRRY9Z0IUQnUKIvZGPhwEcBlAB4GYAT0Tu9gSATakaZCLOnKHPUNDt2ege9iEYEukaFmNMRnUNLjy4tRGD3nAB7h724cGtjUkXdekEUOtZ9IQmnYioEsBqALsAlAkhOiNf6gJQJuvIktTePwq71Yz8GfKoDrsVwZDAaQ+3AGBMizbXN8HrD551m9cfxOb6pqSeT1pcpPUsetwFnYhyAfwJwNeEEEOTvyaEEACinu4S0d1EtJuIdrvd7lkNNh4zZdAl5fm80QVjWtYxzZn0dLfHopcselwFnYjMCBfzLUKIrZGbu4moPPL1cgA90R4rhHhUCLFGCLGmtDS5nGgiXHEUdAfvXMSYps2N0tZjpttjKbZlwWI2aP7CaDwpFwLwGwCHhRA/nfSl5wHcEfn4DgDPyT+8xIQz6N6Y7TMd3M+FMU27f8NSmKbsSmQ1G3H/hqVJPV+4L7r2uy7Gc4Z+OYDPAbiGiPZF/twI4GEA1xFRM4CPRD5XVN/IOLz+YMwz9KKcLGQZDXyGzphGbVpdgVqnHUYDgRBuxPfQJ2qxaXVF0s+phyy6KdYdhBA7AUy3Qd+18g5ndmbqgz6ZwUAos2eji7PojGmWdzyIdUtK8fidF8nyfM5CK/adGpDluZSiq5WiZwp67Hk03oqOMe0KhgSO945g0Zxc2Z5TD1l0nRX08K9LM2XQJQ67lefQGdOoU32jGA+EZC7o2s+i66yge2Nm0CXh5f9jCCcuGWNa0tzjAQDZz9ABbWfRdVbQp++yOFVZvgW+QAgDo9r99YqxTNWSkoKu/Sy6zgp67Ay6pJx3LmJMs5p7huHIt8T123i89JBF101BjzeDLuGNLhjTrmM9HlnPzgF9ZNF1U9DjzaBLynm1KGOaJIRASwoKOqD9LLpuCnq8GXRJaW42DMRTLoxpTefgGEbGg6kr6HyGrrxEMugAYDIaUJrHi4sY0xop4bI4JQVd21l0HRX0+DPoEofdylMujGlMc/cwAHkTLhKtZ9F1VNDjz6BLHPnZfFGUMY055vagyJaF4txs2Z9b61l0HRX0+DPoknK7lefQGdOY5m4PFpXKf3YOaD+LrqOCHn8GXeKwWzA8FoDHF0jRqBhjchJCoLnHg0VlqSnoWs+i66KgJ5pBl5RzFp0xTen1jGPQ60/ZGbrWs+i6KOiJZtAlZfm80QVjWiIt+V+cojN0IDztwhdFFZRoBl3Ci4sY05aWnnDCZfGcvJS9RjiLznPoikk0gy6RztA5i86YNrT0eJCbbUJZvvwJF4mzMAf9o35NXlvTSUFPPIMOABazEYU5Zj5DZ0wjmiNL/sNbHafGRBZdg/PoOinoiWfQJbzRBWPa0ZyiHi6TTWTRNTjtopOCnngGXSJtdMEYU7fBUT/cw76ULPmf7EwWnc/QFZFMBl3isFs4tsiYBrS4U7fkf7IzWXQ+Q0+7ZDPoEke+BadHxuELBGUeGWNMThORxRQmXABtZ9E1X9CTzaBLpI0ueoZ8cg6LMSaz5m4Psk2GhMMPydBqG13NF/RkM+gSzqIzpg0tbg8WlubCaEhdwkWi1Sy6jgp6kmfo+VJB195PY8YySXO3J6UrRCfTahZdBwU9uQy6RJpy4egiY+o14gvANeBNWQ+XqbSaRddBQfci32JKevfvPIsZudkmnnJhTMWOu0cApLaHy2RazaLroKCPJj1/LinjjS4YU7XmnvREFiUVBdrMomu+oLsGks+gS3ijC8bUraXHA5OBsKDYlpbXK8nNQrZJe1l0TRf02WbQJby4iDF1a+7xoLLEBrMxPSUrnEXXXnRR0wW9f9SP0fHkM+iScrsFPcM+BENCppExxuR0rMeT8iX/U2lxcVHMgk5EjxNRDxEdnHTbd4nIRUT7In9uTO0wo5N+HZptQS/LtyAYEuj18OIixtTGFwji5OmRtM2fS7SYRY/nDP23ADZGuf1nQohVkT8vyTus+Mx2UZGEFxcxpl4ne0cREum7ICrRYhY9ZkEXQrwFoC8NY0nYbDPoEoedN7pgTK2a07BLUTRazKLPZg79y0R0IDIlUyjbiBIgZdDt1uQy6JIzq0X5DJ0xtWnu9oAIqC5NT8JFcqaNrnamXZIt6I8AWAhgFYBOAD+Z7o5EdDcR7Sai3W63O8mXi06OhAsAFNmykGU0cHSRMRVqcXswvygHFrMxra97ZnGRzs/QhRDdQoigECIE4DEAa2e476NCiDVCiDWlpaXJjjOq2WxsMRkRcXSRMZVq6fakbcn/ZFrMoidV0ImofNKntwA4ON19U0WuDLrEwTsXMaY6gWAIJ3pHsChNS/4n02IW3RTrDkT0NICrAZQQUTuA7wC4mohWARAATgL4QgrHGJVcGXSJI9+C/e0DsjwXY0webX2jGA+GFDlDB7SXRY9Z0IUQt0W5+TcpGEtC5MqgS8rtFrx8aAxCiJTuKM4Yi9/ELkVl6U24SJyFVhzQ0ImeZleKypVBlzjsFowHQugf9cvyfIyx2WuOFPSFaU64SLSWRddwQZcngy7hjS4YU5+WHg/K7RbkJdkee7a0lkXXcEGXJ4Mu4Y0uGFOflh5P2leITqa1LLqmC7pc0y1AuIUuwIuLGFOLUEiooKBrK4uu4YIuTwZdUpKbBQOBs+iMqUTHoBdefzDtS/4n01oWXZMFXe4MOgCYjAbMyePFRYyphXRBVMkzdK1l0TVZ0OXOoEscdgsv/2dMJY5JkUUFCzqgrSy6Jgu63Bl0STmvFmVMNZq7PSi2ZaHQlqXoOJyFVrgGtFHQYy4sUiO5M+iSsnwLdjb3JvXYugYXNtc3oWPAi7kFVty/YSk2ra6QdXyMZZIWt7IXRCWDXj/6RsZR+cCLqFD5e1vTZ+hyZdAl5XYLhn0BDI8ltriorsGFB7c2wjXghUB44+oHtzairsEl6/gYyxRCCDR3Dyte0OsaXKg/1DXxudrf2xot6PJm0CXJZtE31zfB6w+edZvXH8Tm+ibZxsZYJnEP+zA0FlB8/nxzfRP8wbP3Glbze1uzBV3u6RYg+Y0uOqaZX5vudsbYzFomEi7KRRYB7b23NVrQ5c2gS6TFRYlGF+cWRB/LdLczxmbWPNGUS9kzdK29tzVX0FORQZfMyc8GkHhBv+OyBefcZjUbcf+GpbKMi7FM09LjQZ7FhDl52YqO4/4NS2GdslOSmt/bmivoqcqgA4DFbESxLQudCc6h7zs1gCyTYWLKhgj4/qYa1V4JZ0ztmnvCF0SVbmW9aXUFHvpE7URRryiw4qFP1Kr2va25gp6qDLqkLN+C7gTO0Bva+vFSYxe+uG4h3vvWtfivz10IIcLPwxhLTkvPiOIXRCWbVlfg79ctBBHw6n3rVFvMAY0V9LoGF+58/AMAwD/XHUxJdCiRxUVCCDy07QhKcrNw11XVAIB1S0qRk2XEtoOdso+NsUzQPzKOXo9P8cjiZFWlNggR3kFJzTRT0KWsd9/oOACgZ9iXkjxoIsv/X2/qwfsn+vCVaxcjNzu8RstiNmL9sjmoP9SNYEjEeAbG2FQtbmnJv7IJl8mqisMbbBx3jyg8kplppqCnK+vtyLegb2QcY1Nea6pgSOCH25pQWZyD29bOP+trN9Q40OvxYU9rv6xjYywTtKigKddUlSXhEMaJXi7oskhXHlRaXNQz5Jvxflv3tqOpexjf2LAUZuPZh3H90jnINhnwUiNPuzCWqOZuDyxmAypUFA3Ms5hRmpeNE70epYcyI80U9HTlQc9sdDH9D4oxfxA/3X4UK512fLS2/Jyv27JNuGpJKeoPdSHE0y6MJaTF7cHC0lwYDOrarL2qxMZn6HJJVx5UOkOfaR79iXdOonNwDN+8Ydm0saobahzoHBzDfg3tGM6YGrR0D6sm4TJZVbENJ3r5oqgspDxoRYEVhNTlQScK+jRJl4HRcfzy9RZcvbQUly0smfZ5rj2vDGYj4eWDXdPehzF2No8vgI7BMSwuU88FUUlVqQ29Hh+GEmzel06aap+7aXVFyjOgudkm5GWbpo0uPvLGMQz7AvjmxmUzPo/dasZlC0uw7WAXHpjhTJ4xdoa0qcXCUhWeoZeEky4ne0ewwlmg8Gii08wZejo57NG3onMNePHf75zELasrcF55fsznuaHGgba+UXzYOZSKYTKmOy0q6eESTXWkoKt5Hp0LehQOuyXq8v+fbT8KALjv+vjm7a87vwwGAk+7MBan5h4PzEbCgiL5ezXN1vziHBBxQdccR5Tl/0e6hvCnve2449IFccepinOzcXFVMccXGYtTS88wqkpsMBnVV5qyTUZUFFi5oGtNud2CnuExBIKhidt+9HIT8rJNuGf9ooSe68ZaB465R9DcPSz3MBnTnZYedWw7Nx21Rxe5oEdRZrcgJAC3J7y46L3jp/HakR58af0iFOQktmHthuUOEAHbeNqFsRmN+YNo6xtVfFOLmVSX2HDCPQIh1Lm+hAt6FOWTootSA65yuwV3XlaZ8HPNybfgwvmFXNAZi+FE7whCQl1L/qeqKrFh2BdAr2dc6aFExQU9Ckf+mZ2Lth3swv5TA7j3uiWwTFnYFK+NNQ4c7hxC62n1/qrGmNImdilScUGvlKKLKn0vxyzoRPQ4EfUQ0cFJtxUR0XYiao78XZjaYaaXdIbe3u/F5vomLCnLxa0XOJN+vo01DgA87cLYTFp6PDDQmby3GlWXhH/YnFBp18V4ztB/C2DjlNseAPCqEGIxgFcjn+vGG009AIAfvHQYJ3pHsG5JKYyz6CvhLMzBCqddloJe1+DC5Q+/hqoHXsTlD7+Wkp7wjKVbXYMLj751DCEBXPuTN1X7/7qi0AqzkXBcpRdGYxZ0IcRbAPqm3HwzgCciHz8BYJPM41JMXYML33r24Fm3/e7d1ln/B9tY48D+UwNwzaI7pNQT3jXghUB4oVMqesIzlk7S/+sxfzhVpub/10YDYUGxTbVdF5OdQy8TQkjh6i4AZTKNR3HR+q6PBUKz7rt+Q024K+NsFhmlqyc8Y+mktf/XlcXqjS7O+qKoCOd3ps3wENHdRLSbiHa73e7ZvlzKparvelWJDcsceXh5FlvTpasnPGPppLX/19WlNpw8ParK1tjJFvRuIioHgMjfPdPdUQjxqBBijRBiTWlpaZIvlz6p7Lu+scaB3a396BmOfxPqyUpys6PeLndPeMbSKV17HcilqsSG8UAIHTPsmaCUZAv68wDuiHx8B4Dn5BmO8lLZd/3G2nIIAdQf6k74sac9PgRCIUy9NJuKnvCMpdPfXF55zm1q/n9dpeImXfHEFp8G8C6ApUTUTkR/B+BhANcRUTOAj0Q+14VU9l1fPCcX1aW2hKdd/MEQvrhlL0bHg7j3uiVw5IdjlfkWU0p6wjOWTr2ecRgo3EMplXsdyEXNXRdj9kMXQtw2zZeulXksqpGqvutEhBtqHPjPN4+jb2QcRbb42gh874UP8f6JPvz8U6uwaXUFvnLtYlz5o9ewwlmg2v/0jMVjPBDCH3efwkfOK8Ojn1+j9HDiUpqXDVuWUZUFnVeKptkNNeUIhgS2fxhf2uXp99vw5LutuPuq6rOK94qKAjS2D6ZqmIylRf2hLpweGcftlyxQeihxIyJUqrRJFxf0NFs+Nx/OQmtci4x2n+zDvzx3EFcuLjlnh6Rapx1tfaMYGFVnTwnG4rFlVyvmFVlx5aLpt3NUI7V2XeSCnmbStMvbLb0Y9E6/N2HnoBd///u9qCiw4he3XXDOStUVFXYAQKOLz9KZNrX0ePDe8T58Zu0CGGaxElsJ1SU2nOobxXggFPvOacQFXQEba8rhDwq8diR62mXMH8QXfrcHY/4gHvv8GthzzOfcZ3mkoB/gaRemUU/taoPZSPjkmuT7JCmlssSGkADa+kaVHspZuKArYPW8ApTlZ2Nb47nTLkIIPLi1EQfaB/GzT62advdzu9WMyuIcnkdnmjTmD+KZPaewYblj2vUVajZ5w2g14YKuAIOBsHG5A28edWPEFzjra7/ecQLPNrhw33VLcN35M3dUqHUW8JQL06QXDnRiaCyA2y/WzsXQydSaReeCrpCNNeXwBUJ4o+lMO4S3jrrx0LbDuLHWgS9fE3uruxUVdrgGvOiN7KzEmFZs2dWK6lIbLqkuUnooSSnIyUKRLUt1XRe5oCtkbVURim1ZeCmyyOhk7wi+/NReLCnLw+a/Wgmi2BeJap18YZRpz6GOQTS0DeD2ixfE9f9crcJJF3V1XYy5sIilhtFAWFKWh5cOdKLywIswGQjZJgMe+/wa2LLj+2dZPjcfREBj+yDWL52T4hEzJo+ndrUh22TArRdoe1FcZbENO1vU1XCQz9AVUtfgwp7W/ok2lYGQgD8osKe1P+7nyLOYUV1i46QL0wyPL4C6Bhc+tmJuwhuuq011qQ3dQ75zroMpiQu6QjbXN2E8eHaGdTyYeN/1Fc4CNLoG5BwaYynz3D4XRsaDuP2S+UoPZdaqVLi/KBd0hcjVA7q2wo7uIR+6h5JryctYugghsOW9NpxXno/V8wqUHs6sqTHpwgVdIXL1gF4hXRjlaRemcvvbB/Fh5xBuv3i+pi+GSiqLIwVdRRtGc0FXiFx918+fmw8DAQc46cJUbst7rcjJMuLmVXOVHoosrFlGlNstOKGiKRdOuShE6py4ub4JHQNezC2w4v4NSxNuh5uTZcLiOXlobOd5dKZeg6N+/PlAB25Z7USe5dxWFlqltiZdXNAVJFff9VqnHW809UAIoYtfZZn+bG1ox5g/hNsv1v7F0MmqSmx4sTH5fYLlxgVdB1Y47XhmTzs6B8dUuw9jpqhrcM36ty41keP7EUJgy642rJxXgJpIUzm9qCqxYWDUj/6RcRTGuWFNKvEcug7UcudFVahrcOHBrY1wDXghALgGvHhwayPqGlxKDy0pcn0/75/oQ0uPR3dn58CZpItaWgBwQdeB88rzYTIQ59EVtrm+CV5/8KzbvP5gwmsL1EKu72fLrjbkWUy4aYU+LoZOpraui1zQdcBiNmJJWR4aXUNKDyWjybW2QC3k+H56PT5sO9iJWy9wwppljP0AjZlXlAOjgVRzYZQLuk6scNrR2D4AIUTsO7OUkGttgVpMN25btgne8WDUr031zJ52+INCl9MtAGA2GjC/KIcLOpNXrdOO/lE/2vu1eTaoB/8QpeWxxWRIeG2BWtx1ZdU5txmJ4PEFcP3P38TrR3pmfHwoJPDUrjasrSqadqMWPagszuE5dCavWt5jVHHByG9HpZN24Ll0YbFmUy6D3nDTqbK8bBCAigIrfvLXK/H0XZcgy2jA3/z2A3zx93vQORj9JGJnSy/a+kZ1e3YuqSrJxcneEVX8dsyxRZ1Y6siD2Ug40D6IG2vLlR5OxhFC4PeRPiUvfeUKEBHu+9/9+POBDrgGvKjQ2LRLIBjCHz5ow1VLSvHk36495+vbvnoVHttxHP/xajPeOurGvdctwZ2XVcJkPHOO+NSuNhTZsrCxxpHOoaddVakNXn8Q3UM+OOwWRcfCZ+g6kW0yYpkjn5MuCtl3agCHp/Qp+fr1SwAAP33lqJJDS8rrTW50Do7hM2ujn11nmQy4Z/0ibL93HS6qKsL3XzyMm37xNva29aOuwYVL/t+rePlQF8YDoah75+pJ9UR0UfnNLrig60it044D7YOq+NUv02zZ1QZblvGs6ZWKAivuvKwSWxvacaRLWwmkLbtaUZafjWvPm3njlPnFOfjvOy/CI7dfgP6Rcdz6q3dw3x/3oyvS/dPjC2g6ix8PNXVd5IKuIysq7BgeC6D19KjSQ8kog6N+/Hl/Bz6+qgK5U3ab+tLVC5GXbcIPtx1RaHSJO9U3ijePuvGpi+bDbIxdIogIN9SW4y/3rUNOthHB0NknFFrO4sfDkW9Btsmgiq6LXNB1RNpjlDsvptfWhnb4AtH7lBTkZOFL6xfh9SY33j12WoHRJe4PH7SBAHz6onkJPS4324RRX/Q4o1az+PEwGAhVJTZVbHTBBV1HlpTlIctk4M6LaRRPn5I7L6tEud2Ch7cdVv102HgghP/5oB3XLCtLKj+vtyx+vKpKbKqILnJB1xGz0YDzy/O5p0saxdOnxGI24t7rlmB/+yBeUvkFwu0fdqPX40t6izi5+vxRjFU9AAAPIElEQVRrTVWJDW2nRxGYsq1kunFB15kVTjsOugYRCqn7TFAv4u1TcusFTiwpy8Xm+iPwK/ymn8mWXa1wFlpx1eLSpB6/aXUFHvpELSoKrBPZ9Yc+UavZLH68KktsCISE4gv7ZpVDJ6KTAIYBBAEEhBBr5BgUS15thR1PvtuK470jWDQnV+nh6JrUp+T2ixfE7FNiNBC+uXEZ/u6J3fjD+2343KWV6RlkAo65PXjn2Gncv2EpjIbk++rL1edfS6onJV0qIx8rQY4z9PVCiFVczNVhhTO8+S7n0VMv0T4l1yybg7VVRfj3V5sx4gukeHSJe3pXG0wGwl+vSexiKFNPdJGnXHRmYakNVrOR59FTLJk+JUSEB25Yhl7POB7bcTzFI0zMmD+IZ/a2Y0ONA6V52bEfwM5SZMtCvsWk+YIuALxCRHuI6G45BsRmx2Q0YPncfDRyQU+pZPuUXDC/EDfUOPDYW8fhHvalaHSJe6mxEwOjft33XUkVIkJVaa7mC/oVQogLANwA4B4iumrqHYjobiLaTUS73W73LF+OxaPWacehjiHFr7jr2ZZdrUn3KfnGhqUYC4Tw/19rTsHIkrNlVxuqS2y4tLpY6aFoVlWx8m10Z1XQhRCuyN89AJ4FcE4XHyHEo0KINUKINaWlyV05Z4lZ4bTD6w/imApWrulR1+AY/nK4B5+80IlsU+KbNiwszcWnL5qHp3a1qWKnm8OdQ9jT2o/PTOpDwxJXVZKLjkEvxvzx9YpPhaQLOhHZiChP+hjA9QAOyjUwlrzaivCF0QO8wCgl/ueDUwiGBG6bpnFVPL567WKYjQZsfkX5JfFP7WpDlsmAWy9wKj0UTasqtUEIKNp6YzZn6GUAdhLRfgDvA3hRCPGyPMNis1FdYoMty8i90VNAait75eKSWcXT5uRbcNeVVXjxQCf2n1LuB++IL4BnG1z4WG25Knat17Iz0UXlui4mXdCFEMeFECsjf5YLIX4g58BY8gwGQk2FnZMuKfBGpK2sHBcP77qqGkW2LDy87YhiLQH+vL8DHl8g6ZWh7IzKiTa6yk2j8QYXOrXCaccT77bCHwzF1TFvqroGFzbXN6FjwIu5BVbcv2FpzMUi6XqMkrbsasWcvGxce17ZrJ8rz2LGV65ZhO/++UOs+f5f0DcynvZjsGVXG5Y58nDB/MK0vJ6e5WabUJqXrWjXRc6h61RNhR3jgRCOdg8n/Ni6Bhce3NoI14AXAoBrwBuzp3W6HqOkU32jeOOoG5++aF5SPySjyc02gQCcHhlP+zE40D6ARtfgWZtysNlRuusin6Hr1MSK0fZBLJ8bvQvgdDbXN8E75Uq91x/EN/90AH/ccyrqY3af7IcvEJLlMZvrm1R5li61lf3ULC6GTvWzvzRj6mRLuo7BlvfakDNlUw42O9UlNvzlcLdir88FXacWFOUgz2LCAdcgPp3gY6frXe0LhODzR8+2Ty3Ms3mMGntnn2krO0fW/UGn+15TfQwGvX48v78Dm1bPRZ7FnNLXyiRVJTb0esYx6PXDbk3/ceWCrlMGA6G2wp7UitHi3Cz0esbPub2iwIpnvnhZ1Mdc/vBrcEUpQsk8xmI2omdoDHPyld1wd7KJtrIXL5D1eecWWKMeg1T3D69rcMHrD+Iza+X9fjKddGH0ZO8IVs4rSPvr8xy6jtU67TjSNQRfIP6FDu39oxjzhzB1RjVWT+tk+mBHe4zJQPAHQ7j2J2/iiXdOnrOdmVK27GpFRYEVVy2Rd3FctGNgIODejyyW9XUmC2/K0YqVTvvELldMHlJ0Ual5dC7oOraiogD+oMDRrvhysd7xIO5+cg8IwAM3LEuop3UyfbCjPebHn1yJ7V9fh1XzC/Cd5w9h0y/fVrwvjdRW9ra182bVVjaaqcegMMeMkAD2pXBR2O7Wfhzt9uAz3LdFdvOLc0AEHFco6cJTLjq2YmKP0YGYZ2JCCNz/zH4c7hrC43dchPXL5uAL6xYm9HrJ9MGe7jFP/u1avHCgE//2woe4+Zc78blLFuC+DUuRr8B8b6rbyk49Bg9tO4z/evM4zi+3p6TobnmvFXnZJty0cuZNOVjisk1GOAutivV04YKuY85CKwpyzOEz3Itnvu8jbx7DCwc68c2Ny7B+2Zz0DHAGRISbVs7FuqWl+El9E558rxUvHezCv3zsfASCIfz4laMpz67XNbjwo5ePoGNwDBazAe8cO52WRMg/bliGI53D+M7zB7G4LBcXVRbJ8rx1DS48vO0IuobGYMsy4pVD3ZxwSYHKYptiBZ2nXHSMKHxhNNaK0deP9GBzfRNuWjkXf7+uOk2ji0++xYx/vbkGz91zORz5FvzD0w2474/7U55dlzLyHYNjAIAxfyht+XCjgfAft62GszAHX/z9HlkSL9L30zUU/n5GxoOqzvxrWXVJuKArsfqXC7rOrXDacbR7eNoOcMfcHnzl6QacX56PH926QrULTFY4C1B3z+WwW8NzzJNJuW05TZfFl/t1pmO3mvHY5y/EmD+Eu3+3G97x2XXwU/r7ySRVJTZ4fIGoSbFU44Kuc7UVBQiEBA53Dp3ztUGvH3c9sRtZJgMe/fyamPtiKs1oIAx5/VG/JmduOxAMRY0Syv06sSyak4eff2oVDnUM4YGtB5I+4/MFgqr4fjJFVWl4L18lpl24oOucdGF0aufFYEjga39oQFvfKH51+wWyLpZJpeny2RazET3DY7N+/n2nBvDxX7yd8OunykfOL8M3rl+K5/Z14NG3Et+27u2WXtzw8x3Tfj3d308mULLrIhd0nSu3W1CSm3XOPPqPX2nC601ufPfjy3GxhnapmS67Ph7Jrv/uvdaksuuDXj/+ua4Rt/zqbZwe8eHOyyphMZ399oiVq0+VL129EB+tLccPXz6CN5p64nqMe9iHr/2hAbf/eheCQuALV1UnvE6AJWdugRVZRoMiXRc55aJz0oXRyVnuP+/vwCNvHMNta+fjs5doa6WglMqY2qFxhdOObz93EN+uO4hn9rTjB5tqUFMRe9GMEALP7evA91/8EH0j47jzskp8/bolyLOYsWpegSo6QRIRNn9yBY73juAfnm7Ac/dcjurIr/VTBUMCT73fhh+9fAQ+fwhfuWYRvrR+ESxmI84rz1fF96N3RgNhfnGOIl0XKZ1XYtesWSN2796dttdjYT/dfhS/eK0ZB/91A467R/BX//kOauba8dRdlyDLpJ9f0oQQeH5/B773Qrg43zGpOEdzzO3Bt+sO4p1jp7HSaccPbqmN64eAUk71jeLjv9iJIlsW6u65/Jzv66BrEP9UdxD7Tw3gsoXF+N6mGiycpvCz1Lrryd1oPT2CV+5dJ8vzEdEeIcSamPfjgq5/33/hQ/x65wkAgJEIeRYTtn99HUrzshUeWWoMev34cX0Tfh/pXf6dm5bD5w9OZNfL7RbUOu14/Ygb2WYD/nHjMnxm7XzZV4GmwrvHTuOzv9mFZY489I+Mo3NwDA67BYvn5GJnSy+KbFn454+ej5tXzVVtYikT/O1vP8BrR8LTYxUy/DYUb0HnKRedq2tw4ffvtU58HhQCXn8Qb7f06vbXbbvVjO9tqsGtFzrxT8824ktb9sJAmIg7dgyOoWNwDBcuKMQjn70Ac/LU0wQslksXFmPTqrn4094z+fHOwTF0Do7h8oXF+NXtF8Kew90TlVTX4MKOZvfE59JaCQApf8/p5/dtFtXm+iaMTWlT6wuEMiJ/vGpeAZ6bJrsOAF2DY5oq5pJ3j52OevvJ06NczFVgc30T/MGz/8OlK/PPBV3nlOq3rRYmoyEt2fV06hyMHs/U6vejN0q+57ig69x0OeNMyh/r7Rjo7fvRGyX/fbig61wyfcr1Rm/HQG/fj94o+e/DF0V1brrctl4viEajt2Ogt+9Hb5T89+HYImOMqVy8sUWecmGMMZ3ggs4YYzrBBZ0xxnSCCzpjjOkEF3TGGNMJLuiMMaYTXNAZY0wnuKAzxphOpHVhERG5AbTGvGNsJQB6ZXgeLeNjwMcA4GMAZMYxWCCEKI11p7QWdLkQ0e54Vk3pGR8DPgYAHwOAj8FkPOXCGGM6wQWdMcZ0QqsF/VGlB6ACfAz4GAB8DAA+BhM0OYfOGGPsXFo9Q2eMMTaF6gs6ET1ORD1EdHDSbUVEtJ2ImiN/Fyo5xlQionlE9DoRfUhEh4joq5HbM+kYWIjofSLaHzkG/xq5vYqIdhFRCxH9DxFlKT3WVCMiIxE1ENELkc8z6hgQ0UkiaiSifUS0O3JbxrwXYlF9QQfwWwAbp9z2AIBXhRCLAbwa+VyvAgDuE0KcD+ASAPcQ0fnIrGPgA3CNEGIlgFUANhLRJQB+COBnQohFAPoB/J2CY0yXrwI4POnzTDwG64UQqyZFFTPpvTAj1Rd0IcRbAPqm3HwzgCciHz8BYFNaB5VGQohOIcTeyMfDCL+ZK5BZx0AIITyRT82RPwLANQCeidyu62MAAETkBPBRAL+OfE7IsGMwjYx5L8Si+oI+jTIhRGfk4y4AZUoOJl2IqBLAagC7kGHHIDLVsA9AD4DtAI4BGBBCBCJ3aUf4B52e/RzAPwIIRT4vRuYdAwHgFSLaQ0R3R27LqPfCTDS/SbQQQhCR7qM6RJQL4E8AviaEGAqfnIVlwjEQQgQBrCKiAgDPAlim8JDSiog+BqBHCLGHiK5WejwKukII4SKiOQC2E9GRyV/MhPfCTLR6ht5NROUAEPm7R+HxpBQRmREu5luEEFsjN2fUMZAIIQYAvA7gUgAFRCSdlDgBuBQbWOpdDuDjRHQSwB8Qnmr5d2TWMYAQwhX5uwfhH+xrkaHvhWi0WtCfB3BH5OM7ADyn4FhSKjJP+hsAh4UQP530pUw6BqWRM3MQkRXAdQhfS3gdwF9F7qbrYyCEeFAI4RRCVAL4NIDXhBC3I4OOARHZiChP+hjA9QAOIoPeC7GofmERET0N4GqEO6p1A/gOgDoA/wtgPsLdG/9aCDH1wqkuENEVAHYAaMSZudNvITyPninHYAXCF7uMCJ+E/K8Q4t+IqBrhs9UiAA0APiuE8Ck30vSITLl8QwjxsUw6BpHv9dnIpyYATwkhfkBExciQ90Isqi/ojDHG4qPVKRfGGGNTcEFnjDGd4ILOGGM6wQWdMcZ0ggs6Y4zpBBd0xhjTCS7ojDGmE1zQGWNMJ/4P+Q3Vo9sPOf4AAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -626,13 +626,6 @@ "\n", "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 086317a285513673aca86afea2cad7f3156e02b7 Mon Sep 17 00:00:00 2001 From: Jack Ceroni <1ceronijac@hdsb.ca> Date: Mon, 12 Aug 2019 16:58:49 -0400 Subject: [PATCH 05/29] Update random_walk_tutorial.ipynb --- examples/random_walk_tutorial.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index c1697f85cb4..1f082878e7d 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -13,7 +13,7 @@ "source": [ "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081 " + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n" ] }, { From db46fc8cb8a9290f31c4e3449043a0279065b4b8 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 12 Aug 2019 17:07:07 -0400 Subject: [PATCH 06/29] QRW4 --- .../random_walk_tutorial-checkpoint.ipynb | 2 +- examples/assets/circ2.png | Bin 34563 -> 12396 bytes examples/random_walk_tutorial.ipynb | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb index c1697f85cb4..aaca9705f06 100644 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -13,7 +13,7 @@ "source": [ "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081 " + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" ] }, { diff --git a/examples/assets/circ2.png b/examples/assets/circ2.png index 21e2273f8baf03b308f4b664dff65284183b8814..89ce420986bc0edeed6af84c3afc7341c5405882 100644 GIT binary patch literal 12396 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 literal 34563 zcmeFZby!qe|2GUs3_ZXBRB8YPl$4YnK~Y3X=@b#^knRCN5Gj#v5b5p)1(a?OX+c7| z8)lxhJ$Ib@davjHJ%2v$`yQ`roXyN$Yp?ZP-}roMf>f05lM-De!otELm49&eF%}lC zKNc1a5ey%E^0+4IBNi5kyt%BbioC2WLdD+pg}Idp7S@BHXiWmGC!I7Yx{u|}d|?j= z8-s@Oqu@HY*txGl-{Dd|Bq6-hwpmv2%955sMYG_|d{L240kxAg*W2kziKu(`v}uWj z)n-2W6rD95HMum|ZeBPnC1Ij^l068pl66wl5&~Co-tpdux_&pHj4eB}{J}I9_U$xm zW90nK;$vq|PZA$~PfUG76Io%p-b+>c3kP)b+Y}_n@+F@(*`yoq_V$?3SFjqQc%!Lt zko&LQ*R)?hzMeu<>Px}~D^&|BAFWXf5*V#{Xc8Iq$=8(}>-p7i_HKM+J>IJJy>qLM z3@@r@nn6e|Y-AwGOSoYh6_OrrC+_?_{vpYRkL(hy#5n3_5B=Q2PTBpEI-2Nrt!?(^ zjJAiE@h}YciQC(`%g%NKcgu2cO?pdgMI21!IB${8OUb{mqHjBeH&YX<9l|rzB3N!} zTZbp?F4BJ&_~idx{S$F;!1q7qVe$r6A#$nl*Ta6ukZ8hmxOf)W%spdai*rF&`*g;8 z{A-MouKz3%Y6_KzzgaYdj$#psFPv+>L1`a&Vi^7A{o_$l;}MpZ54qYV-~x-aL4y`_ zJz00#f*7hIZcs*@Od{8LqwWUeos_O`O2QV*CycLN;N-v^5Y8v-wt{CDK;K`{8P3L?D?>!C8=Wt zNh)ktBz~DMyv9thl`%K(3Sk4=E6Q#5yD|u-9b)xfqB|5LDEh&?VjhHoknYFb4m@(^ zK7v66Ia(v9;Tr4U<4;T~tmylWQawWCWQ$YMPF6WVgJyrUHgF{yDLlJUfoB;dQUHc3H=ShQ1Aa?gH#=BuI|u@{Wz%*Q00*$R0MI)yTPiGKB1PF043%+SL^ z+}tCygu~<1BygnmMc96{0RNtoXCG}c%_oojv6%0a>sZeC;=akPWX8QduNhi(N}Si< zP=*(LkXFk#yRGx;W~yEX*o;I9TUJ@5{TTk3!5H~!t&CBrJqkA|erTNkWmV3*F9G7s z@4iHDw}%C$=5LkH7Tk>g`YNQ@$cFEM^4#BdnJQ!jHZyCEYAFDJD;8 z;)rQ{`BktrUOA;*wZhl^%u_4qK9_^>=cBE4Q`Pl>#co#o}F5iXw`wvjy zKMT=9RJ{?H4?AYL^WZk6-!+8!1N`@)58!zGv?utvNDbD}4w{dQCxoK@Nyt9tyHwRHsjwWI*$C**TN z5f7eIZUjkfn?GV*f-l2kDMTobD8i}4gQnZCDTAIrvS-74KmS1DF>`K6g>OZmV~At? zh^)K9Hx}J@)14Fxj%EH0aeDGIic$}o9(mto{P^p!)eUsi?YBPsiDj?KLWdsKK3GX7 zd3=y_ID)jG6bh_+qjS&tV@lRcdeg|zP}$J#aKgvy-*j@+GY>MpX&0X9Y?+-3vR@4p zj?PNs&ffUQkUjmO@#FA{^FG{Ntnpn_l7X_ceDi%&e(wNde(xxa8Sg;Rpv_QI!NsG% z561be-{Om&e0Y-UfL#8dl*)5&Oer>_dpNmRH^bw>QNX4Tqinw-uM)4JZTyT)ql0_+ zf&8iS>D(#K#p8>@Q}%=UE0EemTqbC9SIZ*%!c#RePO&#U+Jj!Gp9Ra=5nYo(JjiW(R3RE zbuad3;!Nmmk}Mm#YQ~R?2yNz{^LIXv>12x>X7kD*l_LmQ3g=;JMD1^7<>W@1zgnRm zF3j442!GdOquMWJt@Z<5GdIUAN=K#g>%Xa48m@7zRerPnb|Fk7Ol7?^A^82=Mxpee zl6t(TTGIIJYu^md=%#r6i~9CMxkJ4($}{{kaWcoir-3+uVuAT#ckdgv>$Qi5#U`n+ z^Rh=g2_3#?Ix;?~z1}cb>p)@@GJCl*uI`qIo*9o-EK4kY?3r=AvGG?P#z~38@!N?n zSAJ@QiVJK;=Eqv5tO<`z+ML=@P0`d>)-~F>*e}SELoesujUC=T8BQBEE8HYLaPu8)&Giz_H`GxS`?4yUB_@2lH9W_6-Z;HMJip(; zTE!|J*cf=hH6o-&GM#i?Z*! z{=s}x%tC#HwCGA~f8p|>@^(C*ZA-41j^i^&r+vT6*_X8+t=)B;_YbmUn+d86jcyZe z_q}a1l~7Z^bGU=I)BK1<>20c-z>3i;-IghTfuNAKD?#;ChU~A|3Ln%ZufHpJV52Z7 zAD{3zb(c+u%gM=NY~f|(vSQP_7w_4WEallVvp;S!eQ}t`yUyN%-t}dN?*fa zHJ*N3EodM29k(p=xcB+PL)Fwc)*>3|{-Cb$q&+qf9v9P16$6WzCQo~BIW%)n(=|#BL`S|3=rsnY#`JbAf>fdSR(y5XS>&WiZB_jPn;8EXlXQy!9TUA9>ad1-mMmgCZ zYt#yFCr!nB4aCk=nE=`rg8E}eU_ZNUuUMY#p6p>bX)ZM=rK*a;)zNfTc^&|O(Ci=!9tTl zZo@N+=@6&oo06O&#o0xg1zUMJhIZ+thR%#t5_%48+Z}H+Mlv$*2Zlw{ z)7|EgoN-|}yX!I;QZ>oWp4#AUF_arNJeb{&zPhv4DX=ck-iMze>Dh;wO5bZ*PULkp zG_yFekUmZvvn3F35KrJa)w8NyaLKK7@LV43{v4~UM_9kRroK5!Joc>E$w0Zud++NA zoxTX32-9p={lWRshgkw!-Uiv4C*GPzHj9$O9!?nh^RXtLts>T=*3D|^2cCBIiL)2` zyd(aiRqn3(unchr;28-7j2dR9?=OrQ5>K_N9%GckVTII?7kTyEdR=GZdWhG7K zvwIs}4fj!G-loHyar&WulAH1ejtY5rL^_3AOkjONFut;cf3>VEZ!Z?25@%agSWvL$ zrP;5a!g1@|SYfm|{jm?3TgpF^dp~sS9mewH#^B!?^$33daD))}7KC;Wv>mXpXs$yq zZ28C6wz06VQ_R)09JLf5i5c5k^B6t1eP+VrYHbJZ#=??t6$6*nCXPl3S8FR92QgPk zmfv@XfotevUKYgfTO2JVS+o>Y5VE%RCI}%OK^{I9DIx>{Az}agh1lb}a{m|({*q)d zb9A&5F1YxK<4$x)Jp1$xlG{{6X56Ib(pKgq`7AKL;O(mdPzmT$ zF%@%H6DzH|=GG=QKq73UZru_RmiRs3|MAtoANiM|+W#IZ#LxfNk$?H-A0s7rp&k5X zM}Ly*_oskfQbZEG|DwGV(Ztw2DR3P0=699Vz&j3fHsIv&z<(TnzC+i7;vu51$-z5; z{M|chuGs6-<^}rdC(_%azA-c$6&-5nnXf-osUY#MaB&dbBf?91MVaw~*!a!qtIHWd zAhizef+R5O;jc%#7-D!08BWRC3bTye8yix z_)NN@*qGi=5W>w$e2_Vxd!L8_$YT#{*lr=7>qns-YQRP7Q8VUZd*q3-x@~Fv?U&Ck zi`eLe-3XOOB!0?M&u{69=FGQVPIe*7PW5&_Q23r6$e3WQbSayv=4`XRbyU-k!F$_} z$zOrD(eYSs!5Xy^5~>#dDM83Gp#R>E^>_9Z*Jrm6MxMw@&^GQy7Z+s1%7M^7Wx)0w z5JRBleXx9sh}#TPcq?C{3DbZGV~Dh^v>KsB^1pwG67tBzw& zsv9?~=Z=4d7t5qCF(@A0G^n!Dt~s6$ZmnHTp_`xlI`78ObkI+2Fs)0hC_V3LGC5Go z;Vn7;hP9=WJ(WI8^6)#K$KiSwQ_3lzNe-Y%dgv2jh$e(>&3ZigbrlmaT-uab%BhTG zQpZ2+2JR4?aK7Mi{P}{aW~=F}MQBWqs;KdBV%4JhOE7I9mD26>i84itAJ1__rX7d3 zPk!}@Zx!^(?sz%^#$iirMdGf)-=M65mebSsRQ1|rmp_O)ERCqX5(Thxn-b7K;ejUv zL#Ju9MBr~lnnIfIw&&k8ILOmOoZ~(cp{B&ECIfC{!NrxiS8<0T2)qX&2n0irX2|U2bU5C^QS~y zeFey2O$mop<|c;SLyW8oA>bCy7`0g{IP8FHodTf}26mHVkmC>Ty9b86HS=Sk1ka7r5nM;-HnAh%tJ>dL zk!kb*#fvto5Q6*Of+5s{`1h`XC0u_+Kfs5Rj{P}NxYh^BA)1R#2!DV8>-8~%0r9Pn z2lHgvh|&0}l#l&MVlQRzQF+OIAEYP_PP)B&IwiR84`u}X<_FTZ55N*0;)t@O}AN_Gt?E$kZqt%hw(dZgF4c zI=GKR2GI2`-5(JTz)+YyvK8i!k83-z03N#V5&s$z;S1J_{ec;<*#H}uC$Vlt3sf!d2-vmq`XRVa#UDK9jW7pG1Q<%O;1fUrBZbXWbmHO4bjp)H z@Im5$K{$71f%K*+g69Z34VS|F6B_Zsyql@39^j*t*OEB6T@-Lw^e}NWbRP^1p|DoD z%L3k6IA@aYMuOEYP`nz@rwXZbklnO zgR~gZF}nXshhGXlR@m|*m%4m7?J~=ULZ7d$)x7+<`hPylX5CuR_T((OYQm;|qYARL zc0IS+)h20ltyB$}xl`nUZdoGw?+ko80hdk7REX7>EHmkDng0^pO30q1;zbS1T=7G4 zg#JvEqkxU_Hoxdiuo${!{B=ayE!gxASY=HuSt!yE2qdXZ$`FV+ypsjeFY9z+OyvJ< z>-}y$PI^?rLHKoe-q`sUT0@e2jY6Uw#uota6ua!k^s~V&-250AeFKPK{#Pe%n@}N; zh*%)&vFi%$)Ud{pYX>g4GP(EG7?cre#YY+8Qdf&=mlF8APWMYN=(90#w{BA^SY^X! zvT&pGH4A7U=0d~nLmmA4J_WDisPh@d^iYWhv)T+r<~a~9(=Pq95>Yzsghod zdLrYwmPa?0z2Xb@n4t=TKi~ukam`#1=tw~WpwJA7@nlX4!7J3E4*~DWoum_=5ivX2 zU7UN%Sp+jY9g1xM!0bvNV1<&4!^yzTNcN)?GusiM3RH*Pn6YuLfOTDYNva5hpAGDC zbu9tO(Od~$FZ-_G%7{977`J;6=zE_m&b1Kpl1QHphPMDXb5&~Fm)!qkZ#hukc|7yz zu15w992T0;M@$Is-~j7*V`&DhP!(F?818?p@C@@cOq1XXojmGna+Yj4#lxm%E`Y9O z#$!wJJScE)skhtkF2M^p%qgvtECP86BAZphdx&gL0NI|nY?R{3Sb8iR$09ibExf=v z?&`KXpof*E8KjPC`(Hy~Xs)!Kkr;5A?(OYQms$g*_S3gd$C{;36bx~95F@^9;&*XK z{{Y&p#QY%}(2q($)hbO_w$s20HzIx-;-u5(9faP1ciCQau!j5BZ`S44xu|${Yk8i1 zubQ->d(oG4Me1TjIq+wgIM1UvKIV`s0&J*T+$mu0`6V$y98y3Fp&GY`>|ky(FgMxg zLHG^0PP0PS7LosBi*M2~fV?M$nA0)4!F#mowzT!=)3toUpX|Y3RDKZ~9?Q6{>CWm* z>$#sF@07oS(5;~A8j8vt0*-}P~Cv}%Y9k8hYNcS)@*_=ECI}U z0viIJS8R-ve*O)-zKWW{VT;51jqXmafGu0cO;Z`9PCAtXmQztu1$wpit}Q`S>;d0kCF05@1+KAc^}m?|D4lft*}~yNeHzVtrWhlm=T~^6y_w6siL_Zt$#pZ!Crep?Zxe-gNpNsift?+-wUGl8{=p4VR`Ne6JLq*h z7x>#JXgXiy)wHDxKBAl$FrM`~B4s-NL6HB{Y;&rX&OKqv7T}i(LWDFM@+ksHuWw0W z6o7M!zhyS`uQKcASPYcVs`azkvzen7fPw1=<$+qHp4pA5_K#E&%XL5dE|pLA#AS-3R%SdM)h zcvrFw{J$=?P$<_ekJU=;jo zz94_~2=tSPub0TiNx1EPHJCSD1K_KW;7c_iLk%Fq4{jAeR@^RtWk<)zeO0_I!Ru#| z0L*`Abq4ZR$x+9$$6$VgM*V`+!P&#AYIWNy;y-*Ywd}79pSk5OqXD3Oeg$m&1K4<5 zQBDw;?-HQ(Xdv%jsj4%bUsQMV{J343404-mfF}HQRU+l=C(W#eu+3D>YM~Jo+oQ|g z9^aV*=_zS=^t7x!)=S%UiVwmS0U8vxUbun_8{q{UH9Hjo;aeSuTRr~Dtq=1(eujz! zTvv$kr{>g9JEFXLRkF!?z3FU|_-Gb|s#J{UzuuE1D$o;mi}g{mSf%?!QT^uC!wJh` zJHV8hvrO)V#fgCO6B6wGEXXtiK<>tw7p#Cwb|5a%x%Qv?amA#WbjQ3_&)0ZOYv}pX zb-M<&Q8^ZH{Br+guq~nZ@ejY&I|K}Z^k}QfQ4J%YpNY#&`x(iC0tiaV<$+_z79`<| z<%9v>Q20gdGpmtO7n}84 z2Gg+x@5;n<1CTl8g)Tq9R<(e_HM`&uZQ_J?rPm$C;iOkeCLHqmsz@?W!4_Q%MBrCJ z#Nti53W?u5X}u)O@gAay^uVduL%;HiGVlK70w3fr6nbaLeMj1Vt-f>S>7=nUIFAut zIPjs32Z?!V5N&7jZOsN`(+czI#qR1Cc$KblzAEUYB03lY>U_t@tXsPNia`-_-B5z* z3%9q7h6L@GLbDj~gH*GC|;!#gK3Q|Wm?=*Plivv&FF;O%>q5GX}@o>?_KG+XS79;M;kIEX2gn7~PwC}O?O za0T{-bLLqNTzc-B4dWtl8)tQ3-+iC}f#H1uY+L+OP+Vk#s5qMO2z*UU8vsS_dQv1k z+5|Qz&8m^-TiXMu;Gc~Z68M}0C&*tX%cv4P;>B2H=ldP z*5ntaqAu5QBAOY1dKEBKjRsQ__7;?O%6H}4aZt9wqti*u+ z`#Ud=is0_GAJ$Nfka*u{=7c}YHRr;?eGJ_8$MRPL!K~cCoQ;k>_^aWvUp@Rv10q58 z8-)J$omXSAd}Bd$z+KecKmqVE4L}gPf(IbhM}h&yNakFy+ch=oxCS^dt?HWk>Ru&x z8r-kXd^+21B`5#)+=A&0$a^yc`sD)BFA%a5zJ!f) z0d(l8$Q}_m%L-tfqOu#0rW}-ydu_d`Ajk6NA8*Usl$Gm1P&9vIr=5u$*th!!JFS4R zO{wv}gv-sEXD9y-kGgVC}5i~FAN~T z)BsQ2tq}2kJf!Ts8)ldFsR2H(gtXstJpHi{QEbk=!Tw`LAcr zmqZ{quY?eM`wi%QUyT6;T$uwwSztS~|6xD&fvH`c?cs!ghXr_A%Hhn*c7{0sVbp7W zydrK%Mek?#COkjgUzr1e;lh?Q)^Lf(hze~BOKEvTMb-UbH1IOBAz1xi7Tu)24t!*I4&smFJ3ujXX56lj+VuL-48fbgW5b$Hf=0zyq0@YzW+p96SH|2v)V>-_dOjc?D7^|ktqc{M4@BKIWRvo=p;2{Kod4u0Ue0`Vc z%FmrMCw(pfE)72!j35+$zu$H{$h$-p&_K@ZEhZfpVj9R0L(nx5pc6EJxEG0TcmNFO z05snS%txGTqttb}1U~y~J7n>=gH#ZH8Y17>BbI^NWa1f8Ce9 zI&)CuLh3a+rV3Pp9HC|hFcSxYKaCwyv_&_zX@Xs&2t6pMHUWs)#mNDdxYe)OHKF^!n3U?khu?>Kyx!^P%j%{h1)} zsBz0{?hR`g41@~k&`rsMK=;WlYjovdvcHWjO#^^5bW-S6gB4PUJ|D-6J8+W8+fL{v1=;Jna zDGFffQ&y#9fZ!5=^u}cVmLkx@U_4C0%UA%Yx_>$G zKFEB)`v;XrAO?~@BTTb(-SKRrI&fG?oSRFhf&;SpMj&8uKs_`c58~T4MSyf@;BSFA z)a4nVyD4b6wBQCH=n*(xZaVhlZnr7Le+i92kdGOk26AEZ^8M#~KZc7g#g(iT)d!Rs zw>RzMH4Rq-G;dq>!2lrgY=)h;UjQ^_opM`F9u;<49Vrd8AQm|oD!MuJc3wN6S!5F z`D_LZRzH9h2|#(=O^0_L12u}dZNOe*zCj#T8`F# zPsEJQ1{@2A9(T7up(-$o#1N2=A#Ji}*L(*MBfasz@bO?^N91skpyWaewEC|1ZrE`#N1pmpqyhXxIt0EvN!nxyCnFsqZ{> zz}o~ancYez$da{^OViWv8qh1za!1CS0>0fQ$)YIy=`BMx8w()*+TJ|k|zHBdRjOOhHq zuOqeaP8L^2(IQQUumYg>k)f|*z>9^2Xduu-=k>D}JY4#9f>7YzXf#jVXrjV=R2W$0 zL9#U`Tzr=8_457zD4sb9IdZ?@JCuC@**AB@L0pBj@8yLrd#Vz&`W_pVAl%}rw2K(H z<_n-ysTjE=`uOMQm`LM_;#{Gvm*wrHIAh4CN^s<`xQS#K(p&q(I`vtVwJF!>syy*!RSvB&+e z424mZL>Hs%MpW;=_9GMfwMepDDMZ*-9rR^y5c2EnP8MSWj}~(bpQ2>t!kKtGOUHMXojp1;ioz1=T`X(1H9%IeAgZ>d#T@L1BX{ z72qlU8qQ)3BW~}kPm@iP%o5PV2jG80G_!e&W^P($O!2kbZebE z{t>>912AB7UOv-2HGC(w#C7yx!=TyuYVodlBM9kq|ISiEd4W;hdh`1tIySzp4%;9? zP)wBlbJUU19B)2ab4S8)+G$MP@Fz9rj>I3;mp{6Hqk6L}YVBkU{+uL|01*R~KqSc|D3f}e96Ub;ilHozsY*bgS@S;O5>(6g*Pu5X z0S9>U8#Xr1br1=E`0LeGXgmbNy&VKVtPkA%5F{9w!H2KFhyFY{P>KBk1UyAVSb<*( zgXe(oDh0@Cbv7nZqjcLMn+$LVqn{s!Y@l0m# z_@}K0zk20UwiTTACdMB*Ri-5$uVr$*^sziqs5-?5xk#;NAV>7y>*t5$U*3G9{kpQ&VCAgLhLeS@?B?~mM<6{5~I?J?f;P`>`JZaIw)ki@2u^`}O zK>0y>Fb3#3?$5eh*f^2kD)RO@qzU~%0Gu>y) z?NSJm=(zEC3gz?EQ7D-$pmd>}JE@bqC}I=BHbAOxa=V>h39 z!AL*_jbKlmr4Sg2D^vA*JYwKInE$$K@O9)yH&rv$EAb}5=aGdla zb?`$Qm$SefaZY0v;K?w5t4q-I$h7NVeuZrs1)opXz+gstBX9@bTG1#N35Sj2L*spr3Sj=2AKWomzVhHoo*oSy?q?_u{KSG3YAf?C z0>@LQL9r(LG!EQh^i4k>EDSILDK!3XM);c%{%>G}v`aY3k_T!BZB)u?{n8lEgCPZ8 zr>CI-)kF$Bwa+W}hZHo6J*L<47Gn*)U9ohg-U7j+K8zstI$g=m$6U-}M#;lR;*)9D zypJo3y{s!+h&X%tWVkbdAkcWpcA#|{`)NeN$7!`Jax?QxVzje#%rm3A`o|3~DO?+1 z0z!zg$i42M^#dxXM}z4a-GQ5z=P%1x&in4tyHO3@!U<5ol1~cCO%63bQ4#=kvZ^!= zYVBx=JZ?g8EiKm?Y1$?R`5#Nb-eY+GZd~SZ`SzO}i9-)3M}c6*kQUWpXpF~(XR_j^N72Pm$osv)8yv=%zpnYQTapU>%Jcm=24AaeC&LJZ zuVEm}O-Zx?+9L*X!--Jp%SAnBl05TlOyLupR-hHQY z%Di(*f0*RR8}wK#Ns@~$yt~;C+>m@7<4~a`o7RGpB%qEf4YL9n-E;Pv0nMEcpvo=- z=_K@RRt<>++K!IzK^NPARdg9Z<~EZ_i2-~FYUV`xOrBlo_4<0nR1JjOH$FDWxJt~} zvdu)8Q?E9$I5aW5Y@@gi?~+P%Ykwj0-IN4WgbKFhSvr{F+E?8mK)5a0zXqimO;BNQ zmvSs;uTng}<^$(-;6T^y3J|bB6?WhrJaQaGV15%u^eg)NOzNSmz(eUIzs8`8l1m}? z1d=xEQ{0x~} zz#S)j>7pDLtY$gLSEc36dOm~QC+tyB@v*!+wBsqT8|Jaq=wbkl*lX>F7DAAB)g|A=FdfUWTFP8SHH1(ZE zKVJQAn?h)mdh0Hr7(BnIH<==*`Fj~_5{1k`-#zcsXNk%Dg#Itu#~;f9agnRS`IOi(s-TN zzpex{I!qM5Lgrjth53IS1Kjj~@<=ZDYKt)RG$Qa=OF#<4OW-6jvSwAcM2P(pVh&Ga z0emCPotT&q^*s$%M2r}igU62RmLYS9Cjm=b+=L$Mi!}2j#g+LPn&5rEah3~ip);{e z4xz4(7M7OFxU0OvV1t<;tz~N4iIe{KCjUOkzuEPFs|No6Ad|AXyAWJhJed#X)!=Q| zmN_`z>(|8WFkw{n0SFqsN2{+k4Q#+DFrDffpj3Mlvap3EEkvULJL+?TinCEl1+H6y zMcS5IdZ6OJ1Py9S)cU2)tlXMFiDGUHr~KX$>$=<3Ezr{eq= z(B-=d$}>k_d0T%oq=og0xvd0ypL83>Y_MJoI`m756!ShrRSe3}MWZ>q2A2|T4NgB~ z#^~g^ALJWKo^eh_Ty{5Ez!aBmUs0ZtiCe@0CV0vQ0OR6yMOuy z)I6r|3!NyrgDw{X2(OKT`k-%k7hMI-29VKtkvxOr0qUDqU%nJ7Ji|GlO+@B2>HtcW zGqt>Ts1i1vLxFCH*a3E<0g&l=LRLpfWRfjD`Lu6fxluH-el;&&W39N^yAmu;y?KYO zS+x<$1=&B18ROS6>oEP5`2EGwL&Sb$>iI|d1+QiC*<1}>>q-ld11JRjFy!js5A}nI zv8F@njE*wNMJ!BNH&1@kVP$bNg-oJVnYx^xlrCGmVf$Hq)BzPzE5l|3Ux&2y4%Q)>gE5y(Y!aDimng?_0D;yvuYIQtUO^j zR6%P2D#bk(zm5!X{>BHHI9gV`0CP2R<;(R_|HE2;fvh#TQRnzzU;Hshh1Aq7yjRFW zoy4MUu=-L`N}eo4F4~9Ee_V{e?>s_v`uwg64{;YCMx^2p~pQ0o?>dJhz6DL9?) zw8uu6Ub(@Cxii<3r?fGQEAwPeC&|Us;{hs4g*DbcleY_#&6~$d)ipcjr5Y1qeRERV zYsKPKdI*ge=(NrQ#awkyGJ0s*pXW6T02Z&fA=GfPl-T_s75HSeb-+jKf)yKwiDtQj zk|o1cv7K3z9OaTEVFc9k6s?+jg?hif`K;cg&0=*n`ZqRNeR!|nJ`+G-UO69xd$j*S zCqg_xrz5vc(UPu#i$t5c+`8Q^&V0Z~O{e4i-Wq)^rh+PrCua?|Xh0_cA`ad_KTzO`^zrn+cHw}~VnEl^79_B7J54(rVr^r-56 z26eJ2fjrjmkO$o!4t&SOzza0FtGe_`KIa(Zf12n!Vnv)6q(P|(aYWM+XxQS!z9Z-R zQ5uv#*5`qwQVrMbbd{70M#7x6l3SB~I+lg%ryoLu5CD04V;gJ7p+uE|Gqv?v!(&uCz!D zBs{y`ywhV-W6B9VqenGA^{rD{2^7F#Cy@Qq$HA&m2)EJ%ipuO@wAj0{%Q;%=M1RX& z^MC-gO|baBC4{5DuS4rq%M}Tic0m0k|+#nM;xmS`$?k)_2WIoV&9q!oeF)^%FrV_?sI7>->1!W zSe?%NQ~n;S7j)|Z7rFO=nZd#TKCYMjkMC8VC(d^0V|Z~oE8 zM8EMQr!MU;Jdz+(n)h|eFqYoaB+mO)T2g3#v#(xWgsOco6@D-8`$4z(??NsiogMF{ zLVJweaU5>I^K=usz3f+%t4jBa319O|KUlix7)R4%vGGj+BcH!Neq|@hud#?>YIFlM z$x;fO3C!BY3yRIQE+;uC)rN35Bq%yPA2_#+-r$&1KE&pKb_?jh#wm)@euxCux4T`G z) zeL`FsUEut!*(0JDy7b)NnSK*6O>kHa((_B1Ya{kpD7p=mO?S6NkB=XBX*NA}W~4n7 zFTZdBz9r4p(QesZvhKxFf#nie*A$5;o%ECNbMdas*xI|S=_)+byKyO>^ho^e(_#=S-CH5~9u>X}F$g{5b;$jO|rd(-e5^t%;!?~gP_zQ0g zmXPT)D*Wr$5_0c553SXQFCsBeC3yV4gWhfNC*4~=mwUb-Ih;DCkRbMAJ^l^7l8VmN zLq~KwmrXB{pyaR?uy`{%_{$2q_Y{HierTv6lWN5jFR}zmQ*TC&FH>$dNR4*4(Nw%x z2`*DK>5E?{zn0WTuMQ;ABD=a0uhLZ2AT=K#oll^z<3k8#ccvd<;BI4-svlw4-o?v* zA_UR#fyJf|GqyA^?k<`&Nn9F`@~ALVnz@%o@u%5=ZLxUeAk8A;8q6th?LS2`Y&4%F zHs|tyx_SQeqb$=1Ni;?0s zGUj3K_dlw=d#gI5U-)}_yB?|ks?PJW6Muj3%P%6`)+pF9=nu2wSb7- zHI-_IFbUt%`=P0{AE4NqBl3}pB=Wb2SzmCLOi2;#OTiOzEi=!wJgqGZfr?Q8-9~0> z>BT4G(dos6kIKB=$c)I+^#UTxliZekCjCBrAX@m=2O&ajvMzyGmErIn+Q<_z`&yOF z-JhkdIOG!B$dy_Cm)@Iw>PM|Bm+IWJlPd%XPU3lgg$VTJNS%%M_tgjMFO_wDK7qV7 zIm_q!TAJ){3OR*A>mW*wx1bq)dN6sech}cy7VwBjm0Pn4?kDWdY?5U6Z;NGeE5nnMN`PcV-N%?P!DW2IX+!rsm~4Kb5Qnw zGj?;~aVdR)$VJD((82SxTK$stdBTt6IUusQttip41~^wi5^CI81;6FsOjv6FO&VKe zQz};BHNWX2oL0~n+p50FSOGk+n4nBr<(!k*1ZjBJM#-A@?ey&S5nL!1&abocmClxn zYEs0@UNAP48$}-#B`=C;5rw z1oba#L{vF*?evS36PX^eIs%YOd|uykWoG^P^SgH%9U@ZoMTc);VChrWtw5LM4VThR zvL7vsQ2W?{3+l*a6m*HGJHwY-^uO}o7aK;^UWD0BH;@g8Vn|<6u=c zBL~?3*frBk8}n5Wt2vGL(;){b^$uU-rh>hmKD9=N!9^rTbwdBgOi`>WE+TKIu-P-x z?As$BiHQOy<`m(fIx$wc(Ro_I`A+qYDBSYY%5%Ew{H*&h;RpZccYwPVd_=v}PUl97 zHUsPFVaeckycWqGi+)m=O%V0750Dlg2Z}#7z!QWlcw%)IHHK0_H$!3BbT5)Vo!6Y%I@IFq&2CaR;ddO`x4jvh_V5k@)l58cr)On9^Df z+-v12c%t;&+TWA5YnuA-^Og+67pTweIAxr)As@uwZR+99X2Tvr(;>S zx4GWEu$#Y6OE}LC=tRs)nU{rnU}y)W+T4aHiNJ3rZ1FhsEe7CTQFS;N)r{>{qGDOT za8s6}S)v?C!djomN%U<0=Ag5*`+YrsF&_P)cv9a5jn^}k@Z3>FN#j~v&o7>EXFPX0 z*dp;ZNM3RDf1Fuq10BbT2=PtP#6;5o=dnNOwH?t-Nl6qssoMYffwP=_TG9#EQVT3S zDYql+af*JeRk7t{;lUN|ceS7RxunJC-GnbX`fSmpSF3ORHMN zF2TEmqYt{}i;_nBef5^ax|5T`z|R)Q6WD-exBk2&$^LkZ9#0wYur=@hulBAy9Llx- zm#9>y#3^M7+1jYaQnJh>%9N_4`ZHrp69-w`~H4E+sK}_7QKGIGg7)!hf|e=6|)D% z3@=A#Qb?G`$32DGig!*96x3xzwSBlM9^D0K)$*DC z7Er%NRGke~!%miTYTapjt$HVlJ$0sNyXu4XtUYDju&$qQIr9Z$sK8z}G74G_@*=sQ z{F2dEuW-FIW^RAtRcKb%n$vYFT&)caAx#PsQH6Ro%yZ-Nj9#!qF||o5`WCS?_3V-< z?+|jwST`#E-srcj_2EV9K6M?9;51lR?4lN?uV^5wf~usxG~^*(kwWU*YogM9UQIC+ zv-QaGN(o_Z{0nC3@nhAoVHJ@|wKCp_%Z>ZAU2%Z{Fs<$!eR zCz`4w?-zK&WJjxFC@JXo6Ix9c-4v78j0CS1f${S8k6+KEqyy3BAad}l1j6Y8Srz1_nB~eMKWnvvMmEoaJNvLI(X9n^Sj^;tTumS{TwX z$TLtcF2O>SL9erHsFM*nvcc>IHRR#d;zaghK#hEX?2B7aRkm9=5qY25Kxm!X^Hp(EL{2VN>oBWs5 znm!Y$ca8}wJsE{8a#?_ZBs+w}eNtXzAsSag>T#CWEJz3m=6sWR>kQsXo1zpIxwXDA z2OQUuV`5E$Wfe4Ge`zsz=R2r>@jvaJYO>~F#(aet3XND8;RhXz_%a>_PTdGJm zC@V6x0!-#b?%GLL`+B)4~^h`g*!x*o^P z_QJD1y!jLbrXpATPnJ8?y+^!`dz&`7oqFinqqrc$E{A>wQB^S+qlGhB%v~PNG%8%G zxa6b2jojExY-TJrgK!j0S^WyU%gvd~^SJq2^TcU#qvkNbUy0269P{oQLonc8m!_|? z#^?RPYcl5v&-M0j!BQGU#m{3EVDA2G#Y1D)@dB{U)5)<+draQ*TTc7p>gw-1x|ye( zOr=$7aPWf*3-h;~*mtQpr~v12^Zbb5tl^VgMl9FIOiISx1BOf)z0_4$2nmYUwITw& zP*%oi2KM56tLik6lm{S#B!uqcz;pBb}$}iV}{n+_{zN9K6aH>v53eI-wL= zj^Tw5Et5djs8g5rV4hH}?AH_5R5~@mayPK@R!AiJ?WS(izQ=Flv(ON|36PzqB34_v zt8ep{vhBI*fuTv?1fx3wyZ!w}E{v|~3JKNroFSOq_HZ!apj(vMmsVI1J9{NxfKe_O z>WcBJOpkPmTSnC8a554 zQ5tN$f)cP(WO?P46$xL_dCR!Gmv>7Ks@9QBvFD)>ms6j{N-#QG**5^sw*BPhS%&Uu zquFJijF648*!@*v9tUPwd11uL2Ro30&uIB=>y8ZU399)JNjvLW9XdEn6*bgQHR_2N zz5$Vn9%n-|K6BtUSq5?4Zx7WdN6dt-KniOaOF_$O{%HVcrNE|nywU3WuFOdFB+siJ6>u~ggdqitl%5{6Y9L01C^H5>RAK#bed+iOCs*h z*4j_KlYAtH>HL3A+Nj1OqChuJH3}*MFJ@v!m*IDgn)U1o$A7>@2Pua zz3IPTF@39!#&qIP&>ddCZG}BlniXj>m-dgvT%+u!jVRAQ>HU$eTRu=a(m)`+ow`)` zN*oQ&Sd55ap^*l5M4!5?3vJ*2jI*OJ_Trs2TYnj9mQ-F=OUE$l`78Iz94PCO9a_UO zHHLY@>9sZ}M5xSuahv_eYQ`BZnvWY%E`&aR_=!~s$6~6}71O9z z^yjS^tg$mBm}b{d+pEnE#!6$490|jD6y26Al_57?AiBNx!Myl25+&UA-@2-vX%11p zO_E&QvzwwujYY#CU5wEWT$(@NHc)EH>DmWus{8Qe98eavchGedIxqG5Tjyr^9aq#` zbokDLTA`GUzJVh@i->0!08z>Pau3B0a9_SdF-J_1fD27B8HA^n`komE3m6OXSkLbP ze-_V~@&>@7^%22hP0x%M}4hHejkD%vt zX6gs?HQrdhw)$#(ICXR{Gs|(%lp3qU4E`qlX5txQi88=>`^XdElP#fd`0f73ML~1& z(Gqcf?RgiqK0pp^2DY#zMrXq;GnzERjBe3cWXGfcq_!?=5Qd+$`2&j^9d^&*P<*t} zSemrXygK4zzmGkU!l?1fWU-@PoF2;w^{WYg&VmzmYascen2CoZtI0CBnRg|Y5gu3$ z>cunX`v9;N=(m)RTTq&}{Epw88=#$*P; z71-N_O`)CA3a>^Bn_aNp&ybVtF&_gjei@odIyZQi#C!%@tgW|*{)_bz`Msokhbspd z(QHc2TCMKwBTz=rb|m(zE}^7v(iVK}eKZ8wxPi2;tw+az)Y2hQEMfn9!E^{hKnD`5 zVK#YOdi((A!Q*tE!lum3T-&B0i3u#=sndriutEjuGq=nwG32$7h~dZv{tEJLkcG8x zg&bXhlwBA~rTT2LzakaAS4-{FNCarAr4AMr7XGz;phdUXRmgEh?j}OEoYcx+*acYi zztZ#wmw@JYRz&3T(=!l4J(JcFT%TDb9z0;nA^o&z>&ur7qAkwg)gIrcDCWt29V2>b zH)ym&Rsl!(s!}R)MmF~^)J_r~kiTbEd8D-l;zy)>T1G*#1$$$2lR>B{T&;r5kt4dQ zvlHnWOr&#ol|~Vef==3?1#E%WHVBFQR}v|+ zEZmw%{6xnIsvs9LPZR!oK#hizg!TNBEo2{t{FMDT0EX({=&CSebtLfoF65dUxVeG* zKU8#cPu%Pi7mxb@$uGWz0Oi^M9$`@kl7K^-v-1smUlvDg9=+WPMj`r^kAiAcOPi;)m4`v4&iWYEEH?yDD-Q4KRP{;J7#%e|-KR=h1fPI_c$IDMR)KZ8)?loK{uP_zo<0G|z7d{%zX zPLw|1Q@j}oX9w=rWfF_p()GX>#POsN;!pT<7v3L*u$jyfNPEph=sw?UjjEWG>1VCj z$~+O3g@ynqyeKu;DfkSUDYnOIVF+q#3k?31*9Ay#@N04s&SUiwmz7tQ(D8vTRvBA$ zb#(q~O(Gc?WnUX`kRdvc0n|pq%SFrVVA*^7-s>zVYiQTu%MTval1)u+XG1V1xA!1k zt#xY2a+jZy0B`Jnyhtt^f!bd*+|yP-fIViP*EOw|YtEln5noe;n-aKF-s<$ytrEdG zJ;HlC`aCbN-Yfi?20kbBbCo21I>El1wo(#w(;nZLplD$=+1o86Ut9_bdS_oyh#Z<> z=4`XRaw5g-A9k7vJ^|jVpO;rHS_ZgqDaEi)BQl$@k-*Tb{>8dH7E+YKuN61H1|hUk7J^q=0r5MOQ_`QQ@6AkKDKAEb zK$_bnU^vJ^X{xPIF&yH(DcP!`c}}PT5=nZ;p7e!9L8cZ|!{#vnUS6n__3t<^-e#^p z*3#sDn~}kAw5w3ae)2T92>IVANOh+VaAb$06UOC2E&vm5k&=ur+6bf#F{5@GFNuy0=dXiH2c10zgfa zr48DKHs|?xC0w!%nJ!>E9P5jaXgJ3zuSBvt-aFQt2cSG_m|9}Do@^{ut!Imj?R}dm z&#%sVS$PD>>ckhL5~>xVGCM29gOtecU^@%9@>2Vhk26_< z8dJVr@xpy}kII$;1@E=NkmfbUENKUO^>^RacLN%j#ULtQiu_&~d4P}^>c6kz7*N&( z=jIlH3H$HAqL)qJTuqV#P%h~Y?`d?0!hw;MMf~Bf$X|sLwbJgw-EyEgx;pzF-mztO2ZW3eA PcNYI*Y;Kfm=yKsdAp?s# diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index c1697f85cb4..aaca9705f06 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -13,7 +13,7 @@ "source": [ "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081 " + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" ] }, { From e4c36ac61dcdc1fd92c17afd6c5008914d3e8787 Mon Sep 17 00:00:00 2001 From: Jack Ceroni <1ceronijac@hdsb.ca> Date: Mon, 12 Aug 2019 17:09:03 -0400 Subject: [PATCH 07/29] Update random_walk_tutorial.ipynb --- examples/random_walk_tutorial.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index 1f082878e7d..ab96b9c2941 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -13,7 +13,7 @@ "source": [ "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n" + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" ] }, { From 298b9f1fb1fcd186eb6c5802e5b2e927d75d910f Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 12 Aug 2019 17:27:57 -0400 Subject: [PATCH 08/29] Hm --- .../random_walk_tutorial-checkpoint.ipynb | 652 ----------------- examples/random_walk_tutorial.ipynb | 656 ------------------ 2 files changed, 1308 deletions(-) delete mode 100644 examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb delete mode 100644 examples/random_walk_tutorial.ipynb diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb deleted file mode 100644 index aaca9705f06..00000000000 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ /dev/null @@ -1,652 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quantum Random Walks With Cirq - Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", - "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Classical Random Walks**\n", - "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\bigr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", - "\n", - "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", - "\n", - "Where we know:\n", - "\n", - "\n", - "$$\\bigr\\lvert \\text{Final}\\rangle \\ = \\ \\bigr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", - "\n", - "\n", - "So for our case, the final position vector is simply $\\bigr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", - "\n", - "\n", - "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", - "\n", - "\n", - "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", - "\n", - "\n", - "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", - "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", - "\n", - "\n", - "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", - "\n", - "\n", - "\n", - "**Quantum Random Walks**\n", - "\n", - "\n", - "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", - "\n", - "\n", - "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\bigr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Going back to our original idea of some position vector $\\bigr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", - "$H_W$ spanned by the following set:\n", - "\n", - "\n", - "$$H_W \\ = \\ \\{\\bigr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", - "\n", - "\n", - "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", - "\n", - "\n", - "$$H_C \\ = \\ \\{\\bigr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", - "\n", - "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\bigr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", - "\n", - "\n", - "$$\\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\bigr\\lvert 1\\rangle \\ = \\ \\bigr\\lvert \\downarrow\\rangle$$\n", - "\n", - "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\bigr\\lvert i\\rangle \\ \\otimes \\ \\bigr\\lvert j\\rangle$.\n", - "\n", - "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", - "\n", - "\n", - "$$U \\ = \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert $$\n", - "\n", - "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\bigr\\lvert 0\\rangle$ and $\\bigr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\bigr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\bigr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", - "\n", - "\n", - " $$U (\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert \\Big )(\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle)$$\n", - " \n", - " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle$$\n", - "\n", - "\n", - " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle \\ + \\ 0\\bigr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle$$\n", - "\n", - "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\bigr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", - "\n", - "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\bigr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\bigr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ - \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", - "\n", - "\n", - " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", - "\n", - "\n", - " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Tutorial: Building a QRW With Cirq**\n", - "\n", - "\n", - "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" - ] - } - ], - "source": [ - "import cirq\n", - "import random\n", - "import numpy as np\n", - "import copy\n", - "import sympy\n", - "import itertools\n", - "from matplotlib import pyplot as plt\n", - "\n", - "number_qubits = 7\n", - "\n", - "qubits = []\n", - "for i in range(0, number_qubits):\n", - " qubits.append(cirq.GridQubit(0, i))\n", - "\n", - "print(qubits)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", - "\n", - "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", - "\n", - "\n", - "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", - "\n", - "\n", - "\n", - "\n", - "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", - "\n", - "\n", - "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", - "\n", - "\n", - "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", - "\n", - "\n", - "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" - ] - } - ], - "source": [ - "ancilla = []\n", - "for i in range(0, number_qubits):\n", - " ancilla.append(cirq.GridQubit(1, i))\n", - "\n", - "print(ancilla)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "\n", - "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 0): ───@───────────────────────@───\n", - " │ │\n", - "(0, 1): ───@───────────────────────@───\n", - " │ │\n", - "(0, 2): ───┼───@───────────────@───┼───\n", - " │ │ │ │\n", - "(0, 3): ───┼───┼───@───────@───┼───┼───\n", - " │ │ │ │ │ │\n", - "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", - " │ │ │ │ │ │ │\n", - "(1, 0): ───X───@───┼───┼───┼───@───X───\n", - " │ │ │ │ │\n", - "(1, 1): ───────X───@───┼───@───X───────\n", - " │ │ │\n", - "(1, 2): ───────────X───@───X───────────\n" - ] - } - ], - "source": [ - "number_qubits = 4\n", - "\n", - "def apply_n_qubit_tof(ancilla, args):\n", - "\n", - " if (len(args) == 2):\n", - " yield cirq.CNOT.on(args[0], args[1])\n", - "\n", - " elif (len(args) == 3):\n", - " yield cirq.CCX.on(args[0], args[1], args[2])\n", - "\n", - " else:\n", - "\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - " for k in range(2, len(args)-1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - "\n", - " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", - "\n", - " for k in range(len(args)-2, 1, -1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - "\n", - "\n", - "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", - "circuit = cirq.Circuit()\n", - "circuit.append(apply_n_qubit_tof(ancilla, control))\n", - "print(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", - "\n", - "\n", - "\n", - "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", - "\n", - "\n", - "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", - "\n", - "\n", - "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", - "\n", - "\n", - "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", - "\n", - "\n", - "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", - "\n", - "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", - "\n", - "\n", - "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", - "\n", - "\n", - "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", - "\n", - "\n", - " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", - "\n", - "\n", - "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", - "\n", - "\n", - "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", - "\n", - "\n", - "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def walk_step():\n", - " \n", - " #\"Flip\" the coin qubit\n", - "\n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " \n", - " #Implement the Addition Operator\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " for i in range(number_qubits, 0, -1):\n", - "\n", - " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " for i in range(number_qubits+1, 1, -1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " #Implement the Subtraction Operator\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " for i in range(number_qubits+1, 1, -1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " for i in range(1, number_qubits+1):\n", - "\n", - " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the ``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector qubits, we have:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({12: 52, 14: 20, 20: 20, 16: 13, 10: 9, 54: 9, 30: 8, 52: 8, 18: 7, 38: 7, 26: 7, 22: 6, 42: 6, 28: 4, 36: 4, 32: 3, 24: 3, 34: 3, 48: 3, 44: 2, 40: 2, 50: 2, 8: 1, 46: 1})\n" - ] - } - ], - "source": [ - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the number of occurences of that position vector value on the y-axis. This gives us a probability distribution for the position of the random walker. It is important to note that the graphs will only have either even or odd numbered data point, depending on the initial position of the walker and the number of steps taken:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({52: 58, 50: 22, 54: 14, 46: 14, 48: 14, 44: 11, 12: 8, 24: 6, 16: 6, 42: 6, 10: 6, 34: 5, 40: 4, 36: 4, 32: 4, 28: 3, 22: 3, 38: 3, 8: 2, 14: 2, 26: 2, 18: 1, 30: 1, 20: 1})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - "\n", - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)\n", - "\n", - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", - "\n", - "\n", - "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({52: 34, 12: 28, 50: 14, 10: 13, 20: 11, 14: 11, 44: 10, 36: 8, 30: 8, 16: 7, 54: 7, 22: 7, 32: 5, 48: 5, 46: 5, 42: 4, 40: 4, 34: 4, 18: 3, 24: 3, 38: 3, 26: 3, 28: 2, 8: 1})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " \n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)\n", - "\n", - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we get a probability distribution that is much more symetric!\n", - "\n", - "\n", - "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb deleted file mode 100644 index a96228b5bd0..00000000000 --- a/examples/random_walk_tutorial.ipynb +++ /dev/null @@ -1,656 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quantum Random Walks With Cirq - Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", - "\n", -<<<<<<< HEAD - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" -======= - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" ->>>>>>> e4c36ac61dcdc1fd92c17afd6c5008914d3e8787 - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Classical Random Walks**\n", - "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\bigr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", - "\n", - "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", - "\n", - "Where we know:\n", - "\n", - "\n", - "$$\\bigr\\lvert \\text{Final}\\rangle \\ = \\ \\bigr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", - "\n", - "\n", - "So for our case, the final position vector is simply $\\bigr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", - "\n", - "\n", - "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", - "\n", - "\n", - "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", - "\n", - "\n", - "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", - "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", - "\n", - "\n", - "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", - "\n", - "\n", - "\n", - "**Quantum Random Walks**\n", - "\n", - "\n", - "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", - "\n", - "\n", - "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\bigr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Going back to our original idea of some position vector $\\bigr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", - "$H_W$ spanned by the following set:\n", - "\n", - "\n", - "$$H_W \\ = \\ \\{\\bigr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", - "\n", - "\n", - "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", - "\n", - "\n", - "$$H_C \\ = \\ \\{\\bigr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", - "\n", - "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\bigr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", - "\n", - "\n", - "$$\\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\bigr\\lvert 1\\rangle \\ = \\ \\bigr\\lvert \\downarrow\\rangle$$\n", - "\n", - "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\bigr\\lvert i\\rangle \\ \\otimes \\ \\bigr\\lvert j\\rangle$.\n", - "\n", - "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", - "\n", - "\n", - "$$U \\ = \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert $$\n", - "\n", - "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\bigr\\lvert 0\\rangle$ and $\\bigr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\bigr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\bigr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", - "\n", - "\n", - " $$U (\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert \\Big )(\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle)$$\n", - " \n", - " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle$$\n", - "\n", - "\n", - " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle \\ + \\ 0\\bigr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle$$\n", - "\n", - "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\bigr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", - "\n", - "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\bigr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\bigr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ - \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", - "\n", - "\n", - " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", - "\n", - "\n", - " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Tutorial: Building a QRW With Cirq**\n", - "\n", - "\n", - "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" - ] - } - ], - "source": [ - "import cirq\n", - "import random\n", - "import numpy as np\n", - "import copy\n", - "import sympy\n", - "import itertools\n", - "from matplotlib import pyplot as plt\n", - "\n", - "number_qubits = 7\n", - "\n", - "qubits = []\n", - "for i in range(0, number_qubits):\n", - " qubits.append(cirq.GridQubit(0, i))\n", - "\n", - "print(qubits)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", - "\n", - "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", - "\n", - "\n", - "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", - "\n", - "\n", - "\n", - "\n", - "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", - "\n", - "\n", - "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", - "\n", - "\n", - "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", - "\n", - "\n", - "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" - ] - } - ], - "source": [ - "ancilla = []\n", - "for i in range(0, number_qubits):\n", - " ancilla.append(cirq.GridQubit(1, i))\n", - "\n", - "print(ancilla)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "\n", - "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 0): ───@───────────────────────@───\n", - " │ │\n", - "(0, 1): ───@───────────────────────@───\n", - " │ │\n", - "(0, 2): ───┼───@───────────────@───┼───\n", - " │ │ │ │\n", - "(0, 3): ───┼───┼───@───────@───┼───┼───\n", - " │ │ │ │ │ │\n", - "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", - " │ │ │ │ │ │ │\n", - "(1, 0): ───X───@───┼───┼───┼───@───X───\n", - " │ │ │ │ │\n", - "(1, 1): ───────X───@───┼───@───X───────\n", - " │ │ │\n", - "(1, 2): ───────────X───@───X───────────\n" - ] - } - ], - "source": [ - "number_qubits = 4\n", - "\n", - "def apply_n_qubit_tof(ancilla, args):\n", - "\n", - " if (len(args) == 2):\n", - " yield cirq.CNOT.on(args[0], args[1])\n", - "\n", - " elif (len(args) == 3):\n", - " yield cirq.CCX.on(args[0], args[1], args[2])\n", - "\n", - " else:\n", - "\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - " for k in range(2, len(args)-1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - "\n", - " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", - "\n", - " for k in range(len(args)-2, 1, -1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - "\n", - "\n", - "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", - "circuit = cirq.Circuit()\n", - "circuit.append(apply_n_qubit_tof(ancilla, control))\n", - "print(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", - "\n", - "\n", - "\n", - "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", - "\n", - "\n", - "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", - "\n", - "\n", - "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", - "\n", - "\n", - "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", - "\n", - "\n", - "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", - "\n", - "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", - "\n", - "\n", - "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", - "\n", - "\n", - "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", - "\n", - "\n", - " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", - "\n", - "\n", - "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", - "\n", - "\n", - "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", - "\n", - "\n", - "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "def walk_step():\n", - " \n", - " #\"Flip\" the coin qubit\n", - "\n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " \n", - " #Implement the Addition Operator\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " for i in range(number_qubits, 0, -1):\n", - "\n", - " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " for i in range(number_qubits+1, 1, -1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " #Implement the Subtraction Operator\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " for i in range(number_qubits+1, 1, -1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " for i in range(1, number_qubits+1):\n", - "\n", - " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the ``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector qubits, we have:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({12: 52, 14: 20, 20: 20, 16: 13, 10: 9, 54: 9, 30: 8, 52: 8, 18: 7, 38: 7, 26: 7, 22: 6, 42: 6, 28: 4, 36: 4, 32: 3, 24: 3, 34: 3, 48: 3, 44: 2, 40: 2, 50: 2, 8: 1, 46: 1})\n" - ] - } - ], - "source": [ - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the number of occurences of that position vector value on the y-axis. This gives us a probability distribution for the position of the random walker. It is important to note that the graphs will only have either even or odd numbered data point, depending on the initial position of the walker and the number of steps taken:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({52: 58, 50: 22, 54: 14, 46: 14, 48: 14, 44: 11, 12: 8, 24: 6, 16: 6, 42: 6, 10: 6, 34: 5, 40: 4, 36: 4, 32: 4, 28: 3, 22: 3, 38: 3, 8: 2, 14: 2, 26: 2, 18: 1, 30: 1, 20: 1})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - "\n", - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)\n", - "\n", - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", - "\n", - "\n", - "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({52: 34, 12: 28, 50: 14, 10: 13, 20: 11, 14: 11, 44: 10, 36: 8, 30: 8, 16: 7, 54: 7, 22: 7, 32: 5, 48: 5, 46: 5, 42: 4, 40: 4, 34: 4, 18: 3, 24: 3, 38: 3, 26: 3, 28: 2, 8: 1})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " \n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)\n", - "\n", - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we get a probability distribution that is much more symetric!\n", - "\n", - "\n", - "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 3d475a2f26e861d7a81282b97884d2b2393f548e Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 12 Aug 2019 17:39:52 -0400 Subject: [PATCH 09/29] Final QRW --- .../random_walk_tutorial-checkpoint.ipynb | 652 ++++++++++++++++++ examples/assets/circ2.png | Bin 12396 -> 34563 bytes examples/assets/cycle.png | Bin 31484 -> 12396 bytes examples/random_walk_tutorial.ipynb | 652 ++++++++++++++++++ 4 files changed, 1304 insertions(+) create mode 100644 examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb create mode 100644 examples/random_walk_tutorial.ipynb diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb new file mode 100644 index 00000000000..aaca9705f06 --- /dev/null +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -0,0 +1,652 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum Random Walks With Cirq - Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", + "\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Classical Random Walks**\n", + "\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\bigr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "\n", + "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", + "\n", + "Where we know:\n", + "\n", + "\n", + "$$\\bigr\\lvert \\text{Final}\\rangle \\ = \\ \\bigr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", + "\n", + "\n", + "So for our case, the final position vector is simply $\\bigr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "\n", + "\n", + "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", + "\n", + "\n", + "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", + "\n", + "\n", + "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", + "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", + "\n", + "\n", + "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", + "\n", + "\n", + "\n", + "**Quantum Random Walks**\n", + "\n", + "\n", + "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", + "\n", + "\n", + "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", + "$\\bigr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Going back to our original idea of some position vector $\\bigr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "$H_W$ spanned by the following set:\n", + "\n", + "\n", + "$$H_W \\ = \\ \\{\\bigr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "\n", + "\n", + "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", + "\n", + "\n", + "$$H_C \\ = \\ \\{\\bigr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "\n", + "\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\bigr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "\n", + "\n", + "$$\\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\bigr\\lvert 1\\rangle \\ = \\ \\bigr\\lvert \\downarrow\\rangle$$\n", + "\n", + "\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\bigr\\lvert i\\rangle \\ \\otimes \\ \\bigr\\lvert j\\rangle$.\n", + "\n", + "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", + "\n", + "\n", + "$$U \\ = \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert $$\n", + "\n", + "\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\bigr\\lvert 0\\rangle$ and $\\bigr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\bigr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\bigr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", + "\n", + "\n", + " $$U (\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert \\Big )(\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle)$$\n", + " \n", + " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle$$\n", + "\n", + "\n", + " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle \\ + \\ 0\\bigr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle$$\n", + "\n", + "\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\bigr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + "\n", + "\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\bigr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\bigr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ - \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", + "\n", + "\n", + " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", + "\n", + "\n", + " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Tutorial: Building a QRW With Cirq**\n", + "\n", + "\n", + "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" + ] + } + ], + "source": [ + "import cirq\n", + "import random\n", + "import numpy as np\n", + "import copy\n", + "import sympy\n", + "import itertools\n", + "from matplotlib import pyplot as plt\n", + "\n", + "number_qubits = 7\n", + "\n", + "qubits = []\n", + "for i in range(0, number_qubits):\n", + " qubits.append(cirq.GridQubit(0, i))\n", + "\n", + "print(qubits)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "\n", + "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", + "\n", + "\n", + "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", + "\n", + "\n", + "\n", + "\n", + "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", + "\n", + "\n", + "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", + "\n", + "\n", + "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", + "\n", + "\n", + "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" + ] + } + ], + "source": [ + "ancilla = []\n", + "for i in range(0, number_qubits):\n", + " ancilla.append(cirq.GridQubit(1, i))\n", + "\n", + "print(ancilla)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "\n", + "\n", + "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 0): ───@───────────────────────@───\n", + " │ │\n", + "(0, 1): ───@───────────────────────@───\n", + " │ │\n", + "(0, 2): ───┼───@───────────────@───┼───\n", + " │ │ │ │\n", + "(0, 3): ───┼───┼───@───────@───┼───┼───\n", + " │ │ │ │ │ │\n", + "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", + " │ │ │ │ │ │ │\n", + "(1, 0): ───X───@───┼───┼───┼───@───X───\n", + " │ │ │ │ │\n", + "(1, 1): ───────X───@───┼───@───X───────\n", + " │ │ │\n", + "(1, 2): ───────────X───@───X───────────\n" + ] + } + ], + "source": [ + "number_qubits = 4\n", + "\n", + "def apply_n_qubit_tof(ancilla, args):\n", + "\n", + " if (len(args) == 2):\n", + " yield cirq.CNOT.on(args[0], args[1])\n", + "\n", + " elif (len(args) == 3):\n", + " yield cirq.CCX.on(args[0], args[1], args[2])\n", + "\n", + " else:\n", + "\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + " for k in range(2, len(args)-1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + "\n", + " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", + "\n", + " for k in range(len(args)-2, 1, -1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + "\n", + "\n", + "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", + "circuit = cirq.Circuit()\n", + "circuit.append(apply_n_qubit_tof(ancilla, control))\n", + "print(circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", + "\n", + "\n", + "\n", + "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", + "\n", + "\n", + "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", + "\n", + "\n", + "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", + "\n", + "\n", + "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", + "\n", + "\n", + "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", + "\n", + "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", + "\n", + "\n", + "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", + "\n", + "\n", + "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", + "\n", + "\n", + " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", + "\n", + "\n", + "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", + "\n", + "\n", + "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", + "\n", + "\n", + "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def walk_step():\n", + " \n", + " #\"Flip\" the coin qubit\n", + "\n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " \n", + " #Implement the Addition Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits, 0, -1):\n", + "\n", + " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " for i in range(number_qubits+1, 1, -1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " #Implement the Subtraction Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits+1, 1, -1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " for i in range(1, number_qubits+1):\n", + "\n", + " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the ``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector qubits, we have:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({12: 52, 14: 20, 20: 20, 16: 13, 10: 9, 54: 9, 30: 8, 52: 8, 18: 7, 38: 7, 26: 7, 22: 6, 42: 6, 28: 4, 36: 4, 32: 3, 24: 3, 34: 3, 48: 3, 44: 2, 40: 2, 50: 2, 8: 1, 46: 1})\n" + ] + } + ], + "source": [ + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the number of occurences of that position vector value on the y-axis. This gives us a probability distribution for the position of the random walker. It is important to note that the graphs will only have either even or odd numbered data point, depending on the initial position of the walker and the number of steps taken:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 58, 50: 22, 54: 14, 46: 14, 48: 14, 44: 11, 12: 8, 24: 6, 16: 6, 42: 6, 10: 6, 34: 5, 40: 4, 36: 4, 32: 4, 28: 3, 22: 3, 38: 3, 8: 2, 14: 2, 26: 2, 18: 1, 30: 1, 20: 1})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + "\n", + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)\n", + "\n", + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", + "\n", + "\n", + "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 34, 12: 28, 50: 14, 10: 13, 20: 11, 14: 11, 44: 10, 36: 8, 30: 8, 16: 7, 54: 7, 22: 7, 32: 5, 48: 5, 46: 5, 42: 4, 40: 4, 34: 4, 18: 3, 24: 3, 38: 3, 26: 3, 28: 2, 8: 1})\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl03NWV6PvvrpKqNFsqSbYlWbLlETPFBseYwUCYTCBpDGGlOy+hubdJk+5O3oUMTkPS66a7HzTQ0CG5ebfTTSAdXl+SkMbEIWFwgDiYyQZP4AkPSB4kla2SZM0qTXXeH1U/WZZLUlWphl+V9mctLUs/DXX0k2vraJ999hFjDEoppdKfI9UDUEopFR8a0JVSKkNoQFdKqQyhAV0ppTKEBnSllMoQGtCVUipDaEBXSqkMoQFdKaUyhAZ0pZTKEFnJfLCysjIzb968ZD6kUkqlve3bt7cYY8on+7ikBvR58+axbdu2ZD6kUkqlPRE5GsnHacpFKaUyhAZ0pZTKEJMGdBHJEZH3ROQDEdkrIv8Quv4zEakXkV2hl2WJH65SSqnxRJJD7weuMcZ0i0g28JaIvBx63zpjzHOJG55SSqlITRrQTbBhenfozezQizZRV0opm4kohy4iThHZBTQDrxpjtobe9aCIfCgij4uIe5zPvVtEtonINp/PF6dhK6WUGiuigG6MGTbGLAPmACtF5HzgfuAc4JOAB/jbcT73CWPMCmPMivLyScsolVJKxSiqKhdjTDuwCbjRGOM1Qf3AfwArEzFApZRSkZk0hy4i5cCgMaZdRHKB64FHRKTCGOMVEQHWAnsSPFallEq6DTsbeXTjAZra+6gszmXdmiWsXV6V6mGFFUmVSwXwtIg4Cc7of2WM+Z2I/CEU7AXYBfxVAseplFJJt2FnI/c/v5u+wWEAGtv7uP/53QC2DOqRVLl8CCwPc/2ahIxIKaVs4tGNB0aCuaVvcJhHNx6wZUDXnaJKKTWOpva+qK6nmgZ0pZQaR2VxblTXU00DulJKjWPdmiVkO+SMa7nZTtatWZKiEU1MA7pSSo1j7fIqrl4yc+TtquJcHrrtAlvmzyHJ/dCVUirdFOYGw+TqRWX8512XpHg0E9MZulJKTcDb7gegrWcgxSOZnAZ0pZSagLcjWNHS2q0BXSml0pYxBm/H6Rl6sPmsfWlAV0qpcZzqHaR/KEDFjBwGhgN09w+lekgT0oCulFLjsNIt51XOAOyfR9eArpRS47AWRM+vKgKgVQO6UkqlJ29nMKCPzNBtvjCqAV0ppcbhbe8jyyEsmVUIaMpFKaXSlrfDz6yiHMoKXQC09PSneEQT04CulFLj8Hb0UTEjhzxXFjnZDk25KKVUuvJ2+KkIdVYszXdrykUppdKRtamockYOAKUFLq1yUUqpdNTWM8DAUIDZoYDuyXfpDF0ppdKRteW/YkYw5aIBXSml0tTpgB5KueS7aOnut3U/l0kDuojkiMh7IvKBiOwVkX8IXa8Vka0iclhEnhURV+KHq5RSyWFt+68otlIubvqHAvQODE/0aSkVyQy9H7jGGPMJYBlwo4isAh4BHjfGLAROAXclbphKKZVc3g4/2U6hLN8NBBdFwd6biyYN6CaoO/RmdujFANcAz4WuPw2sTcgIlVIqBbztfcwqysEROlO0ND8Y0O1c6RJRDl1EnCKyC2gGXgU+BtqNMVYvyQYg7CF7InK3iGwTkW0+ny8eY1ZKqYQLlizmjrztybdm6PbdLRpRQDfGDBtjlgFzgJXAOZE+gDHmCWPMCmPMivLy8hiHqZRSyeXt8I+ULEJwYxHY++SiqKpcjDHtwCbgUqBYRKxDpucAjXEem1JKpYQxhhMd/pEFUQBPQQakXESkXESKQ6/nAtcD+wkG9ttDH3Yn8JtEDVIppZKptWeAgeEAFUWnA3q+y4kry2HrRdGsyT+ECuBpEXES/AXwK2PM70RkH/BLEXkA2Ak8lcBxKqVU0lgHW1h9XABEhLJ8l61TLpMGdGPMh8DyMNfrCObTlVIqo4zUoI/KoUMw7ZL2i6JKKTWdjN32b/HYvOOiBnSllBrD2+HH5XSM1J5bSvPt3XFRA7pSSo3h7ehj1gz3yKYiiyfdc+jT0YadjTy68QBN7X1UFueybs0S1i4Pu29KKZWBvB3+s9ItEAzofYPD9A0Mk+typmBkE9MZ+hgbdjZy//O7aWzvwwCN7X3c//xuNuzUMnulpgvr6LmxykZq0e25MKoBfYxHNx6gb/DMbmp9g8M8uvFAikaklEqmQCC0qSjsDD24W9SuC6Ma0Mdoau+L6rpSKrO09gwwOGzCztA9Nm/QpQF9jMris38rT3RdKZVZxqtBh9MdF9tsujCqAX2MdWuWkJN15m3JzXaybs2SFI1IKZVMVg16uEmcR3Po6WXt8ir++uoFI2+X5rt46LYLtMpFqWnCG0qvzg4zQy90Z5HtFE25pJOa0ryR179+/WIN5kpNI97O8JuKINjPpTTfbduUi9ahh1Hv68EhkOVwcLytN9XDUUolkbc92AddRMK+35Pvsm2Viwb0MOpaeqj25OF0CMdPaUBXajoZrwbdUlpg3+3/mnIJo76lh9qyfKpL8jimM3SlppXgLtHxA7qdZ+ga0McwxowE9BpPHsfbtP5cqekiEDCc7PSf0Qd9rGA/F61ySQvNXf30DgwzPxTQO/oG6egdTPWwlFJJ0NLTz+CwoXKilEu+i56BYfxjdpTbgQb0Mep8PQDUlhVQ7Qn+ltY8ulLTg3VS0eww2/4tpQX23f6vAX2MupZuAGrL86n2BMsXtdJFqenh9MEWE+fQwZ4BXatcxqj39eDOclBRlENhTvD26MKoUtPDRNv+LaU27ueiM/QxrAVRh0MoysmmOC9bA7pS04S3w48ryzEyCw/n9AzdfgujkwZ0EakWkU0isk9E9orIPaHrfy8ijSKyK/RyU+KHm3hWQLfUePI4fkorXZSaDqySxfE2FQGUhlro2vHkokhSLkPAN40xO0SkENguIq+G3ve4MeaxxA0vuQaHAxxr6+XTF8weuVZdksc+b2cKR6WUShZv+8SbigCKcrPIctizn8ukM3RjjNcYsyP0ehewH8jI5iYNp/oYChhqywpGrlV78mg81cdwwKRwZEqpZPB2+KmcoMIFgv1cPPkuW/ZziSqHLiLzgOXA1tClr4nIhyLyUxEpGedz7haRbSKyzefzTWmwiVZvVbiMSrlUe3IZGA5wstOfqmEppZJgOLSpKFyXxbE8+fbc/h9xQBeRAmA9cK8xphP4MbAAWAZ4gX8J93nGmCeMMSuMMSvKy8vjMOTEsWrQ54/JoYNWuiiV6Vq7+xkKmAl3iVpKC1zpuSgKICLZBIP5M8aY5wGMMSeNMcPGmADwE2Bl4oaZHPUtPRTnZVMyaoW7RmvRlZoWmqwa9KJIZuhuW9ahR1LlIsBTwH5jzPdHXa8Y9WG3AnviP7zkGlvhAsFTSxyiAV2pTGcdbFFRPHlAL813pW2Vy+XAHcBuEdkVuvYd4AsisgwwwBHgKwkZYRLV+Xq4bGHpGdeynQ4qZuRq6aJSGe70LtHJUy6efBdd/UP0Dw3jznImemgRmzSgG2PeAsIVZb4U/+GkTk//ECc6/Wfkzy3VnlzNoSuV4bwdfbizHJTkZU/6saWhs0VP9Qwye4Z9ArruFA050nq6KddYNR7ti65UpvN2+Kkszp1wU5Hl9PZ/ey2MakAPqW+xAvrZM/QaTx6+rn76BuzXLlMpFR/eDj+zI1gQheCiKNivQZcG9JB63/gB3eq62KBtdJXKWCc6/BEtiIJ9Oy5qQA+pb+mhckYOua6z82EjbXQ1oCuVkYYDhhOdEx89N5qVcmmxWaWLBvSQupYeasvPnp3DqM1FrRrQlcpEvq5+hgMmogoXgBm52TgdYrvNRRrQCZ4jWufrDptugeBv49xsJ8f0fFGlMlIkfdBHcziEkrxsTbnY0aneQTr9Q2ErXCDYjCfYRldn6Eplomhq0C2l+W7bbS7SgM7pplzhatAt1Z5c3S2qVIayAnplhIuiEFwY1Rm6DX08QYWLpTpUi26MttFVKtN42/vIyXYwI3fyTUUWT4EGdFuqb+khyyHMKRn/z60aTx69A8O2+wEqpabO2xnsgx7JpiJLab6Llm5dFLWdel8PNaV5ZDnHvx3VJdpGV6lM5W3vi6gP+miefBed/iEGhwMJGlX0NKATnKFPlD8HqCm1atG10kWpTBM8SzTyBVE4XYt+ykZ/tU/7gB4IGOpbe5hfHr7CxWKlY3RhVKnMMjQcoLmrP6oFUYDSgtBh0RrQ7aOpo4+BocCEC6IAea4sygrcurlIqQzj6w5uKool5QL22v4/7QP6RE25xqrx5GotulIZZqRkMcaUi87QbcQK6JPl0OF06aJSKnN424MBPdYZequNKl2mfUCv8/WQ73JSXuie9GNrPHl4O/y2WtVWSk2Nte0/2hl6cZ4LEU252Ep9qClXJPWn1SV5DAfMyG90pVT683b4yc12UpQbyYmcpzkdQkmeS1MudlLX0j1uD5exrDa6mnZRKnN4O/qoKM6JalORpTTfRZuN+rlM64DePzRMw6m+iBZEYXQtugZ0pTKFt8MfdbrFYrd+LpMGdBGpFpFNIrJPRPaKyD2h6x4ReVVEDoX+LUn8cOPrWGsvxkS2IAowuyiHbKfoDF2pDOJt90e9IGopLXDZ6lzRSGboQ8A3jTHnAquAr4rIucB9wOvGmEXA66G300pdFCWLEMyZVRVr10WlMkVwU5GfyhgDuic/zXLoxhivMWZH6PUuYD9QBdwCPB36sKeBtYkaZKKM1KCPc1JRONWePA3oSmWI5q5+AgZmx5xycdPeO8iQTSrfosqhi8g8YDmwFZhljPGG3nUCmBXXkSVBva+HsgI3RTmRt8zUWnSlMsfISUVRbvu3jPRz6R2M25imIuKALiIFwHrgXmNM5+j3mWCT8LCNwkXkbhHZJiLbfD7flAYbb5E05RqrxpPHqd5Buvz2+AEqpWJ3+qSi2HPoYJ9a9IgCuohkEwzmzxhjng9dPikiFaH3VwDN4T7XGPOEMWaFMWZFeXl5PMYcN3UtPRHnzy1WG93jer6oUmnP2lMSbadFy8huUZssjEZS5SLAU8B+Y8z3R73rBeDO0Ot3Ar+J//ASp9M/SEt3f1T5cwjO0EFLF5XKBN4OP/kuJ0U50W0qspTmB3eY22WGHsl3cTlwB7BbRHaFrn0HeBj4lYjcBRwFPp+YISbGkSgrXCzVHm2jq1Sm8HYED7aIZVMRjO7nkiYB3RjzFjDed3ttfIeTPHW+yJtyjTYjN5vCnCxdGFUqA3g7/FQWx5ZuASjJCxZU2KV0cdruFK1r6UHk9O7PSIkINVq6qFRG8Hb0MbsotgVRgCyng+K8bNrSJYeeqepbephTkos7yxn151aXaOmiUuluMHRSUcUUZugQ6ueiM/TUqo+iKddYNaV5HD/VRyAQtlJTKZUGmrv6MSb2kkVLab7bNjn0aRnQjTHU+6KvQbdUe/IYGArgs1Fje6VUdLztoU1FUwzodmrQNS0Duq+rn56BYeZHWbJoqQ4dGK1pF6XS18jRc1NMuXgK7NPPZVoG9Gibco01UouuAV2ptGVt+4+106KlNN/Fqd4Bhm2Qgp2WAT2ag6HDqSrJRURn6EqlM2+HnwJ3VlS9nMLx5LswBtp7Uz9Ln7YB3ZXliLmpvTvLyeyiHA3oSqWxqfRBH620wD67RadlQK/z9VBbmo/DEdvuMAgujDZoPxel0pa3o2/KC6JwuuOiHfLo0zOgt3THnG6xaC26UunN2+GPS0C3tv/rDD0FhoYDHGvtjbop11g1njxOdvnxDw7HaWRKqWSxyo5j7bI4ms7QU6jhVB9DATP1GbonF2OgsV3TLkqlm+YuP8ZAZYwHW4xWMtKgK/X7UqZdQLcqXGLdVGSxShc17aJU+rFq0GM9em60bKeDopwsTbmkwlRr0C1WQG/QgK5U2hnZVBSHHDpAWYFbUy6pUN/SzYzc7JGFjFiVF7pxZzl0hq5UGrK2/cejbBFC2/9t0M9lGgb04LFzsTa0t4gI1Z48PYpOqTTk7fBT6M6icIqbiix26ecy/QL6FJpyjVVdkqszdKXSkHVSUbyU2qSfy7QK6H0DwzR1+KecP7dYB10Yk/oeDkqpyHk7/FPugz6aJ9TPJdUttadVQD/SGloQnWINuqXak0dX/xAdfYNx+XpKqeTwdvjjtiAK4Ml3MxwwKY8F0yqgW+eIxmuGXq2li0qlnYGhAC3d/XFNuZQV2GNz0aQBXUR+KiLNIrJn1LW/F5FGEdkVerkpscOMj/qWbgDmlcYv5QIa0JVKJyc7Q5uK4lCDbrHL9v9IZug/A24Mc/1xY8yy0MtL8R1WYtS19DC7KId8d1Zcvl71SF90rXRRKl2c3lQUz5SLFdBTu1t00oBujNkMtCVhLAlnlSzGS4E7C0++S2foSqUR62CLeGz7t5TmB1vo2j7lMoGviciHoZRMSdxGlED1LT1xWxC1VHvyaDilAV2pdBHPbf+WkvxgPXuqD4uONaD/GFgALAO8wL+M94EicreIbBORbT6fL8aHm7pTPQO09w7GrQbdorXoSqUXb3sfhTlZFMQp9QrBQ28K3anv5xJTQDfGnDTGDBtjAsBPgJUTfOwTxpgVxpgV5eXlsY5zyqweLrEeDD2eGk8ejaf6bHGeoFJqcsGSxfjNzi122FwUU0AXkYpRb94K7BnvY+3i9DmiBXH9ujWePIYCZiQvp5Syrw07G9l0oJkDJ7u4/OE/sGFnY9y+dnD7f2oXRSf9m0NEfgFcDZSJSAPwPeBqEVkGGOAI8JUEjjEu6lu6yXIIc0ri+5t5dC36nJK8uH5tpVT8bNjZyP3P72ZwOPjXdGN7H/c/vxuAtcurpvz1PfnulK+nTRrQjTFfCHP5qQSMJaHqW3qo8eSR7YzvXqrTbXT7gqsKSilbenTjAfrGnDDWNzjMoxsPxCWgl+a7+LChfcpfZyqmzU7ROl98SxYtFTNycDpEF0aVsrmmcU4XG+96tDwFwY6LqeztNC0CeiBg4l6DbslyOqgsztGArpTNVY7TjGu869EqzXcxFDB09g3F5evFYloEdG+nn/6hQNxr0C01njyOay26Ura2bs0SnGPOQcjNdrJuzZK4fP3SkX4uqVsYzfiAvmFnI3/yo7cAePz3B+O6qm2pLgm20VVK2dctyyrJdzvJzXYiQFVxLg/ddkFc8ucQXBSF1PZziV9lvQ1Zq9rWQkhLz0BcV7Ut1Z48WroH6B0YIs+V0bdUqbRV19JDp3+If7r1Av6vS2ri/vVL81PfcTGjZ+gTrWrHkzbpUsr+ttYFW1Ktmu9JyNe3Q8fFjA7oiV7VtmgbXaXsb0tdK+WF7oQUR8DpgN7arTn0hEj0qralZmSGrgFdKTsyxrC1vpVV80unfED8eHKyneS7nJpySZR1a5aQk3XmtxjPVW1LSV42+S6nztCVsqkjrb2c7OznktrEpFssVi16qmR0QF+7vIo/v2zeyNvxXtW2iIi20VXKxrbWtQKwan5pQh+nNN+tVS6JVJwX7FP8wfduYEZudsIep9qTx9HQIdRKKXvZUtdKWYGbBQnai2IpzXeN9FtPhYyeoQPsa+pkTkluQoM5hDYXtfWldNuvUupswfx5G5fM9yQsf24JdlzUlEvC7PN2cm5FUcIfp8aTR9/gMC0pPrFEKXWmY229eDv8rEpw/hyCOfTWnv6UTewyOqD3DgxR39LD0iQE9GpPsHJGF0aVspfT9eeJzZ9DMOUyOGzo6k9NP5eMDugHTnRhDJxbmZwZOmjpolJ2s6WuldJ8Fwtnxvdwm3BGtv+n6C/1jA7o+7ydAElJuew4GuyDfO+zu+J+EspUbdjZyOUP/4Ha+1603diUSqRk5s9hdIMuDehxt9/bSaE7K+6nFI21YWcj33th78jb1kkodgicVj+bxvY+jM3GplSiNZzqo7G9j0tqE59ugdP9XFK1MJrRAX1fUydLK4sS/ps5WT1jYmHnsSmVaFuSVH9uOd3PJTXb/zM2oAcCho9OdCUl3ZKsnjGxsPPYlEq0LXVtlORlsygJ+XMIbiwCUlbtlrEB/WhbL70Dw0kJ6MnqGRMLO49NqUTbWt/KJbWlOByJz58D5LqC/dZtm3IRkZ+KSLOI7Bl1zSMir4rIodC/JYkdZvT2NYUWRJNQ4bJuzRJys51nXMt2Stx7xsRi3ZolZI35z+xyOmwxNqUSqeFULw2n+rgkQe1yx5PKzUWRzNB/Btw45tp9wOvGmEXA66G3bWW/txOnQ5JSqrR2eRUP3XYBVaFZb7ZTyHNlsea82Ql/7MmsXV5FeaEbd6hJWZZDKM7L5uYLK1I8MpWp7FJVlcz689HKClz2rXIxxmwG2sZcvgV4OvT608DaOI9ryvZ5O1lYXkDOmJlzoqxdXsXb913DkYdv5pkvr6Kjb5An36xLymNP5GSnH2+Hn69fv5gjD9/Mj790Mc1d/fzivWOpHprKQHaqqtpS10pxXjZLZhUm9XGDM/T0WhSdZYzxhl4/AcyK03jiZl9TJ0srkvuDtKys9bDmvFn8+I2Pae5KXaMegM0HfQBctbgcgOuWzmTVfA8/eO0Qnf7BVA5NZSA7VVVtrW9j5TxP0vLnFk++O303Fplg04JxGxeIyN0isk1Etvl8vqk+XETaegY40elPSv58PPd9eikDQwEef/VgysYA8MZBHzML3ZwzO/jLTUT4u5vP5VTvAP+66eOUjk1lHrtUVTW193GsrZdLkpxugeDmopaegZT0c4k1oJ8UkQqA0L/N432gMeYJY8wKY8yK8vLyGB8uOvtHdojOSMrjhVNbls8dl87l2fePc+BEV0rGMBwwvHW4hSsXl59Ri39+1QxuXV7FT9+u11YFKq7sUlW1td6qP0/ugigEUy4DQwF6BoYn/+A4izWgvwDcGXr9TuA38RlOfFgBPVUpF8s91y6iwJ3Fgy/tT8njf9jQTnvvIFcuPvsX6bo1S3AIusFIxdWfXzr3rGs5WcmvqtrycRtFOVmcMzv5f6WPbC5KQdolkrLFXwDvAktEpEFE7gIeBq4XkUPAdaG3bWNfUyezityUFrhTOo7iPBf/49pFbD7o442DyUk3jbb5YAsisHph2Vnvq5iRy1+uns8LHzSx63h70semMlOnfxARmF2UM3LtK1ctiPspYZPZWt/KytpSnEnOn0OwygWgNQULo5FUuXzBGFNhjMk2xswxxjxljGk1xlxrjFlkjLnOGDO2Cial9nk7k9IyNxJ3XDqXGk8eD720n+FAcnNqbxxs5sI5xZSEZgxjfeWqBZQVuHngd/v0YA41ZcMBw/M7GrlqcTlbvnMt+/5xDTNyszl4MrkpxxMdfo609qYk3QKjOi6moHQx43aK9g8Nc7i5Oyk7RCPhznLytzeew0cnuvivbceT9rgdvYPsOt7OVYvOnp1bCtxZfOP6xWw7eopX9pxI2thUZnr341a8HX4+d9EcAPJcWXzxkho27j3BsdbkrdWczp8nf0EUTjfoSkUtesYF9EMnuxkKmJRWuIx10wWzuXhuCf/y6kF6ktT4/u2PWwgYuGrJxAvRn18xh8WzCnj4lY8YGAokZWwqM63f0UBhThbXn3u6ivnOy+bhdAg/fbs+aePYUtdKYU5Wyv5Kt3LorXbMoaebfSMLovYJ6CLCd29eiq+rn39/Izmlgm8c8FGYk8Un5hRP+HFZTgffuWkpR1t7+c8tR5MyNpV5uvyDvLzHy2c/UXnGZr5ZRTl89sJKfrXtOB19ydn3sLUuWH+eivw5QJ7LiTvLkZLNRRkX0Pd7O8nNdjKvNLGne0fropoSPnNhBU+8WYe3I7E1ucYYNh/ysXpRGVnOyX/EVy+ZyepFZfyv1w/R3puZZ6LaZTt6OHYeW6Re3n0C/2BgJN0y2l2ra+kdGE7K7uTmTj91LT1J798ymohQmp+a7f8ZF9D3NXVyTkVhyn47T+RvbzyHQAAe25jYzUaHmrvxdvi5clHkdf/fvXkpXf5BfvSHwwkcWWrYaTt6Oo0tGs/taKC2LJ+Las7+i/C8yhlctqCUn719hMHhxKb1ttSnpn/LWKUFbl0UnSpjDPttVOEyVrUnj/9++Tye39nAnsaOhD2Otd0/XP35eM6ZXcTnV1Tz/717hCMtPQkaWWrYaTv6WHYeW6SOt/XyXn0bt188Z9zDZL68upYTnX5e2u0N+/542VLXSoE7K+VFEanquJhRAb2xvY9O/1DKf5gT+ZtPLaQ4N5sHX9yfsFLBNw76WDSzIOrded+4fjHZTgePvPJRQsaVKnbZjh7NGOwwtkit39GACNw6Qa351YtnsqA8n5+8WZfQEtmtda18cl5JRKnGRCrNd+mi6FRZPdDtOkMHmJGbzT3XLuLdulZe3z9ux4SY9Q0Ms7W+LarZuWVmUQ5fuXIBL+85wftHbLW1YErssh09nIoZOWGv22FskQgEDOt3NHDZgtIJx+xwCHddMZ89jZ1srU/M/63mLj8f+3pS0r9lLE++y54bi9LJfm8XIow0orKrL66ay/yyfP7p5f1xzylurW9lYCgw0l0xWn95ZS2zitw88OJ+AkneCJUoVpuD0bId9jiAJFxf+txspy3GFon3j7RxvK0v7GLoWLddVIUn38WTbyamhPE9m+TPATwFLvyDAXoHklOmbMmogL7P20FtaT757qxUD2VC2U4H9336HOp8Pax44LW4Vje8cdCHO8vBytrYVvnzXFl864YlfHC8nYsfeDWtKy8sF9WUEDBQlBP8f5GT5SAALChPzjmT4xkaDrDpgI/yAjeVoZm6EFygTvZW+Vit39FAvsvJjedPfphLTraTL62ay+sfnaTO1x33sWypayXf5eR8G+xBsTZSnfs/Nyb1+ZNhAd2+C6Jj9fQP4RDo6BuMa3XD5oM+Vs0vndLBHk6HIMCp3viOLVWsHO/Gr1/JkYdv5t37r2VmoZuv/nxHSnvC/+L94xxu7uaBW8/nnfuv5dWvX4kBTqXotJto9Q4M8dLuE9x0QQV5rsgmUXesmku2w5GQjUZb69pYMc+T8vz5hp2NPL/j9HMlmc+fjAnonf5Bjrf12WqH6EQ2aNQ4AAAUD0lEQVQe+/1BxmY0plrd0HCql499PTHlz0f7l98fPKvBfbpVXlgCAcPzOxu4fEEZFTOCOd6SfBc/+sLykSdaKvrYdPkH+cGrB1lZ6+GG0M7KRbMKuXpJOU+/e5T+oeS3Xo3Wxr0n6O4f4nMXT55usZQXulm7vJLntjfE9RdXS3c/h5q7U1p/bnl04wEGxqRSk/X8yZiA/pE32ADIzhUuoyWiumHzwRaAmPPnk40hnSovLO+Fcry3jwk6K+Z5+OYNi3nxQy8/T8FxfD/+48e09gzwdzcvPaPU78tXzKelu58XdjUlfUzRWr+9kTkluaycF10Q/fLq+fgHA3G973bKn6fy+ZMxAX2/Dbf8TyQRlRdvHGymqjiXBeVT2yVr56qQaK3f3kCBO/yB3X915QKuXFzOP/x230iFVDI0tvfx1Fv1rF1WyYVjWjNcvrCUc2YX8tRb9bbugNnU3sfbH7dw20Vzoj7ibfGsQq5cXM7P3jkSt79EttS1kudyckFV6g61saTy+ZMxAX1fUyeefBezilLbAz1S69YsIXdMntvtjP0ggMHhAO8cbuXKxWXjbu6Y0thScEjBVAVzvF5uumA2ua6z1xQcDuH7n/8ExbnZfO3nO5LWOO3RUJ3/uhvPOet9IsJdV9Ty0Yku3jrckpTxxOLXOxsxBj53UWyLt1++ohZfVz+//SA+G4221rVx8dwSslOcP4fwz59kVS6l/ruPk+CCaOGUg1myrF1exUO3XUBV6Le2Q6CyJJdbllXG9PV2Hmunq39oyumWcGMTYOHMgrSpvLBs3HuCnoHhCUvqygrc/PDPlnOktYe/27An4bPiD463s2FXE3ddUTtyf8f6k2WVlBe6E1beN1XGGNZvb2DlPA9zY+yZtHpRGUtmFfJkHDYatfUMcOBkly3SLXDm80eAquJcHrrtgqQ8f+xd3xehoeEAB052cWeY46/sbO3yqpEf8jNbj/LdX+9h494T3Hj+2bXJk9l80IfTIVwW5nSiqY7tX/94mH9+5QDvfNzCZQvi8/WTYf32Rmo8eXxykhzvpQtKuefaxTz+2kEuXVDK51dUJ2Q8xhgefHE/ZQUu/vrqBeN+nDvLyZ2XzuWx3x/k4MkuFs+y176KncfbqWvp4StXzY/5a4gId62u5dvPfcjbh1u5YoK+/ZN5L4Xnh45n9PMnmTJihl7X0sPAUCBtKlzC+dMV1SyaWcDDL8fWl3zzIR8X1RRTlJMd97H9xeXB2eSDabTZ6HSOtyqiHO/XrlnIZQtK+Z+/2cOhBJ2ws3HvSd470sa91y2mcJKf0xcvmUtOtoOnbDhLX7+9gZxsBzddEP3EY7RbllVSVuDmybfqpvR1ttS1kZPt4IKqiVtFTwcZEdDTYcv/ZLKcDr5z81KOxNCXvLW7n92NHVF1V4xGTraTb9+4hL1Nnfw6TWrRT+d4IyupczqEH/zpMgrcWXz15zvoi/OJ7QNDAR5+eT8LZxbwZ5+c/C+AknwXt188h1/vasTXlfwt5OPxDw7z2w+auPG82ZP+UpqMO8vJn186lz8e8E3pl+iWulYunluCKysjwtmUZMQd2O/txOV0pHzn31Rdvbg8pr7kbx1uwURwOtFUfPbCSj4xZ0awO2Ccg128jeR4az1Ue/Ii/ryZRTk8/qfLONTczd+/sDeuY3pm61GOtPbynZvOiXjjy19cXsvAUID/Y6ODR17bf5JOf3S15xP50qq5uLMcPPVWbH+JnOoZ4KMTXayqtUf+PNWmFNBF5IiI7BaRXSKyLV6DitY+byeLZxfYYoV7KkSE79y0lM4o+5K/ccCHJ9/F+ZWJK9lyOITv3nwuJzr9PPnm1P5ETjQrxzu29jwSqxeV89WrF/LstuNx29nX0TvID18/xOULS/nUkpkRf9788gKuWzqT/7PlKP5Be/wSXb+9gdlFOXFbS/Hku/jcxXN4fmcjLd3R/yXyXqiJnB0actlBPCLgp4wxy4wxK+LwtaJmjGFfUydLZ6dvumW0pRVFfP7iyPuSBwKGzYdaWL2oLOp64GitrPWw5rxZ/PiNj2nu8if0sabiue0N5GY7Y87x3nvdIlbO8/Dt9R+y8sGp99r5fzcdoqNvkO/edG7UVVh3XTGf1p4BW6S6mjv9bD7Uwq0XVcX1ABnrL5FPPfbHqO71hp2NfOPZXQDc+8udaduaIp7Se0oL+Lr6ae0ZSOsF0bG+eUPkfcn3eTtp6e5PWP58rPs+vZSBoQCPv5rYU5di5R8c5ncfNHHj+bMpiLFJW5bTwU0XzGZgKEBzV/+U+tkca+3l6XeOcvtFc2L6P7pqvofzq4p46q36lC9Ib9jVyHDARLwuEak9jR04BLr8QxHfa+ukp55Q+q+pw5/W/YbiZapliwb4vYgY4N+NMU/EYUxR2ZtmO0QjYfUlf/y1g2w7Emw4NJ7Nh4KnE61enJxywtqyfO64dC5Pv3OE/3ZZLUts1qp4JMc7xaDzkzDVJVY/jmjK0R555SOcDuFbMW4qERG+fMV87n12F28c8kWVsomn4LpEI8uqi1k4M75rVY9uPBC2r9G9z+7i3tAMPBKx/HwyzVRn6FcYYy4CPg18VUSuHPsBInK3iGwTkW0+n2+KD3e2dNvyH6nRfckn2nix+aCPcyuKmFkY/qCERLjn2kUUuLN48KX9SXvMSK3f3kDljBwuXTC1nOp4fTca2/vojnBH6fajbby428vdV85nVlHsP5+bL6xgdlFOStcu9jZ1cuBkV9wWQ0ebqMfJPdcuCvsSy9eaDqYU0I0xjaF/m4FfAyvDfMwTxpgVxpgV5eXxTwvsa+pkTkkuM3LjX3+dSnmuLL55wxJ2HW/ntx+G3x7d3T/EtiOnptxdMVrFeS7+x7WL2HzQxxsH4/9LOlbNnX7eOOiLS453or4blz70Og+9tB9vx/jBwxjDAy/up7zQzd1Xxr4BB4L98//b5fN4+3BrUnvOjPbc9gZcTgefDXMgx1SNd6+rinP5+vWLw76Mt8s2HfsNxVPMAV1E8kWk0HoduAHYE6+BRSqdeqBH63MXzWFpRRGPvPxR2CqHdz9uZShg4rLdP1p3XDqXGk8e//TifoZtstlow65GAgZui0OOd7x+HPdet4grF5fzkzfrWP3IJu755c6wB36/uNvLzmPtfOuGxXE5cOULn6whz+WMubxvKgaGAvxmVyPXnzuL4jxX3L9+LL1PUtkvxc6m8j9tFvDr0Kp9FvBzY8wrcRlVhHoHhqhv6eGzF8bW/8TunA7h725eyhef3MrP3jnCX1115nbxNw42k+9ycvHckqSPzZ3l5L5Pn8PfPLOD/9p2nD9bWZP0MYxm5XiX1xTHZT+ClYd9dOMBmtr7qCzOZd2aJSPXj7f18h9vH+HZ94/xm11NrJrv4ctXzKfTP8hjGw/Q1OEnyyFkO+JTdzAjL5vPr6jmma1H+faNS2JK4WzY2Tju9zPR5/zjb/dxqneQLXWtbNjZGPcc9WT3Ol6fMx1IMlt0rlixwmzbFr9y9Z3HTnHrv77Dv33p4oiOwEpXf/Gz93m/vo0/rrua0oJgN0ljDFc+uokls4p48s6UVIxijOH2f3uXY229/PFbV6f06L89jR185kdv8eCt5/PFS5LX06ejb5Bn3z/Gf7x9BG+HH4EzDgfJzXbGrTHT0dYern7sj/zN1QtYt+bsTo0TsapC+kb9pefOcvB/X7OQT50TfqF100fN/OgPh+kf1Yoint+PipyIbI+kNDytyxb3hw61OC+DShbD+c5N59A7OMwPXz80cu1Iay/H2/q4KknVLeGICN+9eSm+rn7+/Y2PUzYOCOV4sxx8Jsl/rc3IzebuKxew+dufoiQvO6EnPc0tzWfNubN5ZuuxqA4fNsbwwO/2nRHMAfqHAjz2+4Pc/L/eCvvy2O8PnhHM4/39qPhL626L+7wdFLqzmFOS2QshC2cW8oWV1Tyz9Rh/fuk8Fs4sYHNoMTLZC6JjXVRTwmcurOCJN+v4wiU1I8e8JdPoHG+qFseznQ7ae8OfTxrPyosvr67llb0nWL+jkTtWTfyXyOBwgN992MSTb9bTMsFxb/9+x8Vhr3/lP7eHvT7dK0nsLK1n6Puaggui6dIDfSruvW4xudlOHn45uNlo80Ef80rzYu5HHU9/e+M5BALw2MbUbDbadKCZU72D3B7nDS/RSsZJNRfPLeET1cX8dIKNRh29g/zbGx+z+pFNfP3ZD+gfClA8zi+6quJc1pw3O+yLVpKkn7SdoQcCho9OdCWsd7XdlBW4+ZtPLeCfXznAxf/Pq7T2DJDvciZkkSpa1Z48/vvl83hicx2bD/po6e6PatFtqgtb67c3UF7oZvUUemrHw7o1S87KU8e78kJE+MvVtXzt5ztZ8eBrnOoZGLlvF88t4am36vnVtuP0Dgxz+cJSHvrcBVy1qJwXPmiKemzJ+H5UfKVtQD/a1kvvwHDaHAodD+UFbgRoDf353DMwzP3P7wZIeVCfW5qHAXyhBkvW9m0Yf2xjF+oi+ZyxWrv7+cNHzfzFFbURdzFMlGRVXvQPBhCCJ/VA8L5941e7MIBThD/5RCV3ra7lvFHN2rSSZHpI24CeCT3Qo/WD1w6Nu+iW6ifZ/9509qJo3+Awf//bvQyNkxp44MWzF+qi/X5e+KCJoQT0F4lVMk6q+f6rB8/6fxAwUODO4rVvXMXsGeFLGmMZW6pO3lGxSduAvt/bidMhLJqV3j3QozHeYpQdFqnGG0N77yDf+q8PovpajVF8P+t3NHB+VZHtesok0nj3uqd/aNxgrqaHtA3o+7ydLCjPJyf77NPcM1VlcW7YYGeHRarxxjar0M1zf31Z2M+5/cfvcDLMaTxZDuGX7x1j7fKqCX++H53oZE9jJ9/77LmxDzwN2fn/gUqttK1y2e/tnFb5c7D3dufxxnb/TUup9uSFfbn/pqVnfU62U5hZ5Oa+53dzxSN/4IevHaJ1nIMP1m9vINsp3LJseqUE7Pz/QKVWWs7Q23oG8Hb4M6oHeiTsvEgVz0W3W5ZV8u7HrfzkzToef+0g//rHw9x20RzuuqKWhTML2LCzkX9+5SOaOvzkZDvYfNBni3uQLHb+f6BSKy23/r99uIUvPrmV/7xrJauTdLCDSo3DzV089VY963c0MjAU4NyKIg43dzMwrNvR1fSR0Vv/M7UHujrbwpmFPHTbhbxz3zXce90iPjrReUYwB92OrpQlLQP6vqZOZhW5KQs1qlKZr6zAzb3XLT7rZBuLHSp9lEq19AzoGdwDXU1Mt6MrNb60C+j9Q8Mcbu6edhUuKkgrPJQaX1oF9A07G7ni4U0MBQy/eO/YtD/hezpau7yKh267gKriXITgjF0XRJUKSpuyxbF9P071Dtqmj4lKLt2OrlR4aTNDf3TjgXH7fiillEqjgG7nPiZKKWUHaRPQk3F4gFJKpbMpBXQRuVFEDojIYRG5L16DCkerG5RSamIxL4qKiBP438D1QAPwvoi8YIzZF6/Bjab9K5RSamJTqXJZCRw2xtQBiMgvgVuAhAR00OoGpZSayFRSLlXA8VFvN4SuKaWUSoGEL4qKyN0isk1Etvl8vkQ/nFJKTVtTCeiNQPWot+eErp3BGPOEMWaFMWZFebm2ulVKqUSZSkB/H1gkIrUi4gL+DHghPsNSSikVrZgXRY0xQyLyNWAj4AR+aozZG7eRKaWUisqUerkYY14CXorTWJRSSk1B2uwUVUopNTEN6EoplSGSeki0iPiAo0l7wDOVAS0pemy70Hug9wD0HkD63YO5xphJywSTGtBTSUS2RXJqdibTe6D3APQeQObeA025KKVUhtCArpRSGWI6BfQnUj0AG9B7oPcA9B5Aht6DaZNDV0qpTDedZuhKKZXRMjKgi8hPRaRZRPaMuuYRkVdF5FDo35JUjjGRRKRaRDaJyD4R2Ssi94SuT6d7kCMi74nIB6F78A+h67UisjV0ytazoT5EGU1EnCKyU0R+F3p7Wt0DETkiIrtFZJeIbAtdy8jnQkYGdOBnwI1jrt0HvG6MWQS8Hno7Uw0B3zTGnAusAr4qIucyve5BP3CNMeYTwDLgRhFZBTwCPG6MWQicAu5K4RiT5R5g/6i3p+M9+JQxZtmoUsWMfC5kZEA3xmwG2sZcvgV4OvT608DapA4qiYwxXmPMjtDrXQSfzFVMr3tgjDHdoTezQy8GuAZ4LnQ9o+8BgIjMAW4Gngy9LUyzezCOjHwuZGRAH8csY4w39PoJYFYqB5MsIjIPWA5sZZrdg1CqYRfQDLwKfAy0G2OGQh8yHU7Z+gHwbSAQeruU6XcPDPB7EdkuIneHrmXkc2FK3RbTlTHGiEjGl/eISAGwHrjXGNMZnJwFTYd7YIwZBpaJSDHwa+CcFA8pqUTkM0CzMWa7iFyd6vGk0BXGmEYRmQm8KiIfjX5nJj0XptMM/aSIVACE/m1O8XgSSkSyCQbzZ4wxz4cuT6t7YDHGtAObgEuBYhGxJjJhT9nKIJcDfyIiR4BfEky1/JDpdQ8wxjSG/m0m+It9JRn6XJhOAf0F4M7Q63cCv0nhWBIqlCd9CthvjPn+qHdNp3tQHpqZIyK5wPUE1xI2AbeHPiyj74Ex5n5jzBxjzDyCJ4r9wRjzRabRPRCRfBEptF4HbgD2kKHPhYzcWCQivwCuJthR7STwPWAD8CughmDHx88bY8YunGYEEbkCeBPYzenc6XcI5tGnyz24kOBil5PgxOVXxph/FJH5BGerHmAn8CVjTH/qRpocoZTLt4wxn5lO9yD0vf469GYW8HNjzIMiUkoGPhcyMqArpdR0NJ1SLkopldE0oCulVIbQgK6UUhlCA7pSSmUIDehKKZUhNKArpVSG0ICulFIZQgO6UkpliP8fzy0pSeVK5i4AAAAASUVORK5CYII=\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " \n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)\n", + "\n", + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we get a probability distribution that is much more symetric!\n", + "\n", + "\n", + "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/assets/circ2.png b/examples/assets/circ2.png index 89ce420986bc0edeed6af84c3afc7341c5405882..21e2273f8baf03b308f4b664dff65284183b8814 100644 GIT binary patch literal 34563 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 PcNYI*Y;Kfm=yKsdAp?s# literal 12396 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 diff --git a/examples/assets/cycle.png b/examples/assets/cycle.png index 283339faf70e34c5596bfccdd0c14f3bb9329220..89ce420986bc0edeed6af84c3afc7341c5405882 100644 GIT binary patch literal 12396 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 literal 31484 zcmc$GhgVZs7w<(>bOe#1N>vP?q5>jaibD-mL_-gV2+{?l1p-kg7%PqGf25a@Py?a+DMz_=b^*7W^GI?n-r8zQ+>0P=~ z=7~rqZn4Nidhm%34NZmA*{$p-j?!6Gg|WZd-(k+%_RJgnF2J{ij^T~xkyZcy{nJ>^ z&%xBFZu#7C3MGIVK#?QRlj4?Xj+U?hY?DgqLb){^fMPo5P%5YaQS!KPYw2n73`#+~ z`mLF-O;5f$6nWsBeU(Q%MHqe5pv(j&!E=|s_)dI5O^I##!m`BebL4z9CXySXT0Et6 zpaM*Ml2O4D1EEFf4EyTj4pAIX1#b1e+CFfhMnFzab67$h!<}{0<(zE22uF)w@ zh#)K{Nxsz`s&8NL$Szl+`d!=+h~70%+^%VHi*@V9+WU60^6{npbBHx+2M&=ZUzynB zPR`l6n}LVjQynMD)7?oY$X(^>ckr5UL(b09hu>ZGx58}tUgICq4lGByLsS+4R8Rmc z5!VoxlP%*qyK>tq0hi0~o7vD$);RV--%<{s)#NHfJtr_L6pYU`NlS$% zqGh;|?`NbJNA#WIUYFF#kWJN$Au2k~V5=|Bv~BjCHThW)r3zE#4!gzrrSeabQi{8brK_`j!q=MI zSwu;3c_ZiPF1F|*HWc@|Z^Lph7zIJnY!ybqr)Z{JuF3bJYLj#F6YExI$1y8an2Q$& zKdz8mymZ(B>6U0U>6+@`SMirKf8S_$nJ4Et6Qb?i6X3X`HZLL13`sw%F!0%>Mv=3v z$iHN-8;;Wbu1Qw6-Z}Esq)AgAvd{UZzw)xPbzrYg-+1Af)x-*BC9$)QKMcL~-~2IfiH3q zGZ6s8I9Zt>!egZq>j_*_15Ncv>1f4Xy=AZ#_Ed84TGBH1|NFr*RSHG?&rAJoUNqfIxz=G2yWI_E)+ zRf0C{r44+r)vX(n1Fzr6VZHJolH-d*1mTM?rE_E~)CE@3{JTkrC}_IV*covIiZPIR zG^#?*)cpI?FiPr8=#SFUMRBMRH*(6hc%SEpK8BUd-I;8sUidZ&oA%SPm6<@ks6dV% znd%o|w=D8DlN@;SMq$DAKZx{E$U;LZ$Z)4``(*S)nv2)r3hdCmP;mGppz2+ByylZ4 zYSURd9)O)Cyg%MZDJ zkY>+xgnHlkJP&VLit9;=hs2zDq&e_80m5L?it)MEAnJyyr^p=S1vt zEF1UXK8$;l5009s65)!hQTGEwHKly0V|vEWC|XgRWX7 zt%>$!$;6*@Wjo2F`U!CQ$lKZ7zNW5x->P%uc|d9G+jbmp$pzTZx79BdaAs2SUkxe6 zhArzUeTjaF>a3yUsXwf-5e^8EAS?AI&#>7yGxj`2Ja=4IMh>-mc|n1R(E07SB_``IsP@3TJ5W9tXE2q z-Tx)}wgkVjh7`h?E5B%@lNZjK82H?-R0tD_dw-D7S#y%?)xXy_*1Z(J!_=q0vNOXH z3S{w*7yX)ids>QL^F`~sVX4(0Acyg>$+dmSWS6Sy*jze(0URphfNfIa)L| z7{?k|n^W3TlW?7=p5Yk3KioQCA`~Q3f$SV>zVaqY9UR;TbM^E4R?E-^XT8S}x5|A&uR> zgV+!q^o3ch&G|cGx$G8KHYal)taLMMPJ6%aqRPR-KE>?mg75^1f$t!4;Y-e*&GH$; z_{Jb_{J_~u zT8`u%_!U&-m<$LLaFLp1f{0!ya^-AwU@gWcG`)|%z>2(+>>Ar3F)#}3bzGC|_) zg(y4s3m^Sm#d2wPWvbuC*X7246KL)2c(nDM$=*t}OqPY$mzIKAdC`_KTCm#eWkvSP zwydN7liR!xI6@k}SRvUNzwG39 zm9AnfYyXW{GziR_AGA)jaxINJ4%xeUJf#F@OLk0_!_M#FhSsYxo4-3RSI}SB352|j z#bQOx zrk@{NOFwi!)cJrg-+mLLm1n4a@qv2|4X$622vDBfjFvaNs7_`>d(Ley+7Y*v$VQx- zyyp#8l2D5?TnUhdS8_b%p^Liv?aqy`)+|)8*nr$TzDEIk{lz%7^b+|Ox(yvX@AA)E z<1+1B3_UOI7zldYd-7L2>%UZ8Ap0F38@bxOO2@#d_G44Noj@OEt+D|GN<7)q(A#Whx-t6n<#|cf@p%QJy@OqNV#?)D@0(wzCQWUOJ7ZpxO!h%g_gt;^vx>`P zd{6bWPf`2Bza3kuJK+Ee*qlw&TQh_;zcBPUxtW04OQtZPC+U%34sZb)%N30FzJilA zP?r1F-94Iu$78#fR2F7W?V~@-J+^P>jxpR#oE!VKV*t+)*K94~2hg4glqJ+w&W>IN z@EZD;rZBlXr$733g$n+Bi4GmyT;B%`cNwD>(kSw&%D2+XMXr3mS2|l}oVq+^-0JO< zyK6bLG{qynX;z~yJ(+^q>&tfr+T)*g6a4MvpPbt}zlrWI94k?kMm~23kJzY)4P4^c zVSt zBMlD@L5-*lJ=2&XBcEUnCWz8#?9o%?Nq-s%1~l)wEcSO49otF-zwNfSMAx_&4F=x? zSBxBL!F3Zj`jVm$Vej1ycs7bYy&nuWeETS8G=`=PJd_PyDVMxV;d9^%vWz;}F6!fK zU0XW@EwxVq@WNEr_Nn82fEI}_G?>{b)ir<>YH;?N=U07@X}-y$-%9=URwVimFn8EGfuiyzc2h_MBnBwSRdWU2Vo@cM^X1%papd1B6 z@FhP(N$_g-$)V+WIe{DMkwlrvs#kt*77jL{A7?}wpvr0iN6V?*Gp|(m6ri=!@;PNZ zt3+9nEGWYS#SF}$!p_YUf~}qa^5W!Wh`+t0hD=-;EZ<{Q%*z33c;uqKMm?CB1y2)8 zym(goR#3H(fbQC2uBM(ZsNg6-_eXz|vaGz?C*b==x=`BMsgzpoYkSCg=-(ARc4BqO z2!{s>QMud)dbrW@e*(i>glALw4_9D62VIQP7dV|Yo79Q3HJTaSW%U?frl6d84s?m3<&Obk%PkWrSy^f-Dr6hLwojDJ{Ng3mf4~CW3o>kSgT8>ttkJC? z_~p{cMIGlrMhKvNu9@bZN0&WJ1dA^{%Q|h9OgRP?|CSi8EN5AXn`Z{=92{v7vozz< zNW$jZIpH-5hH8P^Ah-hQiXI{6V(1D$g!Cb`>s+dCL_tKd)BI|UTlF}CFDZM*=x6S0DogoC_Z(V^KcveRS(34SzA*w{X0si5_2ZSmWcCWnUG%-;q z!_FNM>=GpgBes~Fe&!4X84PFFi*)h9@E_-wO zj@kvVkNN<2)5ZTW77OGcvHB#r0$C#1TEfz*2S4^V7*Mbfk27me02A5U*S*PHQ@N%E zX%xRCQev_Q)rw?M836XhJVakOH`DM=Sxyw}G!Qc*d6yj#`o^H^nrs{Qz?Ml4-6(VJ zhhL@On8?GB{f`*bW{@chmgp!8#*==GXm^&$lTU)R`7BrhTzpeQZr5Q=rtf;(((1CT&KPg=TLy@nU$LGZS9c_Ze+kO;e3T(Aw^&p)IhxE ze4rF~Nc6zK-BJ4hPAmXeMR=l(zHnitWlZAbd9e0HAtL>+K~u264~%gCRZTTC;D#g6 z87o;!is$E5$|2~-3mtg-P2QyuG=X*Ce zIqJcLFPJRj!?Lz2a4Z+V&*I~f+NGtJ$!(11PtY&8{eCTjpPOe(dMbk(uwd6QUCGzH zsG;UymRkU*^@`dz;f0px;sk2A{3iT0ioO!CY<~i>k4a0U|1~fHcuU~t1c&qX2~fb? zNee3tqGSgdCMdhJT>XPBc-^QtqO@jt022R?(*c+~*R*?Vkl}yJ+A`i|FysCH`N912 zwY{n7$W3X@%=elKB?7J`qP)(`wE3Zrg2#8=PN73nahk2MpTUGE%M|*DE4fYK;ULHi zvYCk;N1x`@`MQ$}|`i4MwBLv)Al4YY_FE zC>r3Er)`Ib(H2U9=fEd(gj}vIoN3$z6GZ;(tMECec`&E}Tfi8@Qbb^9x^8Ljhd#|_ zpxmPW`B?;bXP;D;ooCQ5uB4>}Nv9Z}jrteF1{TNwq7iI!qbK)|dSp#_lskIvw+my0 z>bp!Gd?Z*P@SDL(LYB0m3d1-_w>n8EW#^em=^=VTS`eE=|I+si84)pDnTf$a10$9| z@}MT`#Kse312@McXL^Aa0=J*FV()y^{a*AMU>79oK4$DOSme0_tiJu-`Tnbi>g)hT zv`BVtzu6=d3(#N(yV;{ee}HHT{7euoy`8Hwk7?KibV~;=B;aJf@iLzO9*^K(s~6oz z_#h)ee%bUnEcEgdK8P^NP`*N2xhP+te8YbZLDxSJ-XCW)(*5Pt-*+BbHi{$ z9awWnb>VYX8cCe&1ZLV@TW~0|OQzT(LOXGEuIKH@%wPamjo!b2#&B`&NPtt&NLQ@L za|0T|ObhBrueUT@Q9un~kOdyk!^0Lmm3Ew9iS*js(YX~wBV@GKp=Jkqm_tUAKpno>j3%C zNashd6l9H(7-Fp96>KK+ve>|<3c1I=kNjPSJpC4Dfe4V?9sw`m@%9nqcr-%t^MXOp zY6+-KuD@zHt{^smSZUTsTNOFaO8UAY2b0EP^{ttqyfI*9po8D6&AigRfftq$5Q9>x zPOSTLqai-&Xrc|a=RT zoC;Ya8n-ddkZ##o;Cy-4R03-G?&@CZ`78za^eqK3riMLZKwm+c<3rlEb(auhKzOemkVdU7^fZplOvC~ACTGlpSa?R9x{e6J$=|zKYS?7T36S}s(QnEqNukTC zkp(U$i&xj=5lz5p8>X}5jJ{e?LYSea+K`E<2NvCarqyU=%Hf|~131WGAEZGl#2zHP z9FO`Nf_g%3F+omG7ir8;BlWv14~VC>#`6KPAKasu9{BSelsD zgebCK5S$961-ey+n1<9HZNNmTP!fG@vLDzqsQH&szQR3q8z49CC~|Ss;nk>eg#Z@t z!t)aY!44%>PXTt|9=#CFFXB5edFmDNWXH(xPvn-T|?NI4??)U9?B= zXjt1}A7M4vXh!nNIxzB(VN|U`&uB3?`|Sec?igkucL$*Sz_VRvOXU}Wsvh2oCi~uo zRS`mou85&i-X;S12vd|M4?2v8JOZa}uU}W2_o-jJngoP){3Oh5i_Kx95gwMRpFQ!}u3Lfg<6dt`= zt8N5{$wJh-A>ogDhiEaxDEiJKS{_UrJ}J~hsl32&dI)JgSK;^CLVNOHV|xAuWm$WY*-K#a8XNU09hx3bj1R0AQiSx>v7XeWny)&yy zpBaL}KUPXYe0s$u_=l4hkmc%qrh2x9>Va~lahjY3d8-e!-oTHF5c7DI!!_%dj_lxU zH0%b?lcTam_sSzddX+`Y(%SHj7oyl{?<;v%cWY3OA`cO;>%Sc?ZUw`!h#28LykW_x znmu0RDrpqs0ud{H7P%pZ+VAA;h=3n)opq=wZqDz(4F=8-KoRCp&RnZ|2hco`hY8r< zWj*HhPY{j8`aD>k21x-1kQ@t8{oI`W0mvO>o(|R)DPbIMhIvSNVmU@)05NjXPuGmf z-cVW8M8OgtLS3Y;`6ZW(N+C<%5jjV{FNZz~6qf8fOOvCY2Yj9}l?M_T;6IoEQ8KKt zn=ukdXMF#clq;2OS5pi6_OBAU?VNbtZ{jx)bwaEUgV1f~>EY^PFD1pHoFU(9b~l3< z(wBF+DpNP`MI@AHj3~#%#8Aeb_0=!X{{?{+u+81SRGVIv%aaj*pOAU4*4U(@$Sx2V zuEe9Y5|);RdPrOZvA#Fq-ud_j75w-RA%Csa;Ud7k5%-;tS>Xr2)*f5(1JV?~@C;|x zY!37_q_;8?G5Qk=B<3u`{4v@7F@FRUV*Y6CxeOOme28dfcO?iMB5<4(-()@t%mV8g z3W!%1CI*JSbkqX(v++Fe-*0s4+B|bSCBr0bIcj65JPQkgm;$m_JvvWg9icx~0QZGl zatprQ^zZKjKs=y_6VajLIVhFrLxjile?B?Bi$<3Ccp-H()7oxX3DC+BppUOzOh&jJ z^U?a6mw^v3etdC=h9!QBFZ~IomsUn>AB{J+IXn~Md!(BiN|`4jvJ~?{hE28kl=l8c zi*trPH)Tpw(i|&*Z70Yirc&6o)4drw&%PY{lK$mC5@WIKSd(U4hmWcn?H7%`I*S%J08M$r^5i53(V#eF0D7rDYte$? zt8}!+MWG$ha4Ryu;RE2@*wREKfY`4F0XxT)4z3tLS5=EMS%L_WP}S=o^sbGe;1mjx z5CnGhplY@mAa338+=2Y!kYN)bs*PNM8k$lompPc8mao6Jx@O3yjwmJRhoRSKr}{r* z>mXE6*i3GiAP6o1_$sH$wnGx#$LG0)vbB3ItDq`AZbZzncDCibkD6MmRO?U)((7*=)8z5Qglhn~y)?+K`fL!-l@#_4{V`oVy@O_^|rR;ctsS z@C2l4kGNC2zXCa!SaUSZ#v-jCA^=n3 zHa%cVhkbm4aYp!G<47n2;W{`4a4$g^AkD`kUY)1-b5HFpQusu2L1M4aNk;6Iu}6|$ z<&H+69Ef@|z>DgF6%!@wRv?;}bH^MxW7>T$E_`blN+s%0Mi{;6I3?5wZbf)bdxlsFni9iOXzT^v znK3$=ei9sM2D@rOW`9sgBt-v&*c)T2vjjt4GT2+uK2DvBDd~>&i4bng;F{gDjR1rp z_&Id}TpBN+sS@OXYR0v8Zy}GFe{5-w`QqUs?fo6KYBnjK`%y|7h=f7krN}c`dz%@N z5U#tPO=5{1#M=mY2C$f?h|`y4sBlWSEGY17`K`x31L#5b+IMRz@HK9Z1H65^F<^v%2fJL6754|gOcVr>EH>pH5T;U~!l2zI#O2)Sky2LW zg*a*d^$1jooI=LDO&jenQw0t!=erYRyJ*gN%Rgo^qhJ73h|q5E-or^j&C|c~i@An% z!AV203j-b2r0ZJH1OneibIyUA4{opP*m-&Z1E^~JjxSWK2IxO<%|U&JM>=q^)n-qD z8=5>MZfTZcF@|`s1eq<3PUj-D571&di;tSne&|0&Qran5tU8BU87eAD=nT@BX+4n6 z_})ACre^zUy6C>VRwEx{Z&6h#a)=B#wU{Ab-g)r-N~xo)gbQiObp1wV21PgbdOLzu zfqy<*2|UMWPAUS(L5Y{t^-1eX0O8s&Up#M|_6LsxD%iKyxVX27Js6nC-GNawhFhX7 z4mp1NE_@mF6GjXHjrNv`#$N?#!XAi3N>5i9``|m{@W60;0LV>2aFAv=$CMJN3tqftFgoiAh+ZDgIr+_ zWNU`ih~3&5U_=JeF}t~nN^cnk4XDx9RArJyrP_R~=)QKSc@ZLnZROB*SeW2Lyxl$ z?>lJIoo&g0Ita(tpGS<&n~Lr`*!vMggA$G1#BV&nGii(gNuWyYJ%7gD4t5q?EB-MC z7z8xwgfN@xFffU%NkznS=Z!<`5J}c(-we|h31D!J6*l3PAl*Q(AyI=y`+zF>OIG?; zRV3kxcP&6WI7e%da!!0CXH7l=iVllD2mek-&QIy$IpO zAklsFRwTh;?2e$okjB{Nl^NA1mB%dZ7;pu(RI>}K0Q75#bBG|@`h9BeM=$Ku2i8E_RV0^zws>@sl5U56R z5@Hz-&pkjL`Hbv%od>n)*14A&@AxE-TeoI9V zP)#smL*Kg$!1fZ15rqhDPyZc$YwrO~H2&2^BLNIdfn-mX!+0-|DO zL^fIL*ofOjRQ9l;>61)3BNNw(OVknI1k#*1%%(aHL?&klhzzep&REloGFVyqWjsY; z`MglZqq+;LU+A`s>F+J{bx77*X*J#(P$S1S9iEm%t`MJFXf<9}0U_hK77au@fEH2!4}M}0RSAST-uSHXKVc?irHHIVjEbY*o~5^# zA&_z6U+e~?<73^3bZNB63gG@@i9VF*{u|zYt+DT$@ zZE;9&09E>oMPOGzeoFi+2K`pjSaA&DCuAE^OqECw9{^i$+|ctbvm{cGI1tK+#uE!K z(7ymPn3%W2Z+uAvG2IZGnxKLXWJcX;LQnp|#2~^!>zvV~$rjOl&9mxeUKQ&gG6hGg zFXc&<*|XJZv_MSs}wt$$Tx2mK@2F=Og+g)ngj`{802!C zH9oD5I6=_FJ%>&&1R&>N%3gju?g;Sld4%naibCI~&)2S|dhv2}IJToCqdCdB2wNKW z<7=oYKs;=lANpUt}a6 zphQPtuWrz?5n(pefa{7BErFAVpkV+$edLd8_ry={MIQPN!ozVb?-a&!2fNesE?~!x zaj;evb4xt_h4x3>TFA_u;p5Q^L?8V0TklE!MPdl1AyMHHEiZtZgEid}Z7gZb3XV+! zL?Qq{Wr(s_SpW3x`zKc@J(5GZh$MUhcc0bWxx=v;_YL#)PG~#N4HBGjZIj-yt$&ky&HTGbH zTU2j5N%|mzMYKvO9+pjzU_{grLAcTyaWjKcA~V8-k{oTl343vj0i0fv^dSZ=PD=-M zlxL4F{7GJbG|^|onZPedsgR^QbcK^~#99dk!_KIZp z7X)dOxibhK>B9(iyR(?9y`MDu#6?}Xe28hAp#!8(j9StfK-Th#R!1-}Y&L>*h!#NZ zG~cmgRP`Hbcv$Cj{C(k-#Gd5usyC41Voh|Gr+th&#zA|6WS@?HX9OkS1+$Ystj@Eu z)P&}Fd>Hr1?OL(om@Z>P9>54b@0}M-3>uQCE>*nRz#!}3aAkD;2II0g^*Kj{-@5^W zO93Q>FjU*k955TFenvD=3BfZ2GZq;)M{}H{9ae|rs~)`czUF=R&n*S_9wl$&Go5ub1V z{Ex=coKfe;O(r}(lr!1~lHx}{doj-FJ$-JbBoCX0!W{KJj@_>OOZZ`3G{D(E{=!+;R4cPG=%A6NZGtu5pT)dgD zkQrQoh|Z7n%MFQmnF|Hb4JUj2s>L3az_hwHNxjj1E4S1Far$FJUC2$1Qws=#qf_&lG*Ss#SpF{T1 zn0UE3vp@7zq&$U*u$H~odHrN!1v1V5Ai-$WLO5gN$~YQYkFl_)CP4aQR+e)x{sTsV+aus zh&Y~_-=H7J%kiNh30TLb`v4t{ZDPD}$VRT%#-cJw`R)-DW75hNib3itoU5kPt`^4! zbx_BhQKUzv+tCKWK2)faq$Q=h4fJOq!Jsc-&>X3%(M^;edZ z-AhLk4w<=KJMX9GOv)HBh`s)NqN8PJdYG*i>$~8b-I*V=3>v$~W7$;c&qN*gTG1;l zAqkYOsw?i(8%xN`K z)-^fwE`VZz)+Mf)Y>~r9==8Y9kyq~8!|$6k_7Fr4%E-mPqRujKYifW5Pk6}x!Wl@F z0s8IioB;@>Rs+s)rgbz80dXMek#;ZYvdGD-d|CH`a9`qFl4Ckjf+a>4NArjcNR!7= z3a?0qhsw$ouzLoux`dJfxe47DyE67(nw$>L4gcEl?Hb*3eSZ_#xvCeaCF&mKbi-dT z3NE_2c{*&Y5T)X``wfd;GYpP(2uBJ05^>}Dx)LWBb)*}cttdgZyJd7U<6!>>G&YH% zi}utfSq;)^N`D7q2RBLYqQchQ_(S{gc%&h#!+c?+W457Y1@6LZ$kYyes~VXdD_-EMpMO}Q64 zax3WV!e|T+e$PAg{rwh+O}vv+?Dzwelzwn63inyZCG7QL(s6#S%1~Q)Ey}HOeeBmM zU?~apYj3j_?OwdBt)A>Fp6%X^`st)r_EHvf2g$D5aSATZMxflhR@-;e)*{@&A{u*x zpg5*-X0zX~Zy(M(c6<=kZgg=-SAldC9h_Z;-qn~gX*yB;EA?gzQmO{opSUcySGRXv zz0h=9nLNKGGZ#A4WiwE6ke(zf40@sRz7L9rr_18YN<>^~6lUceW(CHSeG0@VtB)Sf{IlH?&oL(zFXc({Exp0v?C>BR&p?9 zV}X6AL!UdkiTt9};CEMRUpKkklnl~w?tCMsUHra?qFY4yS>)JfaqvG8c<#q3(CbI2 zFTVxL>NFgcu8qH(6~A5e?uGP?S*`}qw6a+EI0hFxURLhKbnEY7$?Vbn9^O+6d6GGI zH3}D3r!XrUn2Q1B%#0s{K3f7weDL$9rN_RAak_zO|$Fg_t7tbp>- z?t$C_!4qTXiw?+r(=bVlr);?l6Sw5>6*|kSm@@lI3WMk5_t&VrJ$g4>cxch}Tyflc z*wToZq7ABrLD2edLci*EA!cP+%{E&x^Ih|`x2A$_hYH6yyEit-i)+)3RlkaGzkXQ6 zubBZ?7$Us%wcr;yw?3+7m%ZWXT=d!|H!vl0slCD&wB6`QZeCAkk4d(Z^57SA7Juoc z2Szl;BqlV^$6}RExN)Vs(JQ{gDC^^Y?{zHoelTbKukp@%7!>^8uh&QDC*}Vv2w$J2 zt%a8vFT*)3LVOAhPh18&Mr{b5;P->g4^aL7?372Em!z$VDD%BPHs1e6m}!_l z=D+xLOx4kiYpkg6^b6EWbwlQfpCg~Xd;ND%ry$;DOrPflv!mS<$eTlne{TgWwkX^Y zQ(*n6+@#ja-=yg@u9+mK89tE-I)ZSA;^JfB%X#$sj}+4xl$`E6y(>wM(Bva`PJDBl z`Sy8VpB`N6w>Nv)NiQzJ=kD;QO+6(QepNpK{9YW~&Fv05lou%c&|Gp|T zjah668|**rq#EzMa0etoP-8QD(^%Sg3}iv~WU2_4@h{JePsnf~Vd8yd++saMw09q=xQvI#)a^XNBqbtb!8Ol-_bmRacO>1x3 zcs-^%b=T;~0NNDz1v&Wz|6y$NW^9(}VxcLmL&(A)CK^S4KQel!$-@;)Cv911da1@g zWz(pB8rxV?w`CnBb74mCt$rCs4S9VABT?=2XFpXAfA-^d8=eLIU+J;Y!%rz?o?d?; z;wj!=J-gQu7Afj-Qs9$9eCql>c+frc%<aFVws%eKBT0o#flotnt+K1c$=feC2u`gXjTX-+2B7_L5`ry}c&#u!=OkDtuZ(YYoCVwTmFI)z4 z0eVlqmYe6-(56HLVYw)g%9-~`f)@*!Db6FBN*VEm!b|tPjU)%M`1uz7jv^A~vit!k zx5*;P8z#GKixGWK>mt+bz(kf7lG)oiQdlEP3-Qf;(8Ar;CIV)cKJRb1HR}zuZ7v(o zwzWwM^))Re>`(3d*_|gaKFfroF~BJ(bhQuZsYXsTr&pqOeHwI*l9_9CK(En2o>jJD zQ-|JB6JRm)0^G$44lWghtC%z2a)IaB5c8FYQ4z1s3~s0g?XEbeK{?Rky$SpY*x-iJ@c7$ppB~HWCgrP+iVQf?H=#_ zf(noZ5Fe;35lUM7)EgzdJA$v*K^k3iT~fzSYu?;Zvt_BgBDsl9KN=HvsmPT+a{_!$ zdlFIncblu2$ZR)Y|9e>52pCoA{WU`;$d-PD-&SN^y1RYdYnQ9#aEK&1@+24nLLn4c zVHO+uD!wkKz3+5=pFYo}BGZ(Yj?YeB9g-r$m)`o+zhjp-vhLJ>a=dlCcK|KF+6maJ zVKQ);oSwWz&#i>x@k>{$EBzRbNC9zfK3gOeFtRj=a5*C$WDl4pK4N@wJI`Tv&Xe2J ze88eqG4UBhg@SMOc^*drJabU0?yhk&QYu6+e@@fB9MByl+c*$Nq zz1yLG)Gc;lF}XoP>9Z~?SRDWJDEckGZF^Wh#;2LJ*wkiFUs!%nE{Z!Ne) zG0>ML*MPHXFGuJPK}joa2G3HEX2nI#f}G~ zE9Md!b?NQ|&>z2oDmJ(nJQo%+feJA4(HIQanNMA7y(%C+@anhhY}an{co&NI^-lRW zU*fhrIo~Dh{Jn3UGuv63aG`e!A^~H`scV&mYsMGDz$8~-6$vH9dE1CJ{W4!TwhP;k z*t=N`TrH3=M@_vV)!o&BIlHm7eDCDY*i=f9i_`<@he!2SzQ*AFN`J}~%WXEunvad| zsrTw4hKl*;bR~6NclqCsX%^Xva`PTZi8`my!pUph+g7R@H5bT();sUqVE4&vKnbC~ z0=>KX_+PNv(@~pj3z$;9+2UdQjnI_J{&Pk6I2W&kCAMzwg2-_&GwpoJjV}5ob z>J9)g#6{@?kDGqftC9N{AX8e!?ZIF}zu85TC-_{dFG~*Iz^?Mj?o9-{ z(J%PIzyxoe^h$3hDEsBZ8u1EB99dM4AGpT|W-UMamXDDWvjU=9?%0AAp_Ork?U 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 KgEThe first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", + "\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Classical Random Walks**\n", + "\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\bigr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "\n", + "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", + "\n", + "Where we know:\n", + "\n", + "\n", + "$$\\bigr\\lvert \\text{Final}\\rangle \\ = \\ \\bigr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", + "\n", + "\n", + "So for our case, the final position vector is simply $\\bigr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "\n", + "\n", + "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", + "\n", + "\n", + "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", + "\n", + "\n", + "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", + "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", + "\n", + "\n", + "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", + "\n", + "\n", + "\n", + "**Quantum Random Walks**\n", + "\n", + "\n", + "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", + "\n", + "\n", + "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", + "$\\bigr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Going back to our original idea of some position vector $\\bigr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "$H_W$ spanned by the following set:\n", + "\n", + "\n", + "$$H_W \\ = \\ \\{\\bigr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "\n", + "\n", + "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", + "\n", + "\n", + "$$H_C \\ = \\ \\{\\bigr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "\n", + "\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\bigr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "\n", + "\n", + "$$\\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\bigr\\lvert 1\\rangle \\ = \\ \\bigr\\lvert \\downarrow\\rangle$$\n", + "\n", + "\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\bigr\\lvert i\\rangle \\ \\otimes \\ \\bigr\\lvert j\\rangle$.\n", + "\n", + "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", + "\n", + "\n", + "$$U \\ = \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert $$\n", + "\n", + "\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\bigr\\lvert 0\\rangle$ and $\\bigr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\bigr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\bigr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", + "\n", + "\n", + " $$U (\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert \\Big )(\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle)$$\n", + " \n", + " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle$$\n", + "\n", + "\n", + " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle \\ + \\ 0\\bigr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle$$\n", + "\n", + "\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\bigr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + "\n", + "\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\bigr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\bigr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ - \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", + "\n", + "\n", + " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", + "\n", + "\n", + " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Tutorial: Building a QRW With Cirq**\n", + "\n", + "\n", + "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" + ] + } + ], + "source": [ + "import cirq\n", + "import random\n", + "import numpy as np\n", + "import copy\n", + "import sympy\n", + "import itertools\n", + "from matplotlib import pyplot as plt\n", + "\n", + "number_qubits = 7\n", + "\n", + "qubits = []\n", + "for i in range(0, number_qubits):\n", + " qubits.append(cirq.GridQubit(0, i))\n", + "\n", + "print(qubits)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "\n", + "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", + "\n", + "\n", + "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", + "\n", + "\n", + "\n", + "\n", + "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", + "\n", + "\n", + "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", + "\n", + "\n", + "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", + "\n", + "\n", + "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" + ] + } + ], + "source": [ + "ancilla = []\n", + "for i in range(0, number_qubits):\n", + " ancilla.append(cirq.GridQubit(1, i))\n", + "\n", + "print(ancilla)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "\n", + "\n", + "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 0): ───@───────────────────────@───\n", + " │ │\n", + "(0, 1): ───@───────────────────────@───\n", + " │ │\n", + "(0, 2): ───┼───@───────────────@───┼───\n", + " │ │ │ │\n", + "(0, 3): ───┼───┼───@───────@───┼───┼───\n", + " │ │ │ │ │ │\n", + "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", + " │ │ │ │ │ │ │\n", + "(1, 0): ───X───@───┼───┼───┼───@───X───\n", + " │ │ │ │ │\n", + "(1, 1): ───────X───@───┼───@───X───────\n", + " │ │ │\n", + "(1, 2): ───────────X───@───X───────────\n" + ] + } + ], + "source": [ + "number_qubits = 4\n", + "\n", + "def apply_n_qubit_tof(ancilla, args):\n", + "\n", + " if (len(args) == 2):\n", + " yield cirq.CNOT.on(args[0], args[1])\n", + "\n", + " elif (len(args) == 3):\n", + " yield cirq.CCX.on(args[0], args[1], args[2])\n", + "\n", + " else:\n", + "\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + " for k in range(2, len(args)-1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + "\n", + " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", + "\n", + " for k in range(len(args)-2, 1, -1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + "\n", + "\n", + "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", + "circuit = cirq.Circuit()\n", + "circuit.append(apply_n_qubit_tof(ancilla, control))\n", + "print(circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", + "\n", + "\n", + "\n", + "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", + "\n", + "\n", + "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", + "\n", + "\n", + "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", + "\n", + "\n", + "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", + "\n", + "\n", + "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", + "\n", + "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", + "\n", + "\n", + "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", + "\n", + "\n", + "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", + "\n", + "\n", + " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", + "\n", + "\n", + "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", + "\n", + "\n", + "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", + "\n", + "\n", + "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def walk_step():\n", + " \n", + " #\"Flip\" the coin qubit\n", + "\n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " \n", + " #Implement the Addition Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits, 0, -1):\n", + "\n", + " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " for i in range(number_qubits+1, 1, -1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " #Implement the Subtraction Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits+1, 1, -1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " for i in range(1, number_qubits+1):\n", + "\n", + " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the ``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector qubits, we have:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({12: 52, 14: 20, 20: 20, 16: 13, 10: 9, 54: 9, 30: 8, 52: 8, 18: 7, 38: 7, 26: 7, 22: 6, 42: 6, 28: 4, 36: 4, 32: 3, 24: 3, 34: 3, 48: 3, 44: 2, 40: 2, 50: 2, 8: 1, 46: 1})\n" + ] + } + ], + "source": [ + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the number of occurences of that position vector value on the y-axis. This gives us a probability distribution for the position of the random walker. It is important to note that the graphs will only have either even or odd numbered data point, depending on the initial position of the walker and the number of steps taken:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xt81NWd//HXZy7JJOQecuOaBBDFG1QQBOt6R1er6K917aql6i5d6+62tqVqL3bdrlVLW7etdl3XC7i19VIVr5W6gFqiIMGogICEO+GSO0kml8nMnN8fMxNCSMgkmft8no8HD2YmM/M9+ZJ55/D5nosYY1BKKRX/LNFugFJKqdDQQFdKqQShga6UUglCA10ppRKEBrpSSiUIDXSllEoQGuhKKZUgNNCVUipBaKArpVSCsEXyYKNHjzalpaWRPKRSSsW9DRs21BtjCgZ7XkQDvbS0lMrKykgeUiml4p6I7AnmeVpyUUqpBKGBrpRSCUIDXSmlEoQGulJKJQgNdKWUShAa6EoplSA00JVSKkFooCulVIKI6MSieLG8qoYlK7ZxoLmDMTlpLJ4/lQUzxka7WUopdUIa6H0sr6rh7pc20tHtAaCmuYO7X9oIoKGulIppWnLpY8mKbT1hHtDR7WHJim1RapFSSgVHA72PA80dQ3pcKaVihQZ6H2Ny0ob0uFJKxQoN9D4Wz5+Kw3bsaUmzW1k8f2qUWqSUUsHRQO9jwYyx/PCKU3rul2Q7uP/a0/WCqFIq5gU1ykVEdgOtgAdwG2Nmikge8BxQCuwGrjPGNIWnmZE1pzy/5/bTt5zNlKLMKLZGKaWCM5Qe+gXGmOnGmJn++3cBK40xU4CV/vsJocHp6rl9qKUzii1RSqngjaTkcjWwzH97GbBg5M2JDU29Av3gEQ10pVR8CDbQDfAXEdkgIov8jxUZYw76bx8CikLeuig5poeuga6UihPBzhQ91xhTIyKFwNsisrX3F40xRkRMfy/0/wJYBDBhwoQRNTZSAj30TIdNSy5KqbgRVA/dGFPj/7sWeBk4GzgsIiUA/r9rB3jtY8aYmcaYmQUFg25aHRManC4yU22Mz03XHrpSKm4MGugiMkpEMgO3gUuBTcCrwEL/0xYCr4SrkZHW1O4id1QKJdkODXSlVNwIpuRSBLwsIoHn/8EY85aIrAeeF5FbgT3AdeFrZmQ1Ol3kjUqhKNtB1b7maDdHKaWCMmigG2N2Amf283gDcFE4GhVtDW0uirMdlGQ5aHS66Oz24LBbo90spZQ6IZ0p2o+m9qM9dIDalq4ot0gppQangd6HMYYGf8mlxB/oB4/oSotKqdingd5Hu8uDy+09JtB16KJSKh5ooPfR6B+DnpeeQlGWP9B1pItSKg5ooPfRE+ijUsh02MlIten0f6VUXNBA7yMQ6LmjUgAoykrlsJZclFJxQAO9j0Cg5/sDvSQ7TXvoSqm4oIHeR0/JJcMX6MXZDu2hK6XiggZ6H43tLuxWITPVN+eqOMtBbWsXbo83yi1TSqkT00Dvo7HNRW56Cv6lDijOduDxGurbXIO8UimloksDvY9G/yzRgOIsHYuulIoPGuh9BBbmCigOTC7S2aJKqRingd5Hk9PVM2QRODpbVEe6KKVinAZ6Hw1OV8+QRfBNMEqxWjioJRelVIzTQO+l2+PlSEc3uelHA11EKMpO5bD20JVSMU4DvZfm9m4A8jNSjnm8OMuhk4uUUjFPA72Xnmn/6X0CPTtNR7kopWKeBnovfaf9BwT2FjXGRKNZSikVFA30XvouzBVQlOWgy+3tKckopVQs0kDvpbF94B466OQipVRs00DvpbFt4B466Fh0pVRs00DvpandRabDht167Gk5ureoBrpSKnZpoPfSd1JRQEFmKhbRkotSKrZpoPfSd9p/gN1qYXRGqq7nopSKaRrovQzUQwf/0MWWrgi3SCmlgqeB3kuT03XcpKKAoiyH9tCVUjFNA93PGONbOjdj4B66XhRVSsUyDXQ/p8uDy+Mlb4AeenF2Gq2dbpxd7gi3TCmlgqOB7hcYg543QA29ODsV0JEuSqnYFXSgi4hVRKpE5HX//TIRWSci1SLynIj0n4RxosHpu+A5YKBnpQHoMrpKqZg1lB76t4Atve4/CDxkjJkMNAG3hrJhkdbUPlgPXScXKaViW1CBLiLjgCuAx/33BbgQ+JP/KcuABeFoYKQ0DFZy0c2ilVIxLtge+n8C3we8/vv5QLMxJnCFcD8wtr8XisgiEakUkcq6uroRNTacBuuhp6VYyU6z63ouSqmYNWigi8iVQK0xZsNwDmCMecwYM9MYM7OgoGA4bxERDU4XKVYLGam2AZ+jQxeVUrFs4PQ6ah5wlYj8LeAAsoBfAzkiYvP30scBNeFrZvj5pv3b8VWT+lec7eCwllyUUjFq0B66MeZuY8w4Y0wpcD2wyhhzA7Aa+LL/aQuBV8LWyghodLrIG5V6wufo3qJKqVg2knHodwLfEZFqfDX1J0LTpOjwBbr9hM8pznZQ39aFy+094fOUUioagim59DDGvAO847+9Ezg79E2Kjkani9Nzc074nMBIl9rWTsblpkeiWUopFTSdKerX6HSRlz54Dx105yKlVGzSQAe6PV5aOt2D1tBLsn2zRXUsulIqFmmg03sM+iA9dN1bVCkVwzTQ8ZVbgEF76FlpNtLsVg10pVRM0kDnaKDnDtJDFxGKsx0c1JKLUioGaaBzNNDzB+mhg6/soj10pVQs0kAn+B46+PcW1UBXSsUgDXR6BfoAuxX1VuSf/u/1mnA3SymlhkQDHV+gZ6fZsVsHPx0l2Q7cXkOD/5eAUkrFCg10AtP+g9twqUiHLiqlYpQGOkML9JKenYs6wtkkpZQaMg10fIEeTP0cjk7/12V0lVKxRgMdX6DnB9lDHz0qFZtFdBldpVTMSfpAN8bQ1O4iN8hAt1iEoiyHrueilIo5SR/orV1uuj0m6B46QFFWql4UVUrFnKQP9KaeSUXBB3pJdpoGulIq5iR9oDf0TPsPPtCLs30lF2N0cpFSKnYkfaAPp4denOWg3eWhpdMdrmYppdSQJX2gD7eHDjp0USkVW5I+0I+uhT70QNehi0qpWJL0gd7kdJFis5CeYg36NUd3LtLZokqp2JH0gd7gn1QkIkG/5uh6Ll3hapZSSg1Z0gd60xCm/Qek2CyMzkjhUIv20JVSsSPpA73B6SI/Y2iBDv6hi1pDV0rFkKQP9Kb2offQwVdH14uiSqlYkvSB3tgW/NK5vQUmFymlVKxI6kB3ub20drmHFegl2Wk0t3fT2e0JQ8uUUmrokjrQm9qHPgY9QHcuUkrFmkEDXUQcIvKhiHwiIptF5F7/42Uisk5EqkXkOREZeipG2XAmFQUEdi7SsotSKlYE00PvAi40xpwJTAcuE5E5wIPAQ8aYyUATcGv4mhkeIwl07aErpWLNoIFufNr8d+3+Pwa4EPiT//FlwIKwtDCMRhLoOv1fKRVrgqqhi4hVRD4GaoG3gR1AszEmsNzgfmBseJoYPiMJ9IxUG5kOmy7QpZSKGUEFujHGY4yZDowDzgZODvYAIrJIRCpFpLKurm6YzQyPRqcLEchJsw/r9b6x6DpbVCkVG4Y0ysUY0wysBs4BckTE5v/SOKBmgNc8ZoyZaYyZWVBQMKLGhlqj00V2mh2bdXiDfXxj0XU9F6VUbAhmlEuBiOT4b6cBlwBb8AX7l/1PWwi8Eq5Ghkujc3iTigKKsxy64qJSKmbYBn8KJcAyEbHi+wXwvDHmdRH5DHhWRP4DqAKeCGM7w6LR6SJvGNP+A0qyHdS1duH2eIfdy1dKqVAZNNCNMZ8CM/p5fCe+enrcanS6mJifPuzXF2en4TVQ19ZFSXZaCFumlFJDl9Tdysb2EZZcslMBHbqolIoNSRvoxhiaRlxD9/XKD2ugK6ViQNIGekunG7fXjLCHrpOLlFKxI2kDfSSTigJy0+2k2Cw6uUgpFROSPtBzRxDoIqIbXSilYkbSB3r+CAIddCs6pVTsSNpAbwr00EcwDh18Y9F1CV2lVCxI2kBvCPTQh7FBdG/FWb5AN8aEollKKTVsSRvoTe0uHHYL6SnBTJYdWHG2A5fbS1N7d4happRSw5O0gd7QNrJp/wHFWYGhi7qmi1IqupI20JvaXeSNsNwCR8ei64VRpVS0JW2gNzhdI74gCvSs4aIXRpVS0Za0gd7o7BrxkEWA0RkpWER76Eqp6EvaQG9ydo9oUlGAzWqhMFPHoiuloi8pA73L7aGtyx2SHjpAkY5FV0rFgKQM9Canb4hhKHroACU6/V8pFQOSMtAbnL59QEPVQy/OdugSukqpqEvKQO/poYdglAv4Ar21y01blzsk76eUUsORlIHe00MPwTh08K3nAjrSRSkVXUkZ6KFamCugKEsDXSkVfUkZ6I1OFyKQE6JAL8nW6f9KqehLzkBv980StVokJO8X6KHrzkVKqWhKzkB3ushNt4fs/Rx2K7npdh26qJSKqqQN9PxRqSF9z+LsNO2hK6WiKmkDPXdU6HroAMVZqdpDV0pFVZIGejd5Yeih6ygXpVQ0JV2ge73GtxZ6iHvoJdkOGpwuutyekL6vUkoFK+kCvaWzG4/XhL6H7h/pUtvSFdL3VUqpYCVdoDf6JxWFuofes3ORXhhVSkXJoIEuIuNFZLWIfCYim0XkW/7H80TkbRHZ7v87N/zNHbmjgR7qGnpgcpEGulIqOoLpobuB7xpjpgFzgNtFZBpwF7DSGDMFWOm/H/N6Aj1Es0QDNuxuAuBf/1jFvAdWsbyqJqTvPxLLq2qY98Aqyu56I+bappQKnUED3Rhz0Bjzkf92K7AFGAtcDSzzP20ZsCBcjQylnkAP0cJc4AvMe1/b3HO/prmDu1/aGBPBubyqhrtf2khNcwcmxtqmlAqtIdXQRaQUmAGsA4qMMQf9XzoEFIW0ZWHS2B76HvqSFdvodHuPeayj28OSFdtCdozhWrJiGx3dx468iZW2KaVCK+hAF5EM4EXg28aYlt5fM8YYwAzwukUiUikilXV1dSNqbCg0trlIs1tJS7GG7D0PNPe/KNdAj0dSLLdNKRVaQQW6iNjxhfkzxpiX/A8fFpES/9dLgNr+XmuMecwYM9MYM7OgoCAUbR6RxnYXeSHaqShgTE7akB6PpFhum1IqtIIZ5SLAE8AWY8yven3pVWCh//ZC4JXQNy/0Gp2hD/TF86eSZj+2x59qtbB4/tSQHmc4Fs+fSt9FJdPs1phom1IqtILpoc8DbgIuFJGP/X/+FngAuEREtgMX++/HvKYwBPqCGWO5/9rTGevv9VoEJhVmsGDG2JAeZzguP70Ym8XCKH+JKT3Fyv3Xnh4TbVNKhZZtsCcYY9YAAy0cflFomxN+DU4X5QUZIX/fBTPG9oTkI6urWbJiG5/ub+aMcTkhP9ZQVO1txuXx8vDfn8Wz6/exu96pYa5Ugkq6maLh6KH3tXBuKTnpdn6zsjqsxwlGRXU9FoE5k/KZU57HznontTqbVamElFSB3tntwenyhD3QM1Jt3DqvjP/bcphNNUfCeqzBrKmu58zxOWQ57Mwuywdg3a7GqLZJKRUeSRXoTYEx6GEOdICF80rJdNj47artYT/WQFo6u/lkXzPnTh4NwKljsshItbFuV0PU2qSUCp+kCvSGNl+g54Z42n9/shx2bplXxorNh9lysGXwF4TB2h0NeA3M8we6zWrhrIm5rNupPXSlElFSBXpg2n9+CKf9n8gt88rITLXx8Kro1NIrqutJs1uZMeHohdnZ5Xlsr22joU2X+VUq0SRVoAdKLpHooQNkp9v5+rxS3tx0kM8Pt0bkmL2tqa7n7LI8Um1Hx8gH6ugfah1dqYSTVIEeKLnkR6CGHnDLvDLS7VZ+G+Fe+sEjHeyoc/bUzwPOGJdNmt2qF0aVSkBJFehN7S4sAtlpod3c4kRyR6XwtbmlvP7pAapr2yJ23Ipq34XPeX0C3e6vo6/dqRdGlUo0SRXoDU4XuekpWPrOhQ+zfzi3DIfNyiOrI9dLr6iuJ39UCicXZx73tdlleWw91EqT/5qCUioxJFWgR2JSUX/yM1K56ZyJvPJxDbvqnWE/njGGNdX1zJ08ut9fXrPL/XX03Vp2USqRJFWgNzhd5EYh0AH+8YvlpNgsEemlb69to661i3Mn5/f79TPHZ5Nqs+jwRaUSTFIFepPTFdELor0VZKZyw+yJvFxVw96G9rAeq6K6Hji+fh6QavMNZdQJRkollqQK9MYo9tABvnFeOVaLhL2XXlFdT2l+OuNy0wd8zuyyfD472MKRju6wtkUpFTlJE+her6GpPXo9dIDCLAd/f/YEXvxoP/saw9NL7/Z4WbuzccDeecDs8jyMgUqtoyuVMJIm0I90dOM1kZtUNJBv/E05FhH+690dYXn/T/c309blPm78eV9fmJBLitWi49GVSiBJE+iBzaEjNe1/ICXZaVw3axwvVO4Ly76ea7Y3IALnTOr/gmiAw25l+vgc1ul4dKUSRvIEujOy0/5P5LbzJwPwaBh66RXV9Zw2JpucIL7P2eV5bDrQQluXO+TtUEpFXtIFejTGofc1NieNL581nmc/3MehI6HbbMLZ5eajvU2D1s8DZpfl4/EaraMrlSA00KPkm+dPwu31ctEv36HsrjeY98AqllfVjOg9P9zViNtrBq2fB3xhYg42i2gdXakEMeieooki1gJ9w54mBMHp8gBQ09zB3S9tBBj2np9rqutJsVmYWZob1PPTU2ycMS5b13VRKkEkVQ99VIoVh906+JMjYMmKbXiMOeaxjm4PS1ZsG/Z7VlTXM6s0d0jf4+zyfDbuP0K7S+voSsW7pAr0aE4q6mugES7DHflS29rJ1kOtQdfPA2aX5eH2GjbsaRrWcZVSsSOpAj2ak4r6GpOTNqTHB/PBDl/ZJNj6ecDM0jysFtF1XZRKAEkV6LHUQ188fyppfUojKVYLi+dPHdb7rdleT3aanVPHZA/pdRmpNk4bk6XruiiVAJIq0GPlgij4Lnzef+3pjPX3yK0WIXeUnSvOKBnyexljqKiuZ+6kfKzDWOt9dnk+n+w7Qme3Z8ivVUrFjuQK9BiYVNTbghljqbjrQnY/cAWP3ngWh1u6eGbtniG/z656JweOdA65fh4wuywPl8fLR3u1jq5UPEuKQO9weejo9pAX5Wn/J3LxKYWcO3k0D/3f9iHvJBRYLneo9fOAmaV5iKB1dKXiXFIEemAdl1jrofcmIvz4ymm0dnbzn//3+ZBeu6a6nrE5aUzMH3i53BPJTrMzrUTr6ErFu0EDXUSeFJFaEdnU67E8EXlbRLb7/w5uJkuUNMXYpKKBTC3O5IbZE/n9ur18frg1qNd4vIb3dzRw7uTRiAx/r9Q55flU7W2my611dKXiVTA99KXAZX0euwtYaYyZAqz0349ZDXES6AB3XHISo1Ks/PT1zzB9Jh71Z2PNEVo73cybMrxyS8Dssjy63F4+2XdkRO+jlIqeQQPdGPMe0Le4ejWwzH97GbAgxO0KqXjpoYOvjXdcchJ/3V7Pyi21gz4/UD+fO8hyuYM5u8xXR9dlAJSKX8OtoRcZYw76bx8CikLUnrCIpx46wI1zJjK5MIP73tyCy+094XMrqus5pSSL0RmpIzpmTnoKU4sytY6uVBwb8UVR46sLDFgbEJFFIlIpIpV1dXUjPdywNDq7sFqELIc9KscfKrvVwo+uOIVd9U6Wvb97wOd1uDxU7m7i3Mkj650HzCnPZ8OepkF/iSilYtNwA/2wiJQA+P8esDZgjHnMGDPTGDOzoKBgmIcbvuVVNTxVsRuP1/DFn68e8RK1kXL+1EIumFrAb1Zup76tq9/nVO5pxOXxDnv8eV+zy/Lo7PaysaY5JO+nVDJaXlXDvAdWhWxZ7KEYbqC/Ciz0314IvBKa5oTW8qoa7n5pI+19lqiNl1D/0ZXT6Oj28Mu/9L8C45rqeuxW4eyyvJAcL/A+a3U8ulLDEsicmuYODJHPnGCGLf4R+ACYKiL7ReRW4AHgEhHZDlzsvx9zlqzYRkef6ewjXaI2kiYVZPC1c0p5dv0+Nh84fvRJRXU9Mybkkp4SmmXt8zNSmVKYoRteKDVMD761NaqZE8wol68aY0qMMXZjzDhjzBPGmAZjzEXGmCnGmIuNMTGZAKFeojYavnXRFHLTU/j3144dxtjodLH5QMuwZ4cOZHZ5Hht2N+L2aB1dqWDsqnfy5Jpd3PTEOg4OsKVkpDInoXcsGpOTRk0/J3K4S9RGQ3a6ne9cchI/Wr6JtzYd4vLTfYt3fbCjAWMIWf08YHZZPr9fu5dNB1qYPj4npO8dTcuraliyYhsHmjsYk5PG4vlTh70zlEoe/f3cXHZaMR/uamT1tlpWb61ld0M7AJMKRpGRaut30/VIZU5CB/q/XjSZO1/ceMxjaXbrsJeojZbrZ43n92v3cN+bW7jg5EIcditrquvJSLVx5rihLZc7mNnlvjr6up0NCRPogbpm4L/CodjuTyW+/n5uvvP8x3z/TxZcHi+pNgtzJ+Vzy7llnH9SIRPy0497DUQ2cxJ6LRe311eiGJ2RggBjc9K4/9rT4+5DbLNauOfKaexv6uCJNbsAX/18Tnk+Nmto/wkLMx2Ujx6VUHX0eL+WoqKjv58brwG7VXjq67P4+J5Leerms/naOaVM8K+j1HtZ7GhkTsL20I0xLK3YzWljs3jtn88d0TonsWDu5NFcOq2IX6/czlMVu6hvc3Gko5vlVTUh/2GZXZ7H658cxOM1w1pffSgiUQrpr+wG8XUtpS8tIYXfQD8f7S4PF5xcOODrFswYG7V/i4TtoVdUN7C9to2b55bFfZgHnF2Wh8vtpb7NN/P1SEd3WIZEzS7Lp7XLzWcHWkL6vn1FYohXu8uN3dr/v388XUvpLdpD45JFqLeJjISEDfSnKnYxOiOFK88c+g5Aseqpit3HPRaO0kFPHT3MywCEuxTi8Rq+9ezHuD2GlD6lKatF4u5aSoCWkCLjtvMnHfdYrF+DS8hA313vZNW2Wv5+9kRSbdbBXxAnIjUMsyTbt7Z6uCcYhfv7ue+NLbz92WHu+dI0fv7lM3rqmhmpNjxeQ1ZafFYcE7GEFIu2HWrFIlCYmRo31+Di8yd6EE9/sAerCDfOnhDtpoRUJIdhFmc5WLn1MKV3vcHYMNVoCzJTqW09flmDUHw/y97fzZMVu/j63FJunlcGHB3R0uX2cPXDFXz/Txv5yx25cbNoG/hKSA6bhc5+1tsJx89Bstbqtx5q4Zl1e7hxzkT+/erTot2coCVcD72ty80Llfu44owSCrMc0W5OSC2eP5U0+7H/4wjHfwGXV9Xw0d4mAvOYwlGjPXSkk64BFgG7+JSBLzgFY+WWw9z72mYuPqWIH1857bivp9qs/Oq66RzpcPHDlzcGte58LKhr7eKrj62ly+PF3uditcNmCcvPQTLW6o0x/PT1z8h02Lnj4pOi3ZwhSbhAf3HDflq73D29skQSqSFRS1Zso9tzbMiFskbb1uXmlqXrcXu8LL50as/3U5zloGz0KJZ9sIdH390xrKDdVHOEf/ljFaeOyeY3X50+4CidaWOy+M4lU/nzpkMs/zj2A6q6tpVrflfB54fbeOymmSz5ypmM7dUjn1qcydXTx4T0mMlaq3/7s8NUVDdwx8VTyI2j/71BgpVcvF7D0vd3M318TsJMiukrEkOiwlnbdnu8/MsfPmLb4VYeXziTC6YWcvuFk3u+3tnt4bsvfMIDf97KvsZ27r3q1KDH2h9o7uCWpevJSbPzxMKZg65xs+i8clZuOcw9r2xmdll+zI5eWLuzgUVPV5Jis/LcN+Zwxjjfz3bg5+C/3tnBg29tZfnHNVwzY1zIjpuMtfout4f73tzC5MIMbpgzMdrNGbKE6qG/u72OXfVObp5XGu2mxLWBgq0ke2QlLGMM9772Gau31XHvVadywdTjSysOu5XfXj+Db/xNOc+s28s/Pl2Js5+p1H21dnZzy9L1tLs8PHnzrKDKbVaL8MvrzsTjNSz+0yd4vbFXelleVcNNT6yjMMvBy9+c2xPmvS06r5xZpbnc88rmkIZtRmr/vxBj9RdfKCyt2M2ehnZ+fOU07CGetBcJ8dfiE1hasZvCzFQuPy1xhipGQ3+1eoAJ+el0j2DRrifW7OJ/1+5h0Xnl3HiC3o/FItx9+Sn8x4LTePfzOq777w843NL/okfg6/Xf/ocqtte28bsbvsDJxVlBt2li/ih+fOU0KqobePqD3UP4bsLLGMPDq7bz7ec+5qyJubz4T3MZn5fe73OtFuGXX5ke0l9Mz6/fR1uXG2ufORxWi/C9S+OrrhysutYufruqmgtPLuRvTor83g2hkDCBXl3bxruf13HjnImk2BLm24qKvrX6MdkOLp1WxNqdjdy6rJLWzu4hv+dbmw5x35tbuPy0Yu667OSgXnPjnIk8sXAWu+qdXPNIBdsOtR73HGMM97y6mfc+r+O+Badx3jA+iNfPGs+FJxdy/5+3Ul3bNuTXh1q3x8tdL27kF3/5nGtmjGXZLWeTnX7i3bYm5Kf3/GJa9sHuER1/zfZ6fvDyRr44ZXS/wz0b24f+7x8PfrFiG53dHn54xSnRbsrwGWMi9uess84y4fLj5RvNlB+8aepaO8N2jGT37Id7TPndb5j5D71rDjS3B/26qr1NZuqP3jRXP7zGdLjcQz7uxv3NZtZ/vG1Ou+cts2Z73TFfe/SdajPxztfNA3/eMuT37e1wS4eZfu8K86Xf/tW43J4RvddItHS4zI2PrzUT73zd/GLFVuP1eoN+rdfrNbc89aE56Ydvmu2HW4Z1/G2HWsxp97xlLv3Vu+ZIh+uYr3k8XvNP/1tpSu963by16eCw3j9WbdzfbErvet389LXN0W5Kv4BKE0TGiongkK2ZM2eaysrKkL/vkY5uzrl/JZefVsIvrzsz5O+vjnrv8zq++cxHZKTaeOrmWZxScuLyxr7Gdq75XQVpKVZe/ua8YW9mXdPcwS1PrWdHXRvXzRzPu5/X9Vy0mz4+h5dum4tlhOvO/HnjQW575iO+ffEUvh3B4WqBsd41zR3YLILXGB649gyumzV+yO9V29rJ/IfeY3yzp/sBAAALlElEQVReOi/eNndIdeDa1k6ueeR9XB4vy2+fd8womoDObg/XP7aWrYdaeG7ROZyZAIMPjDH83X+vpbqujdXfO5/stNjbe1hENhhjZg72vISoTbxQuY92l0cvhkbAeScV8Pw3zgHgK49+wLufD7zx95GObm5euh6X28tTX5817DAH3xDNF247h/KCUfzhw73HjMDYerCFVz85MOz3Drj89BKumTGW366q5pN9kdlXtfdYb/CtEGqzWIZdNizMdPCza07n0/1HeHhVddCva3e5+YdllTQ6XTy5cFa/YQ6+i9b/87WZjM5I5dZllexrbB9WO2PJmxsP8eHuRr576UkxGeZDEfeB7vEanv5gD7NKczltbGjXBlf9mzYmi+W3z2N8Xjq3LF3Pc+v3Hvccl9vLbb/fwJ4GJ4/edBaTCzNHfNwsh522zuNHvHS6vSEbG/1vV51KYWYqdzz/MZ19xmCH2q56Jz95dfNxY71dnpF9P5efXsK1M8by8OrgfjEF1rzZWHOE33x1BqcPssZ+QWYqS2+ehcvt4Zal6znSEb819c5uDz97cwsnF2dy/az4n1ke9+PQV22tZW9jO3cGeaFNhUZxtoPnvzGH2/9QxZ0vbmRfYweTCkbxi798Tk1zB+kpVtpdHn7xlTOZOyl0uyqFe4uv7DQ7v/jKmdzw+DoWPV3JjjrnkKa9n2iqfGe3hw93NbJqay3vbDu60004vp+fXHUqa3c2cMfzH/PGv3yRtJSB1zT62Zu+NW9+8qVpXDKtKKj3n1yYyaM3ncXCJz/k9mc+4qmbZ0V8mF8oliX4n/d2UtPcwR/+cXbYl4qOhLgP9KXv76Ik28H8U4P7QVShk+nwTeC555VNPLy6GqsIHv81mXaXB5tFsIX4QxKJ9WzmTR7NeVNG8972+p7HgtnlqL8dbu588VMqqutpandRUd1AR7fnmJ1uHllVzeEwrGeTnWZnif8X04NvbeXfrjq13+c9/cFunlhz7Jo3wZo7aTT3X3sG33vhE3748kYe/H9nRGyp6lDsQnXoSCe/e2cHl51aHNJORzTFdaBvO9RKRXUD379sash37lHBsVst/Oya03nj04O09CmHuL2GJSu2hXRm6+L5UyOyxVd/wxc7uj389PXPyM/ofzr4T1//7LjySZfbywsb9jMuN42vzBzHBVMLmVOe39NjznLYw/b9zJs8mpvnlfJUxW4uPqWIc6ccG1ortxzm317dzMWnFPa75k0wvnzWOPY2tvOblduZmD+K2y+YPPiLQuBEyxIE+/P287e24vEafvC3cTxMsY+4DvSl7+8m1WbhqwlQ+4pnIkJrP7VtCP008cCHNdwrAA5U2mlwurjpiQ+H/H5//f4F/fZew/393HnZybz3eR2L//QJb337vJ6LfoE1b6aNyeLX188YUbnhjounsLfByZIV2xiXm8bV08O/GuNAyxLUNHf4hu8N8j+Fqr1NvFRVw23nT+rZPi4RxG2gN7e7eLlqP9fMGBt3C+gkokgu7RuJ9WwG+n5GZ6Tw6I1n9fuaf/r9hp7dpHobm5N2woAJ5/fjsFt56O+mc+3v3ufWpes5eKSTmuYOLAJZaXaeXDiLUQNM8Q+WiPDgl8/gwJFOFr/wKTtq23jxo5qw/II63NLJg3/eesLnnP+Ld7hgaiHnTy1gTnk+jl6znpdX1fDzt7Zy4EgnFoGJA8y+jVdxG+jPrt9HZ7eXr+tQxZgQqVJIpAz0/fzoimnMLM3r9zU/umJaTJ6DM8blcPG0It7adKjnMa+BDpeH93c0hCRsU21WHrvpLC556D1+02u45HBq2/3p7PbwxJpdPLK6GrfHcPEphazZXn/MuvCpNgtfOnMMTU4Xz67fy9L3d+OwW5g3aTTnn1xIt380VODfx2vg3tc+w2G3Jswa73EZ6G6Pl//9YA/nlOcPad0OFT6RKoVEynC+n1g+B5/2M3yxyx9woWpfTnpKv+Ogh1rb7s0Yw18+O8x9b2xhb2M7l04r4kdXTGNCfvqgI4rW7mzgnW11rNpay8qttf2+/0jaFovicqZoYEbff990FvNPLQ5By5RKbGV3vUF/n3QBdj1wRdiPA1Bx14UDTljqz+eHW7n3tc1UVDdwUlEG91x56nEXdoNhjGFnvZOLfvluv18P9TkIh2BnisZVD733FGmrRXAOcCFOKXWsSF3jGOg4APMeWMXUokwuOLmQC6YW8IWJuT1j13v3touzHEwuzOD9nQ1kpNq496pTuWH2hGGPZBMRJhVkMDaC13miJW4Cve+4U4/X8MPlm7BYJGH+u6RUuETqGkd/x3HYLHz7kpOwCKzeWsfjf93Jo+/uINNh47wpBWSl2Xj5o5qeevjBlk4OtnRy7uTR/ParM0I26CHRrvP0J24CPRTjTpVKVpGq7w92nEXnTaK1s5uK6npWb61j9bbafjcKB9/SCKEcwRbL1zhCZUQ1dBG5DPg1YAUeN8Y8cKLnj6SGHqkaoFIqcowxlN39Zr9f08/2UWFfbVFErMAjwOXANOCrIjK86WZBGKjOlUj1L6WSjYgMeKFUP9tDN5L58mcD1caYncYYF/AscHVomnW8/rZFS7T6l1LJSD/boTOSGvpYYF+v+/uB2SNrzsCSof6lVDLSz3bohP2iqIgsAhYBTJgwsjVXIjHlWykVefrZDo2RlFxqgN57ZI3zP3YMY8xjxpiZxpiZBQXxuZO2UkrFg5EE+npgioiUiUgKcD3wamiapZRSaqiGXXIxxrhF5J+BFfiGLT5pjNkcspYppZQakhHV0I0xbwL9DyJVSikVUbrNj1JKJQgNdKWUShAa6EoplSA00JVSKkFEdIMLEakD9kTsgMcaDdRH6dixQs+BngPQcwDxdw4mGmMGncgT0UCPJhGpDGa1skSm50DPAeg5gMQ9B1pyUUqpBKGBrpRSCSKZAv2xaDcgBug50HMAeg4gQc9B0tTQlVIq0SVTD10ppRJaQga6iDwpIrUisqnXY3ki8raIbPf/nRvNNoaTiIwXkdUi8pmIbBaRb/kfT6Zz4BCRD0XkE/85uNf/eJmIrBORahF5zr9SaEITEauIVInI6/77SXUORGS3iGwUkY9FpNL/WEJ+FhIy0IGlwGV9HrsLWGmMmQKs9N9PVG7gu8aYacAc4Hb/fq/JdA66gAuNMWcC04HLRGQO8CDwkDFmMtAE3BrFNkbKt4Atve4n4zm4wBgzvddQxYT8LCRkoBtj3gMa+zx8NbDMf3sZsCCijYogY8xBY8xH/tut+D7MY0muc2CMMW3+u3b/HwNcCPzJ/3hCnwMAERkHXAE87r8vJNk5GEBCfhYSMtAHUGSMOei/fQgoimZjIkVESoEZwDqS7Bz4Sw0fA7XA28AOoNkY4/Y/ZT++X3SJ7D+B7wNe//18ku8cGOAvIrLBvyUmJOhnIex7isYiY4wRkYQf3iMiGcCLwLeNMS2+zplPMpwDY4wHmC4iOcDLwMlRblJEiciVQK0xZoOInB/t9kTRucaYGhEpBN4Wka29v5hIn4Vk6qEfFpESAP/ftVFuT1iJiB1fmD9jjHnJ/3BSnYMAY0wzsBo4B8gRkUBHpt99cBPIPOAqEdkNPIuv1PJrkuscYIyp8f9di+8X+9kk6GchmQL9VWCh//ZC4JUotiWs/HXSJ4Atxphf9fpSMp2DAn/PHBFJAy7Bdy1hNfBl/9MS+hwYY+42xowzxpTi2/N3lTHmBpLoHIjIKBHJDNwGLgU2kaCfhYScWCQifwTOx7ei2mHgJ8By4HlgAr4VH68zxvS9cJoQRORc4K/ARo7WTn+Ar46eLOfgDHwXu6z4Oi7PG2P+XUTK8fVW84Aq4EZjTFf0WhoZ/pLL94wxVybTOfB/ry/779qAPxhj7hORfBLws5CQga6UUskomUouSimV0DTQlVIqQWigK6VUgtBAV0qpBKGBrpRSCUIDXSmlEoQGulJKJQgNdKWUShD/H5oMj1sAcSi9AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 58, 50: 22, 54: 14, 46: 14, 48: 14, 44: 11, 12: 8, 24: 6, 16: 6, 42: 6, 10: 6, 34: 5, 40: 4, 36: 4, 32: 4, 28: 3, 22: 3, 38: 3, 8: 2, 14: 2, 26: 2, 18: 1, 30: 1, 20: 1})\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl8nNV97/HPT6PVWixrsbwv2GCHBIxBgG0IawE30OBsJClwHQo1EAKkpIBpb169zW0uULInJA0JJG7YG4OhJgF8jUkAA8YbNmAcyxtYlqwNLZY1kiWd/jHPCFmesbbZNPN9v15+aeaZZ+b5zSPPT2fOc87vmHMOEREZ+dLiHYCIiESGErqISJJQQhcRSRJK6CIiSUIJXUQkSSihi4gkCSV0EZEkoYQuIpIklNBFRJJEeiwPVlJS4qZNmxbLQ4qIjHgbNmyoc86V9rdfTBP6tGnTWL9+fSwPKSIy4pnZ3oHspy4XEZEkMaCEbmaFZvZ7M3vfzLaZ2XwzKzKzVWa2w/s5JtrBiohIeANtof8YeN45NxuYA2wDlgKrnXPHA6u9+yIiEif9JnQzGw2cAzwI4JzrcM41ApcDy7zdlgGLohWkiIj0byAt9OlALfAbM9tkZr82s1ygzDlX5e1TDZSFerKZLTGz9Wa2vra2NjJRi4jIUQaS0NOBU4FfOOfmAq306V5xgVUyQq6U4Zx7wDlX7pwrLy3td9SNiIgM0UAS+j5gn3PuTe/+7wkk+ANmNh7A+1kTnRBFRGQg+k3ozrlq4EMzm+VtuhB4D3gWWOxtWww8E5UIRURkQAY6sehm4BEzywR2AdcQ+GPwpJldC+wFrohOiCIi8bFiUyX3vbCd/Y1tTCjM4fZLZrFo7sR4hxXWgBK6c24zUB7ioQsjG46ISGJYsamSu57aStvhLgAqG9u466mtAAmb1DVTVEQkhPte2N6TzIPaDndx3wvb4xRR/5TQRURC2N/YNqjtiUAJXUQkhAmFOYPangiU0EVEQrj9klnkZPiO2JaT4eP2S2aFeUb8KaGLiISwaO5E7v78ST1JPS8rnbs/f1LCXhAFJXQRkbAWzZ3IqVMLAVj4qXEJncxBCV1E5JiqmvwA1B9sj3Mk/VNCFxE5hgNeQq872BHnSPqnhC4iEkaL/zCtHYGx6Gqhi4iMYNVe63zC6GzqWjsIFJZNXEroIiJhVDcHEvonJ46mo7OblvbOOEd0bEroIiJhBC+IfmrCaADqE7wfXQldRCSM4AXRT04oAKAuwfvRldBFRMKoavZTlJvZM90/0S+MKqGLiIRxoMlPWUE2JXmZANSqy0VEZGSqbvYzriCLMbmBhK4WuojICFXd5Gfc6BwyfGmMGZWhi6IiIiNRe2cX9a0djCvIBqA4L0sXRUVERqKa5kDyHj86kNBL8jLVQhcRGYmCk4rKRquFLiIyogWn/Qe7XEqV0EVERqaehB5soedm0uzvpL2z61hPiysldBGREKqb/eRk+CjITgcCXS4ADa2J24+uhC4iEkJ1k5/xo7MxM4CeyUWJfGE0fSA7mdkeoAXoAjqdc+VmVgQ8AUwD9gBXOOc+ik6YIiKxVd0cmCUaFGyh1yZwP/pgWujnO+dOcc6Ve/eXAqudc8cDq737IiJJIdhCDyr1Enoit9CH0+VyObDMu70MWDT8cERE4q+723Gg2d8zZBGg2OtySeSRLgNN6A540cw2mNkSb1uZc67Ku10NlEU8OhGROKhv7aCz2/UMWQTIzUonJ8OX0PVcBtSHDpztnKs0s7HAKjN7v/eDzjlnZiHXZvL+ACwBmDJlyrCCFRGJhb5DFoOK8zITerHoAbXQnXOV3s8a4GngDOCAmY0H8H7WhHnuA865cudceWlpaWSiFhGJouAs0d4tdEj82aL9JnQzyzWz/OBt4GLgHeBZYLG322LgmWgFKSISS9VNbQBHXBQFKE3wei4D6XIpA572xmKmA4865543s7eAJ83sWmAvcEX0whQRiZ3qZj++NOsZqhhUnJvFln1NcYqqf/0mdOfcLmBOiO31wIXRCEpEJJ6qmvyU5WfhS7MjtpfkZ9LQ2kF3tyOtz2OJQDNFRUT66DtkMag4N4vObkdT2+E4RNU/JXQRkT6qm/xHXRAFKMn3Jhe1JuaFUSV0EZE+AkvPhUjo3tqitS2JeWFUCV1EpJcW/2FaO7pCttCDF0nVQhcRGQHCTSqCjysu1rUooYuIJLxwk4oACkdlkmaB0gCJSAldRKSXYAt9/Oicox7zpRlFuVkJO/1fCV1EpJdgQh9bkBXy8ZK8zISd/q+ELiLSS3WznzGjMsjO8IV8vCQvK2ErLiqhi4j0EhiyeHR3S1AiV1xUQhcR6aW62c+4MN0tEJgtqha6iMgI0F8LvSQ/k9aOLto6umIY1cAooYuIeNo7u6hv7Qg5ZDGoJDfQek/EC6NK6CIinprmQJLuWwe9t5L8wOSiRByLroQuIuIJTioKVWkxqDjYQk/A2aJK6CIinp5p/8fqckngiotK6CIinmPVcQkq9iouJuLQRSV0ERFPdbOfnAwfBdnhF3PLzvCRl5Wui6IiIomsusnP+NHZeGsoh1WSoJOLlNBFRDzVzX7KjtF/HlScoNP/ldBFRDzBFnp/SvIyqVcLXUQkMXV3u7CLQ/dVnJelPnQRkURV39pBZ7c75pDFoJK8LBoOddDV7WIQ2cApoYuIMLAhi0EleZk4Bw0JNltUCV1EhGMvPddXcLZook0uGnBCNzOfmW0ys5Xe/elm9qaZVZjZE2aWGb0wRUSiK5jQB3pRFKCuZeS20G8FtvW6fy/wQ+fcTOAj4NpIBiYiEkvVTW340ozivPC10IOC+4zIFrqZTQIuBX7t3TfgAuD33i7LgEXRCFBEJBaqm9opy8/Cl3bsSUUApXnBErojs4X+I+AOoNu7Xww0Ouc6vfv7gIkRjk1EJGaqm9sGNGQRoCAnnQyfJdzQxX4TupldBtQ45zYM5QBmtsTM1pvZ+tra2qG8hIhI1FU3+Qd0QRTAzBJyKbqBtNDPAj5rZnuAxwl0tfwYKDSzYAWbSUBlqCc75x5wzpU758pLS0sjELKISOQFlp4bWEKHxFwsut+E7py7yzk3yTk3DfgK8JJz7kpgDfBFb7fFwDNRi1JEJIpa/Idp7egacAsdErOey3DGod8J3GZmFQT61B+MTEgiIrF1oHngk4qCErHiYviivyE4514GXvZu7wLOiHxIIiKxVTWAlYr6KvHquTjn+i23GyuaKSoiKW8w0/6DSvIyae/s5mB7Z/87x4gSuoikvGBCH0gt9KCe6f8J1O2ihC4iKa+62c+YURlkZ/gG/Jxib/p/Is0WVUIXkZQXGLKYM6jnlHizRWsTqJ6LErqIpLzqZj/jCvqv4dJbSQLWc1FCF5GUd6B58C30otzEq7iohC4iKa29s4u6gx2DGrIIkJmexuicDLXQRUQSRU1zICGPGz24LhcITi5SQhcRSQg9KxUNsssFgotFq8tFRCQhVA9hlmhQSV5mQtVzUUIXkZQ2lDouQSVqoYuIJI6qJj85GT4KsgdV2goIzBZtajtMR2d3/zvHgBK6iKS06mY/40dnD6nAVkl+YOhiQ2titNKV0EUkpVU3+QdVw6W3YD2XRBnpooQuIiltsCsV9VbqtdCV0EVE4qy723mzRIfXQk+UiotK6CKSsupbO+jsdkMasgiJV3FRCV1EUtZwhiwC5GWlk5WeljBDF5XQRSRlDWXpud7MrGcpukSghC4iKSs47X/8EFvokFiLRSuhi0jKqm5qw5dmFOcNvjBXUHFeVsJM/1dCF5GUVd3Uztj8LHxpg59UFJRIFReV0EUkZVU3tw35gmhQoIXegXMuQlENnRK6iKSs6ib/kC+IBhXnZtLZ7WhqOxyhqIZOCV1EUtaB5vZht9BL84PT/+N/YbTfhG5m2Wa2zszeNrN3zexfve3TzexNM6swsyfMLDP64YqIREaL/zAH2zsj0EIPzhaNfz/6QFro7cAFzrk5wCnAQjObB9wL/NA5NxP4CLg2emGKiETWcCcVBZX01HMZAS10F3DQu5vh/XPABcDvve3LgEVRiVBEJAqGO6koqKeFngDT/wfUh25mPjPbDNQAq4CdQKNzrtPbZR8wMcxzl5jZejNbX1tbG4mYRUSGrWfpuWG20ItyMzGDupYRktCdc13OuVOAScAZwOyBHsA594Bzrtw5V15aWjrEMEVEIivY5TLUWuhBvjSjaFQmdQmwyMWgRrk45xqBNcB8oNDMgms2TQIqIxybiEjUVDX5GTMqg+wM37Bfqzgvc2S00M2s1MwKvds5wEXANgKJ/YvebouBZ6IVpIhIpAXqoOdE5LVK8rKoHyEt9PHAGjPbArwFrHLOrQTuBG4zswqgGHgwemGKiERWVZOfcQVDr+HSW6LUc+l3mWvn3BZgbojtuwj0p4uIjDgHmv2cPKkwIq+VKBUXNVNURFJOe2cXdQc7hj1kMagkL4uD7Z34D3dF5PWGSgldRFJOTXOge2Tc6Mh0uZTkJcZi0UroIpJyPp4lGpmLoomyWLQSuoiknEjNEg0qVgtdRCQ+IlXHJagkTy10EZG4qGryk5PhoyC734F+AxJM6HVxrueihC4iKae62c/40dmYDX3pud5yMn3kZvqoa1ELXUQkpqqb/MOu4dJXcV5W3CsuKqGLSMqpbvJHrP88KBEWi1ZCF5GU0t3tqGmJfEIPLhYdT0roIpJS6ls7ONzlIjZkMUgtdBGRGIv0kMWgkrwsGlo76Op2EX3dwVBCF5GUEulJRUHFuZl0O2g8FL9uFyV0EUkp1dFqoed7Y9Hj2I+uhC4iKeVAkx9fmvVMBoqUj+u5xK8fXQldRFJKVZOfsflZ+NIiM6koqDQ/UM+lVgldRCQ2AkvPRba7BRKj4qISuoiklKqmtohfEAUYnZOBL83iOnRRCV1EUsaKTZXsqm3lj+9Uc9Y9L7FiU2XEXjstzSjOzVQLXUQk2lZsqmTp8i0ER4lXNrZx11NbI5rUi/Oy1EIXEYm2+17Yjr+z+4htbYe7uO+F7RE7RkleJnWtaqGLiETV/sa2QW0fipK8LA1bFBGJtvFhRrZMKIzMuqLwcT0X5+Iz/V8JXURSwrmzSo/alpPh4/ZLZkXsGMV5WfgPd3OooytirzkY/SZ0M5tsZmvM7D0ze9fMbvW2F5nZKjPb4f0cE/1wRUQGr6vb8cauBiYW5jBhdDYGTCzM4e7Pn8SiuRMjdpzi3PguFj2QBfU6gW855zaaWT6wwcxWAV8DVjvn7jGzpcBS4M7ohSoiMjR/2FrF7rpWfn7lqXzmpPFRO07vei5Ti3Ojdpxw+m2hO+eqnHMbvdstwDZgInA5sMzbbRmwKFpBiogMVXe34/41FcwozWXhJ8dF9VglucGEHp8W+qD60M1sGjAXeBMoc85VeQ9VA2URjUxEJAJWv1/D+9UtfP28maRFuH5LXyVePZd4TS4acEI3szxgOfBN51xz78dc4JJuyMu6ZrbEzNab2fra2tphBSsiMhjOOX62poLJRTl89pQJUT9eUW4woSdwC93MMggk80ecc095mw+Y2Xjv8fFATajnOucecM6VO+fKS0uPvsosIhItr1XU8/aHjdxw7gwyfNEf1JeV7qMgOz1xu1zMzIAHgW3OuR/0euhZYLF3ezHwTOTDExEZup++tIOygiy+eNqkmB2zJC8rbrNFB/In6yzgauACM9vs/fsMcA9wkZntAP7Kuy8ikhDW72ngzd0NLDlnBlnpvpgdtzgvk7qWBB226Jx7FQh3JeHCyIYjIhIZP1tTQVFuJl89Y3JMj1uSl8WOmoMxPWaQZoqKSNLZuq+Jl7fXcu3Z0xmVOZDpNpFT7E3/jwcldBFJOvevqSA/O52r50+N+bFL8rJoPHSYw13d/e8cYUroIpJU/nKgheffreaaBdMoyM6I+fGLvcWnP4rDhVEldBFJKj9fU8GoTB/XnDU9LscvzYvfYtFK6CKSNPbWt/Ls2/u5at5UxniTfGIt2EKPx2xRJXQRSRq/eHkn6b40rjs7Pq1ziG/FRSV0EUkK+xvbWL5xH18un8zYgtCLWcRCsOKiWugiIkP0wJ934Rxcf+5xcY0jPyudTF+aWugiIkNR29LOY+s+4HNzJzJpzKi4xmJm3lJ0aqGLiAzag6/u5nBXNzeeNyPeoQCBC6P1rWqhi4gMSuOhDn73+h4uPXkCx5XmxTsc4OPFomNNCV1ERrTfrt1Da0cXN52fGK1z8FrocehyiW2RAxGREFZsquS+F7azv7GNCYU53H7JrH4Xb16xqZJ7n3+fqiY/2elpvF/VwuxxBTGK+NhxPf9ONQfbO1lw92ruWDg7ogtRH4sSuojE1YpNldz11FbaDncBUNnYxl1PbQUImwj7Psff2d3vc2Khb1z7m/wxjUsJXUTi6r4XtvckwKC2w118e8U77K5rDfmch17dHfI5972wPa4JPdx7iVVcSugiEleVjW0ht7e0d/Lj1TsG9Vr7w7xWrIQ7fqziUkIXkbh5bksVRugV5icW5vDa0gtCPu+se14K+YdgQmFOZAMcpAmFOXGNS6NcRCTmDnd1839XvsdNj25kSvEostOPTEU5GT5uv2RW2OfffskscjKOXFauv+fEQrzjUgtdRGKqptnPNx7dxLo9DSyeP5V/vvRE/rC1alCjXIKPDXZkTLTFOy5zLtSXnegoLy9369evj9nxRCSxrNvdwE2PbuSgv5O7P39S3BPwSGFmG5xz5f3tpxa6iESdc44HX93N3X98n8ljcvjdtWckxJjxZKOELiJR1dreyR3Lt/DcliouPrGM710xJy5Lw6UCJXQRiajesz5L87MwC1RDvHPhbG449zjMLN4hJi0ldBGJmL4zJWtaAgWqvn7ejISphJjMNGxRRCIm1ExJgGc2749DNKmn34RuZg+ZWY2ZvdNrW5GZrTKzHd7PMdENU0RGgnjPlEx1A2mh/xZY2GfbUmC1c+54YLV3X0RSXJG3QHJf8Z7BmSr6TejOuT8DDX02Xw4s824vAxZFOC4RGWH2N7bhP9xF30ueiTCDM1UMtQ+9zDlX5d2uBsoiFI+IjEAdnd18/ZGNmBl3fWY2EwtzMAL1WDSBKHaGPcrFOefMLOx0UzNbAiwBmDJlynAPJyIJ6LvPvcfmDxv5j6tOZeGnxrPkHI1oiYehttAPmNl4AO9nTbgdnXMPOOfKnXPlpaWlQzyciCSqZzZXsuz1vVx39nQWfmp8vMNJaUNN6M8Ci73bi4FnIhOOiIwkOw60sHT5Vk6fNoY7/3p2vMNJef12uZjZY8B5QImZ7QP+BbgHeNLMrgX2AldEM8hYG8r6hiKp5mB7Jzc8vIHcrHR+9renkuHTtJZ46zehO+e+GuahCyMcS0IYyvqGIqnGOcfS5VvYXdfKI9fNo6wgO94hCZopepRjrQkoIgG/XbuHlVuquP2S2cyfURzvcMSjhN5HuPUNNdNNJGDD3o/47nPb+KtPlHHDucfFOxzpRcW5PB82HDrmgrSa6SYCdQfbuemRjUwozOH7V8xR5cQEk/IJ/UCzn5+9VMHjb32AmXHuCaW8uasef2d3zz5Z6Wma6SYpr6vbcevjm/joUAdPfX0Bo3NU0zzRpGxCb2jt4BcvV/Cfr++lq9txxemTufmCmYwfndMzyqWysY00g7KCbP5mzoR4hywSVz9c9Rdeq6jn379wMp+cMDre4UgISZ/Q+w5B/Mb5M6lqauPBV3fTdriLRXMn8s0LT2BK8aie5yyaO7FnRMszmyu59fHN/HbtHq49e3pUYxvpwyOT7f0IRzRuAOZNL+KK0yfHOSoJJ6kTesghiE8HhiB+5qRx3HbRCcwcm3/M1/jsnAms2FTJ917YzsUnljG5aNQx9x9WbCN4eGSyvR85+ncKsPnDRlZsqtTvNEEl9SiXcMX2S/Oy+PmVp/WbzAHMjH/73EmkGfzT01txLmzZmmHHNpKHRybb+5HQv1N/Z7d+pwksqRN6uKGGdQfbB/U6EwtzuGPhbF7ZUcfTmyojEVrSLQSg4Z7J5UCzX7/TESipu1wKR2Xw0aHDR20fyhDEq+dN5ZnNlXxn5Xucc0IpJXlZw4qtICeDprbIxBZv6/c0kGbQHeLLy0h8P8Mx0q8j9B4sEE6q/U5HkqRtoa/csp/GtsOk9RkmO9Ri+2lpxr1fOJlD7V1857/fG1Zsj775AU0hYvOZ8Y8XnzCs144l5xwPvbqbrzzwBkW5mWSlH/3f6ap5qVMyecWmSpYu30JlYxuOj68jrIjQt7poamo7zA9e3M6n732JB1/dzWUnT+Dbl36CnAzfEftpsYrElpQJ/cV3q/nm45s5fWoRd3/+pIgV2z++LJ+bzp/Js2/v56X3DwzpNZ7auI9/XrGV82eV8u9fOLkntvzsdLqc41CIPv9E1NreyS2Pb+Y7K9/jvFljWf2t87i31/spy8+iIDudh17bw+661niHGzXOOXbVHuR3b+xl6VNbjpi/AIHrCP/23Hu0dybm7/VQRyf3r6ngnH9fw09equC8WWN58R/O4ftXzOHaTx8X0c+PRJ9F6iLfQJSXl7v169dH9Rh/+kstf79sPSdOKOB3155BfnZkJz90dHZz2U9focXfyarbziUva+C9Vs9tqeLmxzYyf0YxDy4+nexerZ/ubsffLXuLtRX1/P7G+Zw8qTCicUfSrtqD3PDwBipqDvKti2dx47kzSOv7dQOoqGnhy798g8z0NJ68fn7ERgjFSrjuk/2NbazdWc/aijrW7qynutnf72tlZ6Rx+rQi5s8oZsGMEk6aOBqfd85i1U3T+zjjR2dz5nHFvLKjlrqDHVwweyy3XXQCn5qo8eWJyMw2OOfK+90vmRL62p11XPObt5hRmsdjfz+P0aOiM5Nt4wcf8YVfrOXqeVP5zuWfGtBzVr13gBsf3sDcKYUs+7szGJV59B+Cj1o7uOynrwKw8uazGRNmwd14ev6dKv7xv7aQmZ7GT74yl7OPLznm/u/tb+arv3qDgpx0nrx+PuNHj4z+11BD9nxpRtGoTGq9i+pFuZlegi7mrBkl/O2v3mB/09HJvSg3k8tPmcDainq2H2gBAt/IzpxeTH52On/YWkV7r5Z9ToYv4i3hUO8H4PixedzzhZM5beqYiB1LIi/lEvqGvQ1c/eA6Jhbm8MT188OuPh4p/+fZd1n2+h7+6/r5lE8rOua+wW8Nn5hQwMP9fGt4+8NGvvQfr7NgZjEPLT49ZMs3Hjq7AsPVfvnnXcyZXMgvrjx1wBfH3v6wkat+/Sal+Vk8fv08xuYnfqnVs+55KeQoj+z0NG5fOJsFM4qZVZZ/xO8nVNLsm5xrW9p5fVc9r++s47WKej5oOBTy+BNGZ7P2rshUqG481MEF3/sTDYc6jnpsYmEOry29ICLHkehJqYS+ZV8jV/7qTUrys3giRgmjtb2Ti3/4Z3IyfTx3y9lkpftC7vf6znq+9pt1g/rW8PAbe/nfK97htotO4JYLj4906APS++t5WUE2ednpVNQc5Kp5U/j2ZSeGfb/hrN/TwP96aB2TxuTw+JLh/cGNRRfFtKXPhdxuwO57Lo1YbOGOA/Cl0yZx1swS5s8oPqre+LGO09reyVt7GgLdQjvreHd/M+E+5v29H0kMKZPQt1U185UH3iA/O/CVPpZDql7eXsPXfvMWt1x4PLdddPTolA17P+LqB99kYmEOjy+ZR/EAhzo657jtybdZsbmSZdecwTknxHYt1nBfz688cwrf/dxJQ37dYJfYzLF5PHrd0LrEBtIKHo7Orm7uff59fvXK7pCPR7pFG/abQEYaWem+nqGtM8fmscDrf68/2M6/PbftiHOQ6Uvj/NmlNLR2sOmDRjq7HZm+NOZOKWTBjBJ+98Ye6g6qhT5SpURCr6g5yJd/+XpcL7r9wxObWbllPytv/jSzxn0883Trvib+9ldvUJyXyZPXz2fsIFd0OdTRyefuX0tNi5+Vt3yaiTH8QxUuyUTiw//y9hqW/OcGTpxQwMPXnTmoi8oAC+5eHbKfOhKx1bT4+cajm1i3u4GzZ5awfk/DEaNWYtW3HTzO38yZwLaqZtZ63TPrdjeEnPnc25xJo1kws4QFM4opn1pETqav3+No1EriS/qEvre+lSt++TrdDp5YMo/jSvMi8rqD1dDawV/94E9MKRrF8hsX4EsztlUFLgTmZQ3vW8Ou2oN89mevMXNsHk9eP5/MEOO8I62r2zHjn/4Q8rFIfT1/8d1qbnxkI6dNGcOyvzujJ+mE4pxjb/0hXtsZGFHy3JaqqMT21p4GbnpkI83+w9zz+ZNZNHdiXEafHOs4HZ3dvL0vcI0lnD0R7A6SxJGUCb135TefGdkZaTx901mcUNZ/TZZoClZkHO3N/kwzyM/OYOXNZw/7W8Mft1Zx4yMbWTx/Kv86wBE1Q9Hd7fjjO9X8YNV2dtaGHjceya/n//32fm59fBMzx+Zx0N9JVZO/J8nMO66YtV4Cf31nfc+3hbKCLJrbOkO2UnMyfDz/zU8ztTh3UHE45/jNa3v4f3/YxqQxOfzH1acxe1xBRN5jtETzG5QkpoEm9BEz9b/vV8Yu5+jsdry3vznuCb2725Fm9PR3djvwH+5iw96Php3Q//qk8Vx39nR+/epuTp06hstPiWyLyjnHmu01fP/Fv/Du/maOH5vHNQum8di6D47qbojkDMG/mTOB13fW8+i6D3q2VTa28Q9PbCbYxBgzKoP5M4q54bwZnDWjmOkluTyzef9RXQfpaUZndzcXfv9PfKl8MrdcOHNAwyNb2zu5c/kWVm6p4qITy/j+FXMoiPC8hWi4/ZJZIbtPNINTRkxCD1X5rd2r/Bbvr43fe/EvR9UxiWRsd/71bN7e18jS5Vs5cXwBx0foD9jaijq+9+J2Nn7QyJSiUfzwy3P47JyJ+NKMOZMLo/71/E9/qT1qmwMKstN5bMk8PjGu4Khhm8EY+sa2YEYxP1tTwWPrPmD5xn1cdeZUbjxvBqX5oS9EV9Qc5MaHN7Cz9iB3LJzFDeeEnhyViMKdg3h/DiT+RkyXy/SlzxEq0kQYdhWL2A40+7n0J6+QZoYvzaju1UXR3we5b9/pl06bxDpvWNu4gmxuufB4vlQWvql3AAAFhElEQVQ+iQxfbCtBROO8fdhwiJ+s3sHyjfvISvdxzVnTuP6cGazZXtNzDsaMyqS1o5O8rHR+8tW5nDXz2JOjROIt6bpcJhTmhOw3TITKb7GIrawgmy+fPpn71+zs2TaQRSRCLTzxo9U7yMtK59uXnciVZ045ogRBLEXjvE0uGsV9X5rDDefN4Ef/fwc/f3knD722m86uQBcdQMOhDszg5gtmKplLUhkxCT2R+w1jFduKTfuP2tZ2uIs7lm/h8bc+CPEM2PhBIx19CkZBYOp5pJfUG6xonrcZpXn89Ktz+fp5M/jc/a/1JPMg5+BXr+zma2fF9xyIRNKwErqZLQR+DPiAXzvn7olIVCEkcr9hrGILt7BAR2d3yFrkwcdCqQ4xljvWYnHePjG+4Ig6Kb1poQZJNkNO6GbmA+4HLgL2AW+Z2bPOueEVCz+G3os3J5pYxBaui2JiYQ5PXj8/5HPCDXFLhK4qiO95S5RzIBIpw7kKdgZQ4Zzb5ZzrAB4HLo9MWBLK7ZfMGvSCA0N5TrLROZBUMZwul4nAh73u7wPO7LuTmS0BlgBMmZI6q9dEw1C6KBK5qypWdA4kVQx52KKZfRFY6Jy7zrt/NXCmc+4b4Z4TiwUuRESSzUCHLQ6ny6USmNzr/iRvm4iIxMFwEvpbwPFmNt3MMoGvAM9GJiwRERmsIfehO+c6zewbwAsEhi0+5Jx7N2KRiYjIoAxrHLpz7g9A6FqrIiISU7Et3iEiIlGjhC4ikiSU0EVEkoQSuohIkohpPXQzqwX2xuyARyoB6uJ07EShc6BzADoHMPLOwVTnXGl/O8U0oceTma0fyEyrZKZzoHMAOgeQvOdAXS4iIklCCV1EJEmkUkJ/IN4BJACdA50D0DmAJD0HKdOHLiKS7FKphS4iktSSMqGb2UNmVmNm7/TaVmRmq8xsh/dzTDxjjCYzm2xma8zsPTN718xu9ban0jnINrN1Zva2dw7+1ds+3czeNLMKM3vCqxSa1MzMZ2abzGyldz+lzoGZ7TGzrWa22czWe9uS8rOQlAkd+C2wsM+2pcBq59zxwGrvfrLqBL7lnDsRmAfcZGYnklrnoB24wDk3BzgFWGhm84B7gR8652YCHwHXxjHGWLkV2Nbrfiqeg/Odc6f0GqqYlJ+FpEzozrk/Aw19Nl8OLPNuLwMWxTSoGHLOVTnnNnq3Wwh8mCeSWufAOecOenczvH8OuAD4vbc9qc8BgJlNAi4Ffu3dN1LsHISRlJ+FpEzoYZQ556q829VAWTyDiRUzmwbMBd4kxc6B19WwGagBVgE7gUbnXKe3yz4Cf+iS2Y+AO4Bu734xqXcOHPCimW3w1jiGJP0sDKse+kjlnHNmlvTDe8wsD1gOfNM51xxonAWkwjlwznUBp5hZIfA0MDvOIcWUmV0G1DjnNpjZefGOJ47Ods5VmtlYYJWZvd/7wWT6LKRSC/2AmY0H8H7WxDmeqDKzDALJ/BHn3FPe5pQ6B0HOuUZgDTAfKDSzYEMm2dfBPQv4rJntAR4n0NXyY1LrHOCcq/R+1hD4w34GSfpZSKWE/iyw2Lu9GHgmjrFElddP+iCwzTn3g14PpdI5KPVa5phZDnARgWsJa4Aversl9Tlwzt3lnJvknJtGYM3fl5xzV5JC58DMcs0sP3gbuBh4hyT9LCTlxCIzeww4j0BFtQPAvwArgCeBKQQqPl7hnOt74TQpmNnZwCvAVj7uO/0nAv3oqXIOTiZwsctHoOHypHPuO2Z2HIHWahGwCbjKOdcev0hjw+ty+Ufn3GWpdA689/q0dzcdeNQ5910zKyYJPwtJmdBFRFJRKnW5iIgkNSV0EZEkoYQuIpIklNBFRJKEErqISJJQQhcRSRJK6CIiSUIJXUQkSfwP27xb4ieSK8gAAAAASUVORK5CYII=\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + "\n", + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)\n", + "\n", + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", + "\n", + "\n", + "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 34, 12: 28, 50: 14, 10: 13, 20: 11, 14: 11, 44: 10, 36: 8, 30: 8, 16: 7, 54: 7, 22: 7, 32: 5, 48: 5, 46: 5, 42: 4, 40: 4, 34: 4, 18: 3, 24: 3, 38: 3, 26: 3, 28: 2, 8: 1})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " \n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 200\n", + "\n", + "circuit = cirq.Circuit()\n", + "\n", + "circuit.append(initial_state())\n", + "\n", + "for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + "circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + "simulator = cirq.Simulator()\n", + "result = simulator.run(circuit, repetitions=sample_number)\n", + "final = result.histogram(key='x')\n", + "\n", + "print(final)\n", + "\n", + "x_arr = [j for j in dict(final).keys()]\n", + "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + "x_arr_final = []\n", + "y_arr_final = []\n", + "\n", + "while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + "plt.plot(x_arr_final, y_arr_final)\n", + "plt.scatter(x_arr_final, y_arr_final)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we get a probability distribution that is much more symetric!\n", + "\n", + "\n", + "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 332675c9b7429dea09aaf33831f4aa37832f4088 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 12 Aug 2019 17:41:55 -0400 Subject: [PATCH 10/29] QRW Final --- .../random_walk_tutorial-checkpoint.ipynb | 34 +++++++++---------- examples/random_walk_tutorial.ipynb | 34 +++++++++---------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb index aaca9705f06..550b385b66e 100644 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -22,17 +22,17 @@ "source": [ "**Classical Random Walks**\n", "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\bigr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\biggr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", "\n", "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", "\n", "Where we know:\n", "\n", "\n", - "$$\\bigr\\lvert \\text{Final}\\rangle \\ = \\ \\bigr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", + "$$\\biggr\\lvert \\text{Final}\\rangle \\ = \\ \\biggr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", "\n", "\n", - "So for our case, the final position vector is simply $\\bigr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "So for our case, the final position vector is simply $\\biggr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", "\n", "\n", "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", @@ -56,54 +56,54 @@ "\n", "\n", "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\bigr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "$\\biggr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", "\n", "\n", "\n", "\n", "\n", - "Going back to our original idea of some position vector $\\bigr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "Going back to our original idea of some position vector $\\biggr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", "$H_W$ spanned by the following set:\n", "\n", "\n", - "$$H_W \\ = \\ \\{\\bigr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "$$H_W \\ = \\ \\{\\biggr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", "\n", "\n", "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", "\n", "\n", - "$$H_C \\ = \\ \\{\\bigr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "$$H_C \\ = \\ \\{\\biggr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", "\n", "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\bigr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\biggr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", "\n", "\n", - "$$\\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\bigr\\lvert 1\\rangle \\ = \\ \\bigr\\lvert \\downarrow\\rangle$$\n", + "$$\\biggr\\lvert 0\\rangle \\ = \\ \\biggr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\biggr\\lvert 1\\rangle \\ = \\ \\biggr\\lvert \\downarrow\\rangle$$\n", "\n", "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\bigr\\lvert i\\rangle \\ \\otimes \\ \\bigr\\lvert j\\rangle$.\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\biggr\\lvert i\\rangle \\ \\otimes \\ \\biggr\\lvert j\\rangle$.\n", "\n", "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", "\n", "\n", - "$$U \\ = \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert $$\n", + "$$U \\ = \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert $$\n", "\n", "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\bigr\\lvert 0\\rangle$ and $\\bigr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\bigr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\bigr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\biggr\\lvert 0\\rangle$ and $\\biggr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\biggr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\biggr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", "\n", "\n", - " $$U (\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert \\Big )(\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle)$$\n", + " $$U (\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert \\Big )(\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle)$$\n", " \n", - " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle$$\n", + " $$\\Rightarrow \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert 1\\rangle \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert 1\\rangle$$\n", "\n", "\n", - " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle \\ + \\ 0\\bigr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle$$\n", + " $$\\Rightarrow \\ \\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 2\\rangle \\ + \\ 0\\biggr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\biggr\\lvert 0\\rangle \\ = \\ \\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 2\\rangle$$\n", "\n", "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\bigr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\biggr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", "\n", "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\bigr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\bigr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ - \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\biggr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\biggr\\lvert \\uparrow\\rangle \\ + \\ \\biggr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\biggr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\biggr\\lvert \\uparrow\\rangle \\ - \\ \\biggr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", "\n", "\n", " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index aaca9705f06..550b385b66e 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -22,17 +22,17 @@ "source": [ "**Classical Random Walks**\n", "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\bigr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\biggr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", "\n", "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", "\n", "Where we know:\n", "\n", "\n", - "$$\\bigr\\lvert \\text{Final}\\rangle \\ = \\ \\bigr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", + "$$\\biggr\\lvert \\text{Final}\\rangle \\ = \\ \\biggr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", "\n", "\n", - "So for our case, the final position vector is simply $\\bigr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "So for our case, the final position vector is simply $\\biggr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", "\n", "\n", "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", @@ -56,54 +56,54 @@ "\n", "\n", "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\bigr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "$\\biggr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", "\n", "\n", "\n", "\n", "\n", - "Going back to our original idea of some position vector $\\bigr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "Going back to our original idea of some position vector $\\biggr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", "$H_W$ spanned by the following set:\n", "\n", "\n", - "$$H_W \\ = \\ \\{\\bigr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "$$H_W \\ = \\ \\{\\biggr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", "\n", "\n", "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", "\n", "\n", - "$$H_C \\ = \\ \\{\\bigr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "$$H_C \\ = \\ \\{\\biggr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", "\n", "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\bigr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\biggr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", "\n", "\n", - "$$\\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\bigr\\lvert 1\\rangle \\ = \\ \\bigr\\lvert \\downarrow\\rangle$$\n", + "$$\\biggr\\lvert 0\\rangle \\ = \\ \\biggr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\biggr\\lvert 1\\rangle \\ = \\ \\biggr\\lvert \\downarrow\\rangle$$\n", "\n", "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\bigr\\lvert i\\rangle \\ \\otimes \\ \\bigr\\lvert j\\rangle$.\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\biggr\\lvert i\\rangle \\ \\otimes \\ \\biggr\\lvert j\\rangle$.\n", "\n", "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", "\n", "\n", - "$$U \\ = \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert $$\n", + "$$U \\ = \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert $$\n", "\n", "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\bigr\\lvert 0\\rangle$ and $\\bigr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\bigr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\bigr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\biggr\\lvert 0\\rangle$ and $\\biggr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\biggr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\biggr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", "\n", "\n", - " $$U (\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert \\Big )(\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 1\\rangle)$$\n", + " $$U (\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert \\Big )(\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle)$$\n", " \n", - " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle\\langle\\uparrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ + \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle\\langle\\downarrow\\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\bigr\\lvert j \\ - \\ 1\\rangle\\langle j\\bigr\\lvert 1\\rangle$$\n", + " $$\\Rightarrow \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert 1\\rangle \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert 1\\rangle$$\n", "\n", "\n", - " $$\\Rightarrow \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle \\ + \\ 0\\bigr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\bigr\\lvert 0\\rangle \\ = \\ \\bigr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\bigr\\lvert 2\\rangle$$\n", + " $$\\Rightarrow \\ \\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 2\\rangle \\ + \\ 0\\biggr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\biggr\\lvert 0\\rangle \\ = \\ \\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 2\\rangle$$\n", "\n", "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\bigr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\biggr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", "\n", "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\bigr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ + \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\bigr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\bigr\\lvert \\uparrow\\rangle \\ - \\ \\bigr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\biggr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\biggr\\lvert \\uparrow\\rangle \\ + \\ \\biggr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\biggr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\biggr\\lvert \\uparrow\\rangle \\ - \\ \\biggr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", "\n", "\n", " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", From 7070761d86c032291a3fd382ed30562a0cf9bcb0 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Wed, 11 Sep 2019 23:03:46 -0400 Subject: [PATCH 11/29] QRW Next --- .../random_walk_tutorial-checkpoint.ipynb | 44 +++++++++---------- examples/random_walk_tutorial.ipynb | 44 +++++++++---------- 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb index 550b385b66e..00d992d342a 100644 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -126,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -164,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -202,7 +202,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -233,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -340,16 +340,16 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def walk_step():\n", - " \n", - " #\"Flip\" the coin qubit\n", + "\n", + " #\"Flip\" the coin vector\n", "\n", " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " \n", + "\n", " #Implement the Addition Operator\n", "\n", " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", @@ -359,14 +359,14 @@ " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", "\n", - " for i in range(number_qubits+1, 1, -1):\n", + " for i in range(number_qubits, 0, -1):\n", " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", "\n", - " #Implement the Subtraction Operator\n", - "\n", " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", "\n", - " for i in range(number_qubits+1, 1, -1):\n", + " #Implement the Substraction Operator\n", + "\n", + " for i in range(number_qubits, 0, -1):\n", " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", "\n", " for i in range(1, number_qubits+1):\n", @@ -384,14 +384,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({12: 52, 14: 20, 20: 20, 16: 13, 10: 9, 54: 9, 30: 8, 52: 8, 18: 7, 38: 7, 26: 7, 22: 6, 42: 6, 28: 4, 36: 4, 32: 3, 24: 3, 34: 3, 48: 3, 44: 2, 40: 2, 50: 2, 8: 1, 46: 1})\n" + "Counter({12: 50, 14: 24, 20: 16, 10: 15, 16: 13, 52: 12, 42: 8, 22: 7, 34: 7, 24: 6, 48: 5, 32: 5, 30: 4, 54: 4, 40: 4, 36: 4, 38: 4, 18: 3, 46: 3, 26: 3, 44: 2, 50: 1})\n" ] } ], @@ -424,12 +424,12 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -469,19 +469,19 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 58, 50: 22, 54: 14, 46: 14, 48: 14, 44: 11, 12: 8, 24: 6, 16: 6, 42: 6, 10: 6, 34: 5, 40: 4, 36: 4, 32: 4, 28: 3, 22: 3, 38: 3, 8: 2, 14: 2, 26: 2, 18: 1, 30: 1, 20: 1})\n" + "Counter({52: 46, 50: 21, 44: 15, 12: 14, 54: 12, 42: 8, 48: 7, 16: 6, 10: 6, 40: 6, 32: 6, 30: 6, 26: 6, 46: 6, 38: 5, 34: 5, 36: 5, 22: 5, 28: 4, 14: 3, 24: 3, 56: 2, 18: 2, 20: 1})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl4k9edL/DvT5Il76tk4wUwBLMlGEhI4oRANmg2JuGmyUzStKWdpNyZZJ4n03bohHam03Y6k2SY6TJzO/eZNCHNncnSLATSQEoJSUNCEoLBgFkDAWNbXjGSV3mRdO4fkowxli3L2t7X38/z8GC9lt738Br9dPw7v3OOKKVARETaZ4h3A4iIKDIY0ImIdIIBnYhIJxjQiYh0ggGdiEgnGNCJiHSCAZ2ISCcY0ImIdIIBnYhIJ0yxvJjValWlpaWxvCQRkebt27fvnFLKNtbzYhrQS0tLUVlZGctLEhFpnoicDeV5TLkQEekEAzoRkU4woBMR6QQDOhGRTjCgExHpBAM6EZFOMKATEekEAzoRkU7EdGIREVE8ba6yY8P2E2hwulCUnYJ1t83B6sXF8W5WxDCgE9GksLnKjvWbquEa8AAA7E4X1m+qBgDdBHWmXIhoUtiw/cRgMA9wDXiwYfuJOLUo8hjQiWhSaHC6xnVcixjQiWhSKMpOGddxLWJAJ6JJYd1tc2AyyEXHUpKMWHfbnDi1KPIY0IloUli9uBgLirMGHxdnp+DJexfoZkAUYJULEU0m/g76nywswn88uDi+bYkC9tCJaNKwO3wDoOc6++LckuhgQCeiSaHP7UGLP5Cf62JAJyLSrAZnLwAgzWxkQCci0rJAumVBSRYcPQMY8Hjj3KLIY0AnoknB7uwBACycmg0AON/dH8/mRAUDOhFNCnaHCwYBrijylS626nBglAGdiCaFeqcLUzKTMSUrGQDQxh46EZE22R0uFOekwJpuAaDP0kUGdCKaFOodLhRnp8Cabgagz9JFBnQi0j23x4umjl6U5KQi3WKCxWRgQCci0qLmzj54vArFOSkQEVjTLTjXxRw6EZHmBGrQi/1L5VozLOyhExFpUaAGvTjHF9Bt6WaWLRIRadElPXSmXIiItKne4YI13YzkJCMAX0A/3+3Lq+sJAzoR6Z7d6UJxTurgY2u6GV4FOHr01UtnQCci3bM7XCgZsneoNcM/uUhnA6MhB3QRMYpIlYi87X88Q0T2iMgpEfmtiJij10wiovAopfw99CEBfXC26OTtoT8O4NiQx08D+LlSahYAB4CHI9kwIqJIONfVjz63d3BAFLgQ0Nu6J2EPXURKANwF4Fn/YwFwC4DX/U95AcDqaDSQiGgi7M6LK1wADE7/11vpYqg99F8A+B6AwIrweQCcSim3/3E9AP1snU1EulHvuLgGHQCyUpKQZBTdlS6OGdBFZBWAFqXUvnAuICJrRaRSRCpbW1vDOQURUdgGa9CHBHQRQV6a/maLhtJDXwrgbhGpAfAKfKmWXwLIFhGT/zklAOwjvVgp9YxSaolSaonNZotAk4mIQmd3upCZbEJmctJFx60Z5skX0JVS65VSJUqpUgAPAHhPKfUQgPcB3Od/2hoAW6LWSiKiMPnWQU+95LhvtugkC+ij+FsA3xGRU/Dl1J+LTJOIiCLH7nRdNCAaYE236K5s0TT2Uy5QSv0RwB/9X58GcE3km0REFBlKKdQ7XKiYmXfJ96zpFrR190EpBV/hnvZxpigR6VaHy42uPneQHroZAx6FdtdAHFoWHQzoRKRb9f5lc0tyLg3oNh1O/2dAJyLdGqlkMSAwW7RVR3l0BnQi0q2RZokGDK7nwh46EVHisztcSE4yIDft0rUDA9P/2xjQiYgSX73DV7I4UhVLTqoZBoGupv8zoBORbg3f2GIog0GQq7Pp/wzoRKRbdqdrxAqXAGu6vqb/M6ATkS719Ltxvrt/xAHRAFuGBa1MuRARJbYGf4XL6D10C87paE10BnQi0qV6R/CSxYBAykUpFatmRRUDOhHpUv0ok4oCrOkW9Lm96OpzB32OljCgE5Eu2Z0umAyC/IzkoM+5MLlIH3l0BnQi0iW7w4Wi7BQYDcFXUrTqbD0XBnQi0qVg66APFZgtqpeBUQZ0ItIl305Fowd0m87Wc2FAJyLd6Xd70dzZO2YPPTfNDNHR9H8GdCLSncZ2F5QavcIFAExGA3JS9TNblAGdiHQnsA56yRg9dEBf0/8Z0IlId+oHZ4mOvDDXUNZ0C1MuRESJyu5wQQSYkhW8Bj0gL10/Ky4yoBOR7tidLhRkJMNsGjvEWdPNLFskIkpUoZQsBljTLeju98DV74lyq6KPAZ2IdKfe2TNmyWKAnmrRGdCJSFc8XoVGZ2/oPfQM32zRVgZ0IqLE0tLZC7dXjboO+lCDC3TpII/OgE5EumIPYR30ofS04iIDOhHpij2EnYqGygss0MWUCxFRYglsbFEUYg/dYjIiM9mENgZ0IqLEUu9wITfNjFSzKeTXWDP0MVuUAZ2IdCWUddCHs6ZbWOVCRJRo7I6ekPPnATadTP9nQCci3VBKhdlD18f0fwZ0ItKN89396B3whjypKCAv3YKOXjf63Nqe/j9mQBeRZBH5TEQOisgREfmx//gMEdkjIqdE5LciYo5+c4mIgguULIaTQweANo0PjIbSQ+8DcItSaiGARQBuF5EKAE8D+LlSahYAB4CHo9dMIqKxBUoWx9tDt+qkFn3MgK58uvwPk/x/FIBbALzuP/4CgNVRaSERUYgu7FQ09sYWQ1kz9LFAV0g5dBExisgBAC0AdgD4AoBTKeX2P6UeQHGQ164VkUoRqWxtbY1Em4mIRmR3upBhMSEzJfQadGDIioud+k+5QCnlUUotAlAC4BoAc0O9gFLqGaXUEqXUEpvNFmYziYjGVu9fB11ExvW6QA5d67Xo46pyUUo5AbwP4DoA2SIS+BgsAWCPcNuIiMYlnJJFAEgxG5FmNup/UFREbCKS7f86BcBKAMfgC+z3+Z+2BsCWaDWSiCgUdkfPuAdEA3zT/7XdQw8l0VQI4AURMcL3AfCqUuptETkK4BUR+SmAKgDPRbGdRESj6ugdQEevO6weOuBLu+g+oCulDgFYPMLx0/Dl04mI4s4eZsligDXdjDPnuiPZpJjjTFEi0oXBksWc8ZUsBvh66DrPoRMRaUG4s0QDrOkWOHr64fZ4I9msmGJAJyJdsDtdsJgMg7M+x8uaYYFSvvVgtIoBnYh0we7wlSyOtwY9wOb/INByLToDOhHpQv0EShYB34qLgLY3i2ZAJyJdCHdSUYB1cPo/e+hERHHTO+DBua7+ce9UNJQeVlxkQCcizRuscJlAQE+3mGAxGRjQiYjiaXBS0TiXzR1KRGBNt2h6PRcGdCLSvEj00AFf6SKrXIiI4qje0QOjQVDg36giXLZ0M6tciIjiye5wYUpmMkzGiYU0rS/QxYBORJpnd7omVOESYE234Hx3P7xeFYFWxR4DOhFpnt2/U9FEWdPN8HgVHD3aTLswoBORpg14vGjq6EXJBCYVBVzYLJoBnYgo5prae+FVE69wAYbMFtVoHp0BnYg0rT4CNegBDOhERHEUqRp04ML0/1aNrufCgE5EmhaYJVqUnTzhc2WlJCHJKMyhExHFg93Zg/wMCywm44TPJSLIS9NuLToDOhFpmt0ZmZLFAGuGGW0M6EREsVfvmNg66MNpebNoBnQi0iyvV6HR2RvZHrqGp/8zoBORZrV29aHf443IpKKAwBK6Smlv+j8DOhFpVqAGvSRn4jXoAdZ0M/o9XnS43BE7Z6wwoBORZkWyBj3A5p/+r8V10RnQiUizLuxUFNmUC6DN2aIM6ESkWfWOHmSnJiHNYorYORnQiYjiwO6MbMkicGH6/zkNTv9nQCcizbJHuAYdAHJSzTAatDn9nwGdiDTpzf31ONXShT8cbcbSp97D5ip7RM5rMAhy08xMuRARxcLmKjvWb6pGoFLc7nRh/abqiAX1PAZ0IqLY2LD9BHrd3ouOuQY82LD9RETOb8vQ5vT/MQO6iEwVkfdF5KiIHBGRx/3Hc0Vkh4ic9P+dE/3mEhEBDf7681CPj5dWp/+H0kN3A/iuUmo+gAoAj4nIfABPANiplCoDsNP/mIgo6oqCDIQGOz5e1nRfykVr0//HDOhKqUal1H7/150AjgEoBnAPgBf8T3sBwOpoNZKIaKh1t82BDDuWkmTEutvmROT81nQLege86O73ROR8sTKuHLqIlAJYDGAPgAKlVKP/W00ACiLaMiKiIG6emw8FIDPZBIFvpuiT9y7A6sXFETn/4OQijdWihzy9SkTSAbwB4K+VUh0iFz4flVJKREb83URE1gJYCwDTpk2bWGuJiAAcrHMCAP7zoatwQ5k14ue3ZlyYLVpqTYv4+aMlpB66iCTBF8xfVEpt8h9uFpFC//cLAbSM9Fql1DNKqSVKqSU2my0SbSaiSe5AnRMiQPnUrKicf3C2qMYGRkOpchEAzwE4ppT62ZBvvQVgjf/rNQC2RL55RESXqqp1oCw/HZnJSVE5vy09sOKitkoXQ+mhLwXwNQC3iMgB/587ATwFYKWInASwwv+YiCiqlFI4UOfEoqnZUbtGbpoZIjrMoSulPgIuGVAOuDWyzSEiGt3Zth44egaweFr0pr6YjAbkpGpvtihnihKRplTVOQAAi6dFr4cOXKhF1xIGdCLSlKpaJ9LMRpTlZ0T1Or7ZovrLoRMRJYwDdU6Ul2TDaAiWCY6MvHQL2thDJyKKjt4BD442dEQ93QIEUi7soRMRRcVhezvcXhXVCpcAa7oFXX1u9A5oZ/o/AzoRacYB/wzRRTHooQ/WomuodJEBnYg0o6rWiZKcFORnJEf9WtYM7c0WZUAnIs2oqnXEJN0CDFmgS0N5dAZ0ItKE5o5eNLT3RnVC0VAXAjp76EREEVVV68ufx6LCBQDyAgt0MYdORBRZVXUOJBkF8wszY3I9i8mIzGQTe+hERJF2oNaJ+UVZSE4yxuyaVo1tFs2ATkQJz+3x4lB9OxbHaEA0wJpuQauGeugh71hERJPP5io7Nmw/gQanC0XZKVh325yIbfM2HieaO+Ea8MQsfx5gS7fgWFNHTK85EQzoRDSizVV2rN9UDZd/pqTd6cL6TdUAEPOgHphQtHhqbCpcAqzpZrQx5UJEWrdh+4nBYB7gGvBgw/YTMW9LVa0TeWlmTM1Niel1rekWtLsG0O/2xvS64WJAJ6IRNThd4zoeTYEJRUM3p4+FPH8telu3NvLoDOhENKKi7JF7w8GOR0u7awBftHbHPH8ODNksulMbaRfdB/TNVXYsfeo9zHhiK5Y+9R42V9nj3SQiTfjqtdMuOZaSZMS62+bEtB0HA/nzGM0QHcqaoa3ZoroeFE2kQR0iral19CDJKMhOMaO1qw+ZySb85J4rYv7eqap1QgQoL8mK6XWBISsuaiSg67qHnkiDOkRacr67H5v223HfVVOx9+9WYNHUbJTkpMalI3SgzoGy/HRkJCfF/NpaW89F1wE9kQZ1iLTk5c9q0ef24ptLSwEAq8oLcbSxA6dbu2LaDqUUDtQ5Y16uGJBiNiLNbGQOPREkyqAOkZYMeLz470/OYlmZFbMLfBsx37mgEACw9VBjTNtytq0Hjp6BmGxoEYxv+j976HH37RVllxyLx6AOkZa8c7gJTR29g71zwNcJWjI9B1urYxvQq+ocAGK3wuJIrOkM6Akhxewb881L85UemQyCJ+9dwAFRolE8v/sMZljTcNPs/IuOryovxPGmTpxq6YxZW6pqnUgzG1GWnxGzaw7n2yyaAT3uXq2sQ2FWMj77wQqsv2Mu3F6Fipl58W4WUcKqqnWgqtaJNddNh8Fw8SSeOxYUQgT43cHY9dIP1DlRXpINoyG2E4qG8vXQmUOPq8Z2Fz482YovX1kCo0GwfLYNAPDhydY4t4wocT2/uwYZFhPuWzL1ku8VZCbjmtJcbK1uhFIq6m3pHfDgaENHXNMtm6vseOtAA8539+P6J3cm/DwW3Qb0Tfvt8CrgvqtKAABzp2QgP8OCXSfPxbllRImpqb0X26ob8adXT0W6ZeQpKqvKC3GqpQsnmqOfdjlsb4fbq2K2h+hwgXksnX1uAEBDey/Wb6pO6KCuy4CulMJrlXW4ZkYuSq1pAAARwbIyGz462QqPN/q9CyKt+e9Pa+BRCmuuKw36nNuvKIRBYlPtElhhMV4VLlqcx6LLgL63xoGath786bBfG5fPtsLRM4DD9vY4tYwoMfUOePDSnlqsnFeAaXmpQZ9ny7CgYmYe3j4U/bRLVa0TJTkpyM9Ijup1gtHiPBZdBvTXKuuQZjbizgVTLjp+wywrRIBdnzOPTjTUlgN2OHoG8M2lM8Z87qryIpw5142jjdHd+CGwwmK8aHEei+4CenefG1urG7GqvAip5ovzgHnpFlxRlIVdHBglGqSUwsaPajB3SgYqZuaO+fzbr5gCo0HwdhTTLs0dvWho743LglwB626bg5Rh+5cmmwwJPY9FdwF9a3Ujevo9uH9JyYjfXz7biv21TnT0DsS4ZUSJ6ZMv2nCiuRN/vnRGSOuN56aZcf1leXj7UEPU0i5VtYEVFuPXQ1+9uBhP3rsAxUN65F+tmJ7Q81h0F9Bfr6zHTGsarpo+8if78jIbPF6FT75oi3HLiBLTxt01yE0z4+5FRSG/5k/Ki1B33oXqKI1HVdU5kGQUzC/MjMr5Q7V6cTF2P3ELPv/pHciwmNDlr3hJVGMGdBHZKCItInJ4yLFcEdkhIif9f8fv96Ihzpzrxmc153HfkpKgPY0rp+cgzWxkHp0IwNm2buw83oyHrp2G5GHphdF86fICmKKYdjlQ68T8oqxxtSmazCYDls+x4d1jLfAmcJVcKD303wC4fdixJwDsVEqVAdjpfxx3r++rg0GAL185croFAJKMBlx3mRW7TrbGZHIEUSL7zcc1MIrgqxXTx/W67FQzlpVZsTUK1S5ujxeH6tuxOI4DoiNZOa8A57r6cLDeGe+mBDVmQFdK7QJwftjhewC84P/6BQCrI9yucfN4Fd7YZ8eNs20oyBy9zOnG2VbUnXehpq0nRq0jSjydvQN4rbIeq8oLx3zPjGRVeRHsTheq6iIb4E40d8I14Ilr/nwkN82xwWgQvHusOd5NCSrcHHqBUirwu1YTgIIItSdsH55sRVNHL+4fYcrycIFlAJh2ocnstcp6dPW5QypVHMnKywtgNhrwdoTXdglMKIrXGujBZKeacXVpDt492hLvpgQ14UFR5ft9K+jvXCKyVkQqRaSytTV6AfS1ffXISU3CrfPyx3zu9Lw0TM9LZUCnScvjVXjhkxpcOS0bC8NMbWQmJ2H5bBu2VTdGNK9cVetEXpoZU3MTr957xbwCnGjuRG2C/nYfbkBvFpFCAPD/HfQjSyn1jFJqiVJqic1mC/Nyo3P29GPHkWbcs6gYFlNogyjLy2z45HQb+t3eqLSJKJG9f7wFZ9t6wu6dB6wqL0RTRy/21Toi1LILE4pCKaGMtZXzfcmIRE27hBvQ3wKwxv/1GgBbItOc8Gw50IB+jzdo7flIls+2oaffg8qzw4cHiPRv4+4zKMxKxu1XTBn7yaNYMb8AZpMhYmu7tLsG8EVrd8LlzwOm56WhLD9duwFdRF4G8AmAOSJSLyIPA3gKwEoROQlghf9x3LxaWYfLizJxeVHou4JXzMyFySD4kKsv0iRzvKkDH3/Rhq9dNx1JxollXdMtJtw8x4at1Y0RWfTuYCB/HscZomNZMb8An505j3ZX4k1ODKXK5UGlVKFSKkkpVaKUek4p1aaUulUpVaaUWqGUils390hDO440dOD+q0LvnQNARnISrpyewzw6TTq/2V2D5CQDHrx6WkTOt6q8CK2dfdhbM/EwUFXrhAhQXhJ65yzWVswrgNur8EECxg7NzxR9rbIeZqMB9ywa/3TcG2fbcKShA62d2theimgiNlfZUfHPO/HK3joYRCIWkG6dl4/kJAPePtQw4XMdqHOgLD8dGclJEWhZdCyamg1ruhnvHk28tIumA3q/24stB+xYOb8AOf59Q8djeZlvkPajU4n3SUsUSYHNGpo6egEAPf2eiG3WkGo24da5BXinugluT/hFBkopVNU5E65ccTijQXDL3Hy8f6IFAxP490aDpgP6zmPNcPQMjGswdKjLizKRl2bGrs+ZRyd9i/ZmDavKC9HW3Y89Z8JPu9S09cDZMxC3DS3GY8W8AnT2urF3Av/eaNB0QH+1sg5TMpOxrCy8ckiDQXBDmRUfnmxN6PUZiCZCKQV7lDdruGlOPlLNxgmlXQ7U+UofE7XCZagbyqywmAzYkWDVLpoN6M0dvfjg81Z8+ariCe0IvrzMhnNd/VFfrJ8oHlo6erH2v/cF/X6kNmtIMRuxYl4Bfn+4Kaw0xOYqO/7uTd/6f3/+/N6E3rcT8KWZbphlxbvHmhNqTSjNBvQ39tf7N4Eee6r/aJaVWQGA5YukK4F9dVf87APs+rwVdy8sQrLp4rd7SpIxops1rCovhKNnAB+Pc2nqQH6/u9+XEtLCZswAcOu8AtSdd+Hz5q54N2WQJgO6UgqvV9bj6tIczPBvAh2u/MxkzJ2SwfJF0g2704VvPL8X614/hDlTMvDO48vw7w8uxlNfLkdxdgoEQHF2Cp68d0FEN2tYPtuGDIsJW8eZdtHiZswABpcZSaRJRqaxn5J49p114PS5bvzFTZdF5Hw3zrZh4+4z6O5zI82iyVtCBK9X4eW9tXhy23F4lcKP774cX6uYDoM/Jbl6cXFUd9tJTjJi5Xxf2uWnqxfAbBq9v9juGsDOY81Rz+9HS0FmMhaWZGHH0WY8dvOseDcHgEZ76K9V1iPVbMRdCwojcr7ls20Y8Ch8epq7GJE21bb14KFn9+AHbx5GeUkWtv/1cqy5vnQwmMfKXeWF6Oh1By0Fdvb049XKOnzz+c+w5Kc78J1XD8IYZM2WRN6MOWDFvAIcqHOipbM33k0BoLEe+uYqO57+/XE0tvci1WzEjqPNEelxLCnNQUqSbxejW+eFtxLw5io7Nmw/gQanC0XZKVh325yE3nswGmJ1D8K5jt5+PoF/j93pQlZKElz9HphNBjx57wI8cPXUuC1stazMhuQkAx57sQq9Ax4UZafgL2+8DEajYFt1Iz75og1ur0JJTgq+uXQG7rhiCs6c68YP3jx8Udol0vn9aFkxvwD/tuNzvHesBQ9cE5mZtxOhmYAeGDgJ/NADEyMATPiNaTEZUTEzF7vCHBgd3ja70xWxtmlFrO7BSNd54o1D6Ol3467ykffE3HqoAT/53VH0+lfW1PrPZ/g9aHcNwCDA+i/NxYNxDirbqhsx4FbwqAv3+u+2+KpXpuWm4pFlM3HngilYUJw1+KGzeFoODCKa/MCdOyUDxdkpePdYMwP6eIw2cBKJH/yyMhveP3EUded7MDU3NaHapgWxugf/8vvjl1yn1+3F9988jO+/eTjIqy7lGvDgX35/XHM/n3NdffjRW0cuuQdeBTz74ZkJL4c7URu2n4BnhDI+W7oFH6y7KehvDtHO70eLiGDl/AK8/FktXP0epJjjuweqZgJ6sAGSSA2cBHYx+uDz1nHvr6jVQZ1ICnYPgh0PR72jBw3twXOVf79q/ojH//HtoyMeb2jvxZPvHMOdVxSivCQrIdffBoCWzl5sP9yEbdVN2HOmDcHmwCXC/7dgbTjX1Zew93eiVswrwG8+rsFHp84NrpceL5oJ6EXZKSMGh0gNnFxmS0Nxdgo+PDm+gF53vgdGg4y4dGiiDOpEO398pKEdBsGIgcZsNOBUSxdm5aeHfX6vV+HFPWfx1DvHIRh5e6zi7BQ8fMPIvdONH50Z8f+OxWTAcx+ewX99cBrF2Sm444opuGNBIRZPzYbBIDHL1Y/0moqZefj94UZsO9yEvTXnoZTv/+hf3TwLr+ytQ8sIC8olwv+3aL9PE9E1M3KRYTHh3aPNDOihWnfbnIvyhkBkB05EBMtnW/H2wUYMeLwhrRNd29aDB3/9KSwmAzxehb5hux+tXT4zIm2biGjntg/b2/HQs3uQ6R+YG3oPkowCk1Fw579/iG+vmI1vLZsB0zjX3645142/feMQ9pw5j2VlVtw8J/+S9M5Y/w+C/d958t4FuHlOPnYca8Y71Y34f5+cxbMfncGUzGTMLkjHp6fPo98Tet49nHs90mu+8+qBwQ/HOQUZePzWMty5oBCzCzIAADNt6VF9L0xEtN+nichsMuDGOTbsPN4Cr1fFvLJoKInltNUlS5aoysrKsF8f7Z7mO9WN+MsX9+O1v7gOV5fmjvrcmnPdePDXn8I14MH/PHwtTrV0DbbNlmGBo6cfV07LwYuPXDvuIBZJS596b8QeU3F2CnY/ccuEzn2wzomvPbcHGclJeGVtBfaddVzy81k6y4ofbjmMdw43YUFxFjbcX465UzLHPLfHq/D87jP41z+cQJLRgL9fNR/3X1UCkej1nDt6B/DesRZsq27EH4IsjZpklKDtP97UgQHPpe+ncF6TmWzCpkeXBv3NJpGrdhK5bdGy5YAdj79yAG8+en1UNucQkX1KqSVjPk9LAT3a2l0DWPyTP+Cxm2fhu18K3qM43dqFr/x6D/rcHrz4SAXmF136Zn1jXz2++9pBPHrTZfje7XOj2exRzXhi64gpCgFw5qm7wj5vVa0DX3/uM2SnJeGlRyrGHEjeVt2IH245jHbXAB67eRYevWlW0Iknp1o6se71Q6iqdeLWufn4p/+1AFOyksNuazhKn9ga9Hu3zB15I/L3jgffDX68r5noz4diq71nAFf+dAf+4saZWHdb5N/voQZ0zaRcYiErJQmLpmZj1+etQQP6qZYufOXXn8LjVXh5bUXQnteXryrB3prz+M8/foElpTm4ZW58cmu5aWa0dfdfcjzNYgp7VH7f2fNYs3Ev8tLNeOlbFSgOIT9654JCVMzMw09+dwS/ePckfn+4CRvuW4gvWi/8ZlOYlYzF03Kw42gzUi1G/PKBRbh7YVFcBtOKg+SCi7NTsPEbV4/4mtF+Gxrva/Scc9ajrNQkXFOai3ePtkQloIdKkzNFo2n5bBsO2dtxfoQgeLK5Ew8lMK9TAAAJUUlEQVQ88ym8CnhllGAe8KO7L8e8wkx8+7cHUe/oiVaTg2pwutA74MHwcGg0CLr63Ljjl7uwZ5yzY/fWnMfXn/sMtgwLXlkbWjAPyE0z4xcPLMazX18CR08/7vnVR/ib1w7C7nRBwVd1srW6EfOLMrHj2zfinkXFcauMWHfbHKQkXfxhF0quPhavocS0Yn4BTjR3orYt9u/1AAb0YZbPtkEp4KNTF08yOtHkC+YG8QXzMv8A1WiSk4z4z4euhMer8FcvVaHfHbvdTfrdXjz20n6ICL5/57yLFmX6t/sX4qVvXQuvAv7smU/xwy2H0d3nHvOce063Yc3Gz1CQlYxX1lagMCu8XuSK+QX4w7dvRHKSEe4RSmNaO/tgy7CEde5IWb24GE/eu2Bci1nF6jWUmFYkwGJdzKEP4/EqXPmPO/Cl+QXYcP9CAMCxxg489OweJBkFL3+rAjNt4yvBCwy2fuP6Uvzo7suj0exL/OR3R7Fx9xn86itX4q7ykde86el341+3f47nPz6DoqwUPP3lctzgX054uI+/OIeHf1OJ4pwUvPTItcjPnHhOO1r5faJ4WfmzD2DLsOClb1VE9LzMoYfJaBDMsKbhjf31eG1fPWzpFnT3u5GVkoSXv1WB0jCW671jQSG+ubQUz++uwdWluUEDbKS8U92IjbvP4BvXl456rVSzCT/8k/m4c8EUfO/1Q/jqc3vwwNVT8f275uG9Yy2Due3cNDM6egcww5qGFx+piFjveTLWLJO+rZhfgGd2nUZ7zwCyUmO/0TVTLsNsrrLjSEP7YB1wa1cfXP0ePHzDjLCCecD6O+Zh8bRs/O0bh3C6NXoL4tec68b3Xj+EhVOz8f0754X0miWludj2+DL87xtn4tXKOix7+n187/VDg7nttu5+uD0KX68ojWgqhPlj0psV8wrg8Sr88fPgFU/RxIA+zIbtJy6pC1YAnt9dM6Hzmk0G/J+vXAmTUfDoi/vRO2wtjkjoHfDg0Rf3w2AQ/Oori8dcj3qo5CQj1t8xD28+uhTdfe7BCTUBCsD//eCLiLaX+WPSm0VTs2FNN+PdY/EJ6Ey5DBPNNWOKs1Pw8z9bhG8+vxf/sOUInr6vfMLnHOrHvzuCo40d2PiNJSjJGd8CYwELp2aPOFAJRGetEK0uykQ0EqNBcMvcfLxzuAn9bu+4OlWRwB76MMHyt5HK6948Jx+P3XwZfltZh9f31UfknACwaX89Xv6sDo/edNmEa96DlSIyt000thXzCtDZ68bemvMxvzYD+jCxyOt+e8VsVMzMxfpNh3DNP72LGU9sxdKn3gt7U9zPmzvxgzcP49oZufjOytkTbh9z20Thc/T45rA89OyeCb2vw8GAPkws8romowF3XlGIAY9CS2cfFC4s5DTeH353nxt/+T/7kGYx4T8eXByRdWOY2yYKz+YqO3701oXlmsN9X4eLdehxEnTKd1YyPl5/a0jnUErh8VcO4O1DDfifR67F9ZeNXENORLERrcXwQq1DZw89ToIOvrb34sltx3CwzomxPmxf3FOLtw424DsrZzOYEyWAaG/EMxZWucRJsEk1FpMBz310Bv+1a/RNFwKvnVeYgUdvmhXr5hPRCOI9WY4BPU4isekCAJxp7cZbBxuY3yZKAPHe4IM59DgKddOFnceasa26CTuCbLoQic0qiCgyorHBBze40KFgmy5wMSsifYvJoKiI3C4iJ0TklIg8MZFz0dg44YeIRhN2QBcRI4BfAbgDwHwAD4rI/Eg1jC7FCT9ENJqJDIpeA+CUUuo0AIjIKwDuAXB01FdR2AJ5uMm2AS8RhWYiAb0YQN2Qx/UArh3+JBFZC2AtAEybNm0ClyOAi1kRUXBRn1iklHpGKbVEKbXEZrNF+3JERJPWRAK6HcDUIY9L/MeIiCgOJhLQ9wIoE5EZImIG8ACAtyLTLCIiGq+wc+hKKbeI/BWA7QCMADYqpY5ErGVERDQuE5r6r5TaBmBbhNpCREQTwNUWiYh0ggGdiEgnGNCJiHQipotziUgrgLMROJUVwLkInEfLeA94DwDeA2By3IPpSqkxJ/LENKBHiohUhrLymJ7xHvAeALwHAO/BUEy5EBHpBAM6EZFOaDWgPxPvBiQA3gPeA4D3AOA9GKTJHDoREV1Kqz10IiIaJuEDuohsFJEWETk85FiuiOwQkZP+v3Pi2cZoEpGpIvK+iBwVkSMi8rj/+GS6B8ki8pmIHPTfgx/7j88QkT3+LRB/618kTtdExCgiVSLytv/xpLoHIlIjItUickBEKv3HJs17YSwJH9AB/AbA7cOOPQFgp1KqDMBO/2O9cgP4rlJqPoAKAI/5t/qbTPegD8AtSqmFABYBuF1EKgA8DeDnSqlZABwAHo5jG2PlcQDHhjyejPfgZqXUoiGlipPpvTCqhA/oSqldAM4PO3wPgBf8X78AYHVMGxVDSqlGpdR+/9ed8L2ZizG57oFSSnX5Hyb5/ygAtwB43X9c1/cAAESkBMBdAJ71PxZMsnsQxKR5L4wl4QN6EAVKqUb/100ACuLZmFgRkVIAiwHswSS7B/5UwwEALQB2APgCgFMp5fY/pR6+Dzo9+wWA7wHw+h/nYfLdAwXgDyKyz7+9JTDJ3gujmdDyuYlAKaVERPelOiKSDuANAH+tlOrwdc58JsM9UEp5ACwSkWwAbwKYG+cmxZSIrALQopTaJyI3xbs9cXSDUsouIvkAdojI8aHfnAzvhdFotYfeLCKFAOD/uyXO7YkqEUmCL5i/qJTa5D88qe5BgFLKCeB9ANcByBaRQKdE71sgLgVwt4jUAHgFvlTLLzG57gGUUnb/3y3wfbBfg0n6XhiJVgP6WwDW+L9eA2BLHNsSVf486XMAjimlfjbkW5PpHtj8PXOISAqAlfCNJbwP4D7/03R9D5RS65VSJUqpUvi2e3xPKfUQJtE9EJE0EckIfA3gSwAOYxK9F8aS8BOLRORlADfBt6JaM4B/ALAZwKsApsG3euOfKqWGD5zqgojcAOBDANW4kDv9Pnx59MlyD8rhG+wywtcJeVUp9RMRmQlfbzUXQBWAryql+uLX0tjwp1z+Rim1ajLdA/+/9U3/QxOAl5RS/yQieZgk74WxJHxAJyKi0Gg15UJERMMwoBMR6QQDOhGRTjCgExHpBAM6EZFOMKATEekEAzoRkU4woBMR6cT/B1ovpH45/PrdAAAAAElFTkSuQmCC\n", "text/plain": [ "
          " ] @@ -549,19 +549,19 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 34, 12: 28, 50: 14, 10: 13, 20: 11, 14: 11, 44: 10, 36: 8, 30: 8, 16: 7, 54: 7, 22: 7, 32: 5, 48: 5, 46: 5, 42: 4, 40: 4, 34: 4, 18: 3, 24: 3, 38: 3, 26: 3, 28: 2, 8: 1})\n" + "Counter({52: 31, 12: 26, 20: 13, 10: 12, 54: 10, 14: 10, 46: 9, 48: 9, 30: 8, 16: 8, 42: 8, 50: 7, 22: 6, 34: 6, 38: 6, 28: 5, 40: 4, 44: 4, 32: 4, 36: 4, 26: 3, 24: 3, 18: 2, 56: 1, 8: 1})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index 550b385b66e..00d992d342a 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -126,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -164,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -202,7 +202,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -233,7 +233,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -340,16 +340,16 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def walk_step():\n", - " \n", - " #\"Flip\" the coin qubit\n", + "\n", + " #\"Flip\" the coin vector\n", "\n", " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " \n", + "\n", " #Implement the Addition Operator\n", "\n", " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", @@ -359,14 +359,14 @@ " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", "\n", - " for i in range(number_qubits+1, 1, -1):\n", + " for i in range(number_qubits, 0, -1):\n", " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", "\n", - " #Implement the Subtraction Operator\n", - "\n", " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", "\n", - " for i in range(number_qubits+1, 1, -1):\n", + " #Implement the Substraction Operator\n", + "\n", + " for i in range(number_qubits, 0, -1):\n", " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", "\n", " for i in range(1, number_qubits+1):\n", @@ -384,14 +384,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({12: 52, 14: 20, 20: 20, 16: 13, 10: 9, 54: 9, 30: 8, 52: 8, 18: 7, 38: 7, 26: 7, 22: 6, 42: 6, 28: 4, 36: 4, 32: 3, 24: 3, 34: 3, 48: 3, 44: 2, 40: 2, 50: 2, 8: 1, 46: 1})\n" + "Counter({12: 50, 14: 24, 20: 16, 10: 15, 16: 13, 52: 12, 42: 8, 22: 7, 34: 7, 24: 6, 48: 5, 32: 5, 30: 4, 54: 4, 40: 4, 36: 4, 38: 4, 18: 3, 46: 3, 26: 3, 44: 2, 50: 1})\n" ] } ], @@ -424,12 +424,12 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAIABJREFUeJzt3Xl4VGWWP/Dvqcoesm9kJREQCSIgQdFgt4KAK+LSaq+M3dN2jzNj+3S3Nkz//PV0T3eL44y9zOhMM+pILzOuCC5oQMAFFDHshMWEnUBSCSFUIKlKqvLOH1UVKqEqqUrdWu7N9/M8PEnd1PLmJnV4c+55zytKKRARkf6Zoj0AIiLSBgM6EZFBMKATERkEAzoRkUEwoBMRGQQDOhGRQTCgExEZBAM6EZFBMKATERlEXCRfLDc3V5WXl0fyJYmIdG/r1q2tSqm8oe4X0YBeXl6O2traSL4kEZHuicjRQO7HlAsRkUEwoBMRGQQDOhGRQTCgExEZBAM6EZFBMKATERkEAzoRkUEEVIcuIkcAdABwAnAopapEJBvAywDKARwBcK9S6kx4hklEREMJZoZ+g1JqqlKqyn17MYB1SqnxANa5b8ekldsbUb10PSoWv4PqpeuxcntjtIdERKS5UFIudwBY7v58OYCFoQ9Heyu3N2LJit1obO+CAtDY3oUlK3YzqBOR4QQa0BWANSKyVUQedB8rUEqdcn/eBKBA89Fp4KmaA+jqcfY71tXjxFM1B6I0IiKi8Ai0l8sspVSjiOQDWCsi+72/qJRSIqJ8PdD9H8CDAFBWVhbSYIfjZHtXUMeJiPQqoBm6UqrR/dEC4A0AVwFoFpFCAHB/tPh57DKlVJVSqiovb8hmYZorykwO6jgRkV4NGdBFJFVE0jyfA5gHYA+ANwEsct9tEYBV4RpkKB6dPwHxJul3LDnejEfnT4jSiIiIwiOQGXoBgI0ishPAFgDvKKXeA7AUwFwRqQdwo/t2zFk4rRjXXXrhL4PizGQ8cddkLJxWHMVRERFpb8gculLqEIApPo6fBjAnHIPSWkZyPACgMCMJmxbPjvJoiIjCY0SsFLV02AAATVYbbAMqXoiIjGJkBHSrHSYBlHLVoRMRGdGICOjNVhsmFqYDAI6d7ozyaIiIwsPwAd3W44TV5kDVmCwAwLE2BnQiMibDB3SL1Q4AqCxKR3K8mQGdiAzL+AHdfUG0ID0JZdkpDOhEZFgjIKC7Zuj5aUkozU7BcQZ0IjIowwf0Zqtrhp6fntg3Q1fKZ9sZIiJdM3xAt3TYEWcSZKckoCw7GZ3dTpw+3x3tYRERac74Ad1qR15aIkwmQVlOCgBWuhCRMRk/oHfYkJ+WCAAoy3YHdNaiE5EBGT+gW+3IT08CAJRkcYZORMZl/IDuNUNPijejID2RAZ2IDMnQAd3ucOJMZw/y05L6jrEWnYiMytABvcVdg16Qnth3rCw7lbXoRGRIhg7ofYuK+gX0FLbRJSJDMnZA9ywq8k655CSzjS4RGZKxA7qfGTrAShciMh5jB3T3xhY5qRcCeqk7oDOPTkRGY+iA3my1IS8tEWaT9B3LG5WIpHgTjnJxEREZjKEDuqXD3i9/DgAiwtJFIjKkERDQEy86XsY2ukRkQMYO6FZb37J/b6Vso0tEBmTYgN7j7MXp890+Z+hjslPYRpeIDMewAb313MUlix5so0tERmTYgN7s3hy6IO3ilEsZSxeJyIAMG9AtXlvPDdTXRpeli0RkIMYN6F6bQw/kaaN7lDN0IjIQ4wZ0qw0iQO6oBJ9fZy06ERmNcQN6hx05qYmIM/v+FktZi05EBmPogO6rZNGDbXSJyGgCDugiYhaR7SLytvt2hYh8JiINIvKyiPjObURJs9XWb2OLgcqyU9hGl4gMJZgZ+g8A7PO6/SSA3yilxgE4A+A7Wg4sVL76uHgbw1p0IjKYgAK6iJQAuBXAc+7bAmA2gNfcd1kOYGE4BjgcDmcvWs/ZfZYserCNLhEZTaAz9N8CeAxAr/t2DoB2pZTDffsEgGJfDxSRB0WkVkRqW1paQhpsoE6f74ZS8NnHxcPTRpe16ERkFEMGdBG5DYBFKbV1OC+glFqmlKpSSlXl5eUN5ymCZrF6atD9z9DZRpeIjCYugPtUA1ggIrcASAKQDuB3ADJFJM49Sy8B0Bi+YQan2b1KtGCQGTrAWnQiMpYhZ+hKqSVKqRKlVDmA+wGsV0p9HcAGAPe477YIwKqwjTJIF1aJ+p+hA2yjS0TGEkod+k8A/FBEGuDKqT+vzZBCZ+lwzdBzRw0e0MvYRpeIDCSQlEsfpdQHAD5wf34IwFXaDyl0zVY7clITkBA3+P9Xnq6Lx9o6hwz+RESxzpArRVs6XJtDD4VtdInISAwZ0C0d9kFLFj08tegsXSQiIzBkQG+22lAQwAzd00aXlS5EZASGC+jOXoXWc92DrhL1xtJFIjIKwwX0tvPdcPaqQfu4eCtlQCcigzBcQL+wqCjwGTrb6BKRERguoLe4FxXlBThDZxtdIjIKwwV0z6KioVaJenjXohMR6ZnhAnqzpzFXECkXgLXoRKR/hgvolg4bMlPikRhnDuj+eWlso0tExmC8gG4dfC/RgdhGl4iMwnABvbnDPmTb3IEY0InICAwX0FusgfVx8VaanYLjbKNLRDpnqIDe26vQcm7wzaF9KctOwXm20SUinTNUQD/T2Y0epwp4UZEHSxeJyAgMFdAv7FQU/AwdYOkiEembIQN6sDP0kiy20SUi/TNUQPf0cQl2hp6cYEZ+GtvoEpG+GSqge/q4BLpK1BtLF4lI7wwV0C1WG9KT4pAUH9gqUW9lOSnMoRORrhkqoDdbA9t6zpey7BScstpgd7CNLhHpk6ECuqXDFtSyf2+eNronzrCNLhHpk6ECerM1+GX/HqxFJyK9M0xAV0qhpSO4xlzeWItORHpnmIB+tqsH3c7eoPu4eOSlJSIxjm10iUi/DBPQPRtbDDflwja6RKR3hgnowW495wsDOhHpmXECet/Wc8OboQNso0tE+maYgN6swQx9TI6rjW4b2+gSkQ4ZJqBbrHaMSoxDamLcsJ/DU+lylGkXItKhIQO6iCSJyBYR2SkidSLyc/fxChH5TEQaRORlEUkI/3D9C6Vk0YOli0SkZ4HM0O0AZiulpgCYCuAmEZkJ4EkAv1FKjQNwBsB3wjfMoTVbbcNqyuWNbXSJSM+GDOjK5Zz7Zrz7nwIwG8Br7uPLASwMywgDZOkIfuu5gdhGl4j0LKAcuoiYRWQHAAuAtQAOAmhXSjncdzkBoNjPYx8UkVoRqW1padFizBdRSoXUx8UbSxeJSK8CCuhKKadSaiqAEgBXAbgs0BdQSi1TSlUppary8vKGOczBWW0O2Hp6h72oyFtZNtvoEpE+BVXlopRqB7ABwDUAMkXEU1JSAqBR47EFrMVTshhiDh1w1aKzjS4R6VEgVS55IpLp/jwZwFwA++AK7Pe477YIwKpwDXIofYuKQsyhAxfa6DayjS4R6UwgM/RCABtEZBeAzwGsVUq9DeAnAH4oIg0AcgA8H75hDq5Zwxn6mBy20SUifRpyFY5SaheAaT6OH4Irnx51F2bo2lwUBRjQiUh/DLFS1NJhR0qCGaNCWCXqwTa6RKRXhgjozVZXyaKIhPxcbKNLRHpliICuxaIibwzoRKRHhgjoLR12TS6IerCNLhHpkSECuivlou0MnW10iUhvdB/Qz9kd6Ox2ajpDZ6ULEemR7gO6xeqqQS/QMqCzFp2IdEj3Ab1Zw1WiHqVso0tEOqT7gK7F5tADsY0uEemR7gN6S0fom0P7wtJFItIb3Qf0ZqsNiXEmpCeFvkrUG9voEpHe6D6gW9w16FqsEvXGNrpEpDf6D+hWOwo0vCDqwTa6RKQ3ug/ozR2hbw7tC0sXiUhvdB/QW6za9nHx8CwuYh6diPRC1wG9s9uBDrsjLDP0TQ2tAIDHV9Wheul6rNwetR32iIgCouuAruXWc95Wbm/ET9/Y03e7sb0LS1bsZlAnopim74DurkHXctk/ADxVcwBdPf2rW7p6nHiq5oCmr0NEpCVdB/Rmq2eVqLYz9JPtvitb/B0nIooFug7onhm6lsv+AaAoMzmo40REsUDnAd2GBLMJmSnxmj7vo/MnIDne3O9YcrwZj86foOnrEBFpSdv18hFmsdqRp9Feot4WTisG4MqlN7rTLD+7vbLvOBFRLNL9DD0cJYuAK6hvWjwbr37/GgBAaqKu/+8johFA3wE9TMv+vV1ZloWc1ASs2dsc1tchIgqVrgN6szV8M3QPs0kwt7IAG/Zb2KiLiGKabgO6rccJq82heYWLL/MnjcY5uwOfHDwd9tciIhou3Qb0cG1s4cs1Y3OQmmDGmjqmXYgoduk2oF9YVBT+GXpSvBnXX5aPtXub4exVYX89IqLh0G1Av7CoKPwzdACYV1mA1nN27Dh+JiKvR0QULP0GdPcMXes+Lv7ccFk+4s2CGqZdiChGDRnQRaRURDaIyF4RqRORH7iPZ4vIWhGpd3/MCv9wL2jusCPOJMhKSYjI66UnxePasbmoqWuCUky7EFHsCWSG7gDwI6VUJYCZAP5WRCoBLAawTik1HsA69+2I8awSNZm0XSU6mHmTCnD0dCe+aD4XsdckIgrUkAFdKXVKKbXN/XkHgH0AigHcAWC5+27LASwM1yB9ca0SjUz+3GNuZQFEgJq6poi+LhFRIILKoYtIOYBpAD4DUKCUOuX+UhOAAk1HNgSL1R6RChdv+WlJuLIsiwGdiGJSwAFdREYBeB3AI0opq/fXlCup7DOxLCIPikitiNS2tLSENFhvlg5bxC6IeptXWYC6k1acOMO9RokotgQU0EUkHq5g/hel1Ar34WYRKXR/vRCAxddjlVLLlFJVSqmqvLw8LcYMu8OJM509EStZ9DZ/0mgA4CIjIoo5gVS5CIDnAexTSj3t9aU3ASxyf74IwCrth+dbS5g2tghEeW4qJhSkMe1CRDEnkBl6NYBvApgtIjvc/24BsBTAXBGpB3Cj+3ZEXNhLNPIzdMBV7fL5kTa0ne+OyusTEfkyZJNvpdRGAP5qA+doO5zAWKyugJ4XhRk64Eq7/Nv6Bry/rxn3VpVGZQxERAPpcqWopcPdxyUKF0UBYFJROoozk5lHJ6KYos+AbrXDbBLkpEYnoIu4eqR/XN+Czm5HVMZARDSQPgN6hw25oxJgjuAq0YHmTxoNu6MXHx7QrhSTiCgUugzozVZ7VEoWvc0oz0JWSjy3piOimKHLgG7psEdlUZG3OLMJcyYWYN2+ZvQ4e6M6FiIiQK8B3WpDXpRn6IAr7WK1ObD5ELemI6Lo011A73H24vT57qgsKhrouvG5SI7n1nREFBt0F9Bbz0V3UZG3pHgzvnxpHtbsbUJvFLamW7m9EdVL16Ni8TuoXroeK7c3RnwMRBQ7dBfQm63RW/bvy/zLC9BstWPnifaIvu7K7Y1YsmI3Gtu7oAA0tndhyYrdDOpEI5juArpn67loLSoaaPaEAsSZJOLVLk/VHEBXj7Pfsa4eJ56qORDRcRBR7NBfQI9yH5eBMlLiMfOSnIg36zrZ3hXUcSIyPl0F9JXbG/Hku/sBAHc+sylm0gvzJxXgUMt5NFgitzVdUWZyUMeJyPh0E9A9OeMOu2up/cmztpjJGc+tdPVIj+Qs/dH5ExA3YKVscrwZj86fELExEFFs0U1Aj+Wc8eiMJEwpzcSaCAb0hdOKkZ+WiMQ414/QbBL86s7LsXBaccTGQESxRTcBPdZzxvMnFWDnibM4dTYy42npsOPkWRsenjMev71vKpy9CoUZTLcQjWS6CeixnjOe5067rI1QtcsnB1sBuBY33XT5aKQlxeGV2uMReW0iik26CeiPzp+A5Hhzv2OxlDMelz8KY/NSI5ZH31jfiozkeEwqykBSvBl3TC3C6t2nYLX1ROT1iSj26CagL5xWjCfumozizGQIgOLMZDxx1+SYyhnPmzQamw+14WxneIOqUgqbGlpx7dicvhbC91aVwu7oxZs7Tob1tYkodg25BV0sWTitOKYC+EDzJ43Gf3xwEOv2N+OuK0vC9jqHW8/j5FkbHroht+/Y5OIMXDY6Da/WHsc3Zo4J22sTUezSzQxdD64ozkBGcjz+4Y3dYe2vsqnBlT+fNe5CQBcR3FtVip0nzmJ/k1Xz1ySi2MeArqE3d57EObsDtp7esPZX+bi+FSVZyRiTk9Lv+J3TipFgNuGVz09o+npEpA8M6Bp6quYAnAO6LmpdK+9w9uLTQ6cxa1wuRPovLMpKTcDcygK8sf0E7A6nn2cgIqNiQNdQJGrldzeeRYfNgWqvdIu3e2eU4kxnD9bts2j2mkSkDwzoGopErbwnf37t2ByfX581LhdFGUl4+XPWpBOFSm97DjCgaygStfIf17diUlE6ckb5bh9sNgnumV6Cj+pbYmYVLZEe6XHPAQZ0DXlq5YsyXK19k+JNmtbKd3Y7sO3YmX7VLb58paoUSgGvb+XFUaLhiuX+Uf4woGts4bRifLJkDr5dXYHeXuCGy/I1e+4th9vQ41R+8+cepdkpuHZsDl7ZejwqW+MRGUGs94/yhQE9TBZMLUK3s1fTVgCbGlqRYDZhRnn2kPe9b0Ypjrd1YfPh05q9PtFIEuv9o3xhQA+TKSUZGJOTgrd2arcU/+P6VlSVZyE5wTzkfedPcjfs4sVRomF5dP4EDNhyAElxppjpH+ULA3qYiAhuv6IImxpa0XrOHvLztXTYsb+pY8h0i0dSvBkLpxbj3T1NONvFhl1EwZpbWQCTCFITL0ygvj2rIqbbjwwZ0EXkBRGxiMger2PZIrJWROrdH7PCO0x9un1KEXoVsHr3qZCfy9Mud6gLot76GnZp+FcC0Ujx4RctcPQqPL9oBvb/003ITk3AF82R22ZyOAKZob8I4KYBxxYDWKeUGg9gnfs2DTBhdBomFKRp0gFxU4OrXe7lxRkBP+by4nRMLExn2oVoGGrqmpCdmoAZ5dlIijfja1eVYd3+Zhw9fT7aQ/NryICulPoIQNuAw3cAWO7+fDmAhRqPyzAWTC1C7dEzaAzhyrhSChvr+7fLDYSrYVcJdjeexd6TbNhFFKhuRy/W77fgxon5fe+5b14zBmYRLP/kaJRH599wc+gFSilPHqEJQIFG4zGc264oBAC8HULaw9MuN9D8ubeFU90Nu7ibEVHANh86jQ6bo28nMgAoSE/CLZML8WrtcZxzb1Yfa0K+KKqUUgD8FjuLyIMiUisitS0tLaG+nO6MyUnFlNLMkPLYvtrlBiorNQHzJhVg5Y5GNuwiClBNXRNSEsyYNb7/e+6B6nJ02B14LUYnSMMN6M0iUggA7o9+O0EppZYppaqUUlV5eXnDfDl9WzClCHUnrTjYMrwLKhsbWlGceXG73EDdW1WK9s6eiO13SqRnvb0Ka/c24/oJeUga0MpjWlkWppZmYvmnR2Ny0d5wA/qbABa5P18EYJU2wzGm264ohAiGVZPucPbik4O+2+UGqnpcLoozk/FKLVsBEA1lx4l2WDrs/dIt3h6oLsfh1vP48IvYyzgEUrb4vwA+BTBBRE6IyHcALAUwV0TqAdzovk1+FKQn4eqKbLy58yRcGarAedrlDvzTLxhmk+Du6SX4uL4lpIuzRCNBTV0T4kzit23HLZMLUZCeiBc2HY7wyIYWSJXLV5VShUqpeKVUiVLqeaXUaaXUHKXUeKXUjUqpgVUwNMCCKcU41HIedUFWmwzVLjdQX5leAqWA1zhLJ/JLKYU1dc24ZmwOMpLjfd4n3mzCN2eOwcf1rWiwdER4hIPjStEIufny0YgzCd7aFVzaZWNDKyoL/bfLDVRpdgqqx+XgVTbsokHorf+31hos53C49TzmTfKdbvH46lVlSIgz4b83HYnMwALEgB4hWakJuG58Lt7eeSrggNrZ7cC2o+0hpVu83VtVihNnuvDpITbsoovpsf+31ta4CwfmVQ5eiZ0zKhF3TCnCim2NONsZO601GNAjaMHUIjS2d2HbsTMB3X/L4TZ0O3uHVa7oy/xJo5GeFMeadPJJj/2/tVZT14SppZkoSE8a8r4PVFegq8eJlz4/FoGRBYYBPYLmVo5GYpwp4GqXYNrlBiIp3oyF09wNu2JoVkGxwd8F81ju/62lk+1d2HXiLOYPkW7xqCxKx9UV2fjjp0fhcPaGeXSBYUCPoFGJcbhxYgHe2X0qoF+AjQ2nMX1MYO1yA5U3KhHdjl5M+cWaEZkj1YrRcs1KKaT6+T2L5f7fWvKs05g/KfCF7w9UV6CxvQvv74uNNR4M6BF2+5RCtJ7rHjKP3XrOjn2nrJrlzwFXEHr2g4N9t0dijlQLRsw1P7/xMM53OxE3oFeQWSSm+39rqaauCePyR+GSvFEBP2ZuZQFKspLxQoxcHGVAj7DrJ+QjLTFuyA6MoSz398dfjvQf36pDS0foPdtHiqXv7jdUrvnd3afwq9X7cMvk0fjne65AcWYyBEBqohm9SmFcfuABTq/OnO/GZ4fbgpqdA641HouuKceWw22oO3k2TKMLHAN6hCXFmzFv0mi8V9c0aG+VTQ2tSE+KC6pd7lD85ULbO3sw41fvY8G/b8TTaw5g27EzcA6oxDFaimE47A4n/vDhQTRZbT6/rsdc87ZjZ/DIyzswrTQTT987FXddWYJNi2fj8NJb8cniOchKTcAv3tob9II4vVm/3wJnr/K7OnQw984oRUqCOSZKGBnQo+D2KYXosDnw4QHfS4cvtMvNDapd7lD85ULzRiXix/MuRbzZhH/f0IC7nv0EVb9ci0de2o5VOxrxl81HDZdiCIZSCu/vbcb833yEJ97dj6Q432+b7NSECI8sNEdPn8d3l9eiID0J//Wtqov6lmQkx+PH8yZgy5E2vKPBJi2xrKauCYUZSbiiJPgJVEZyPO6+sgRv7jipye5koWBAj4LqcbnITk3w24HxyOlOV7tcDfPngGuPxOQBb9rkeDN+eutE/N3s8Xj9b67Ftsfn4vdfnYYbJuTjo/pW/OClHfjpyj2GSjEEo765A996YQv++o+1MJsELz4wA0vvvuKi8ygAznR248+bY7dXtrf2zm488OLncCqFFx+Y4Xfh2n0zSjGxMB1PrN4PW48xu3V2dTvxUX0L5lUWDLtf0qJry9Ht7MX/fBbdEsa4qL76CBVvNuGWyaPx+tZGdHY7kJLQ/8ewsd41c79Ow/w5gL69EJ+qOYCT7V0oykzGo/Mn9NsjMTMlAQumFGHBlCL09irsajyLhc9s8vl8ekwxBKq9sxu/fb8ef9p8FKkJZvzs9kp8Y+YYxJsvzIG8z+PDs8fhvbom/L+Ve3C8rRM/uekymDT860pLdocTD/5pK060deHPf331oBcBzSbBz26vxP3LNmPZR4fw8JzxERxpZHxU3wJbT++Qq0MHMy5/FL50aR7+tPkovv/lsUjw81dcuDGgR8mCKcX48+ZjWLu3GXdM7b/pbKjtcgezcFpxwJvcmkyCqaWZKM5M9lmjbIRytpXbG/sF5h/OvRSd3Q7869ovYO3qwdeuLsMP5064KJ3i6zzePb0E//hWHf7w0SEcP9OJp++delEaI9qUUnjstV3YcrgNv7t/Kq6qGHqNw8xLcnDL5NF49oMG3DO9JOo/94E/s4GTkmDV1DUhIzk+oHMxmAeqy/HAf3+Od/ecuug9HSlMuURJ1ZgsFGYkXbTIyNmrQm6XqzVfqRoAmFycoeuLZb7KD3/86k48vqoOE0en452Hr8MvF04OODceZzbhn+64HD+9ZSLe3dOEr/3XZpyOck51oKfXfoFVO07i0fkTggo6S26eiF4FPPne/jCObmhal4z2OHuxbp8Fcybm9/vrazi+PD4Pl+SmRrWEkQE9SkwmwW1XFOLDL1rQ3tndd9zTLlfr/HkoFk4rxhN3Te4rZyvKSMJV5dl4r64JP3p1J7odsbFKLli+yjgVgOyUBPzPd6/GxML0oJ9TRPDdL12CZ792JepOWnHns58Me2MTrb3y+XH82/oG3FdVioeuHxvUY0uzU/C9L12CVTtOovZI9Jqrat2e4PPDbTjb1TOs6paBTCbBX1WXY+fx9oDbe2iNAT2KFkwpRo9Toaauqe+YJ39eHWK7XK0tnFZ8oZxtyRy8/L2Z+OHcS7FiWyMWvbBFV60EWs/ZsWLbCb9L3c90dof819HNkwvxvw/OxHm7A3c9+wk+i3JDtI31rfiHN3bjuvG5+OWdlw/r+/ub68didHoSfv7W3qh17NS6PUFNXROS4k348qXa7KZ295UlSEuKi1oJI3PoUXR5cTrKc1Lw5s6TuG9GGQDt2uWGm4jg4TnjUZqdjMde24W7//MT/PdfzUBptvZ5/0D5y616Lu5u2G/BBwcs2NV4FkoBJgF8xSWtcsRXlmXhjYeq8VcvbsE3n9+C+2aUYv1+S9C53+HkjL0fk5eWCKutB+PyR+GZr1857NRCSkIcFt98GR55eQde33YCX6kqHdbzDMeps1148l3/6Z7h/MyUUliztxlfGp+nWXuN1MQ4TC/Lwls7T+KtnSdRrEGOPxicoUeRiGDBlCJ8evA0LB02zdvlRsKd00rwx29fDYvVhjuf3YQdx9ujMg5fudVHX9uJe/7jE8z41ftY+Mwm/H59PcwmwQ9vvBRv//0s/MtXpvgs49RyqXtZTgpW/M21KM1Oxp82Hw069zucnPHAx1g67LD19OK+GaVIT/K9aUOg7phahCvLMvHkewfQYQv/X2W2Hid+v64es//lQ6ze04R5lQUXrQMwi+DH8y4N+rl3N57FqbO2kKpbBlq5vbFfW49Ir9ngDD3KFkwtwu/XN2D1rlOoyBuFbmcvqjUuVwy3a8bmYMVD1+KBFz/H/cs+xe/unxZwxzotnLM78Kt39l2UW+1xKmw7dgYLphThhsvycd34vH4XOC8vzoBJRNOKCV8yUxLQ1X1xDXdXjxOPr9qDo6c7/T72uY2HfOaMB3ucr8cAwHMfH8YD1RVBjr4/EcHPbp+EO57ZhGc2HMTimy8L6fn8UUph9e4m/Hr1PjS2d+GWyaOx5OaJKM1O6ffXx6ikOHTYHDh+JviUS01dE8wmwRw/W80Nx1M1B2AfcE3Jk+PZMrIPAAAJpElEQVSPxCydAT3KxuWnYWJhOt7ceRLTx2QhwWzCVRq1y42kcflpeOOhanxneS2+/+etePzWSnx7VmjBw1tntwNHWjtx5PR517/W8zjS2onDp88P2oemVwG/vX+a368HU8YZilNnfbcL6LA58Jv3vwj6+YbzOK3WDUwpzcQ900vwwsbDuH9GKcpzUzV5Xo89jWfxi7f2YsuRNkwsTMe/3jsFMy+5cE3J+2emlMKPXt2Jp9d+gdLsZNw5rSTg11lT14yryrORpeEKX3/nOFJrNhjQY8DYvFS8vesUth1rR0KcCTV1TRHLuWkpd1QiXvruTDzy8nb84u29ONbWiSuKM/Cva78IaAZs63Hi6OlOHG69ELQ9nzdb+wftvLREVOSk4vpL81Cem4rnPz6MNq9qIY/iGKmVL/JXy5+RhI0/me33cbOeXI+TPv4zGOxxfh+j4bl4bP6EvqZe//WtqmE9x8BrA9//8iXYe8qKlz4/jqyUBPz6zsm4b0bpoO0vRARL77oCp9pteOy1XSjMSO4X/P051HIO9ZZz+PrVZcMauz9+f84R+j1kQI+yldsb+/owA0C3oxdLVuwGAF0G9eQEM579+nQ8sXofntt4uN+Fx8b2Lix+fRearDaMzRvlCth9s+3zOGW1wbusPSc1AeW5qZg1Lg8VuSkoz01FeU4qynNTMSqx/69ucWYylqzY3S/VoHU+PBSPzp/gc3yPDbGi9LGbLgv6cf4eo+W5yE9Pwt/OHod/fu8APq5vwXXjg6sS8eT5PWNsbO/C46vqYBLg29UVeHjOeL+bNA+UEGfCf35jOu7+z0/w4B9rseKhazEuP23Qx9TUubea0zg16O/nHKnfQ4nkwpCqqipVW1sbsdfTg+ql633+j16cmYxNi/3P3PRgys/X4GzX4BfOMlPiUZ6Tioq+YJ2CitxUjMlJDfgN7aH1CkKtDXd8oVa5hOtc2HqcmPebj5AUb8Lqh69DXBDVM/5+7/PTErHlpzcOazzH2zpx57ObkBRvxhsPVSMvzX+l2J3PboLDqfDW388a1msNJhznXkS2KqWG/FOIAT3KKha/A18/AQFweOmtkR6Opvx9bwDwxkPXoiI3FZkp+upQSP3V1DXhe3/ail/cMQnfuqZ80Pt2O3pRe7QNHxxowbKPDvm8T6i/9zuPt+O+ZZ9iwuh0vPTdmT7LEZutNlz963X48bxL8Xez9dGbJtCAzpRLlEU75xZO/r634sxkTCvLisKISGvzKgtQPS4HS9/dj2c3HESz1dZvVtpsteGDAxZs2N+CjQ2tOGd3IN4sSIwzXVQNAoT+ez+lNBO/v38avvfnrXjk5e149uvTL8rBr+nbai5ylViRwjr0KPPX0jZWcr+hMPL3Ri4iglljc9HZ7UST1davJ0710vW4+tfr8JPXd2PXiXYsmFqEZd+cjh3/fx6e9NGCWKvfjXmTRuPxWytRU9eMJ1bvu+jra+qaUJGbasidmDhDj7JAWtrqlZG/N7rgzz56gDt6FVo67Fh882W4YUI+Li0Y1a/dQLh/N749qwLH2jrx3MbDKM1OwaJrywEAZ7t68OnB0/jOdRUx0/xOSwzoMSBStdDRYOTvjVz81Vj3OHvx/S/7bwIW7t+Nx2+rxIkzXfj5W3UozkzGjZUF2LDfAscwt5rTAwZ0IgpJrF4HMpsEv//qVNz3h8146C/bkJEcj5ZzdpjEtf3e9DHGu47DHDoRhSSWr5WkJMThK9NL0OPsRYu7N32vAn76xh5D7onLgE5EIRnYL784MxlP3DU5ZlJtf/jo0EXls0bdEzeklIuI3ATgdwDMAJ5TSi3VZFREpCuxfK0k2v1VImnYM3QRMQN4BsDNACoBfFVEKrUaGBGRFvzl8qOd4w+HUFIuVwFoUEodUkp1A3gJwB3aDIuISBuxnOPXWigpl2IAx71unwBwdWjDISLS1khaDxH2skUReRDAgwBQVqZtq0oiokDEco5fS6GkXBoBeG8qWOI+1o9SaplSqkopVZWXp81GrEREdLFQAvrnAMaLSIWIJAC4H8Cb2gyLiIiCNeyUi1LKISJ/B6AGrrLFF5RSdZqNjIiIghJSDl0ptRrAao3GQkREIeBKUSIig2BAJyIyCAZ0IiKDYEAnIjKIiG4SLSItAI5q8FS5AFo1eB6j4Pnoj+fjAp6L/vR6PsYopYZcyBPRgK4VEakNZAfskYLnoz+ejwt4Lvoz+vlgyoWIyCAY0ImIDEKvAX1ZtAcQY3g++uP5uIDnoj9Dnw9d5tCJiOhiep2hExHRADEf0EXkBRGxiMger2PZIrJWROrdH7OiOcZIEZFSEdkgIntFpE5EfuA+PlLPR5KIbBGRne7z8XP38QoR+UxEGkTkZXc30BFDRMwisl1E3nbfHrHnQ0SOiMhuEdkhIrXuY4Z9v8R8QAfwIoCbBhxbDGCdUmo8gHXu2yOBA8CPlFKVAGYC+Fv3Pq4j9XzYAcxWSk0BMBXATSIyE8CTAH6jlBoH4AyA70RxjNHwAwD7vG6P9PNxg1Jqqle5omHfLzEf0JVSHwFoG3D4DgDL3Z8vB7AwooOKEqXUKaXUNvfnHXC9aYsxcs+HUkqdc9+Md/9TAGYDeM19fMScDwAQkRIAtwJ4zn1bMILPhx+Gfb/EfED3o0Apdcr9eROAgmgOJhpEpBzANACfYQSfD3d6YQcAC4C1AA4CaFdKOdx3OQHXf3ojxW8BPAag1307ByP7fCgAa0Rkq3s7TMDA75ew7ykabkopJSIjqlRHREYBeB3AI0opq2sS5jLSzodSyglgqohkAngDwGVRHlLUiMhtACxKqa0icn20xxMjZimlGkUkH8BaEdnv/UWjvV/0OkNvFpFCAHB/tER5PBEjIvFwBfO/KKVWuA+P2PPhoZRqB7ABwDUAMkXEM1nxudetQVUDWCAiRwC8BFeq5XcYuecDSqlG90cLXP/hXwUDv1/0GtDfBLDI/fkiAKuiOJaIcedDnwewTyn1tNeXRur5yHPPzCEiyQDmwnVdYQOAe9x3GzHnQym1RClVopQqh2uP3/VKqa9jhJ4PEUkVkTTP5wDmAdgDA79fYn5hkYj8L4Dr4eqS1gzgZwBWAngFQBlc3RvvVUoNvHBqOCIyC8DHAHbjQo70H+DKo4/E83EFXBe1zHBNTl5RSv1CRC6Ba4aaDWA7gG8opezRG2nkuVMuP1ZK3TZSz4f7+37DfTMOwP8opX4lIjkw6Psl5gM6EREFRq8pFyIiGoABnYjIIBjQiYgMggGdiMggGNCJiAyCAZ2IyCAY0ImIDIIBnYjIIP4POLy1oZWNofwAAAAASUVORK5CYII=\n", "text/plain": [ "
          " ] @@ -469,19 +469,19 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 58, 50: 22, 54: 14, 46: 14, 48: 14, 44: 11, 12: 8, 24: 6, 16: 6, 42: 6, 10: 6, 34: 5, 40: 4, 36: 4, 32: 4, 28: 3, 22: 3, 38: 3, 8: 2, 14: 2, 26: 2, 18: 1, 30: 1, 20: 1})\n" + "Counter({52: 46, 50: 21, 44: 15, 12: 14, 54: 12, 42: 8, 48: 7, 16: 6, 10: 6, 40: 6, 32: 6, 30: 6, 26: 6, 46: 6, 38: 5, 34: 5, 36: 5, 22: 5, 28: 4, 14: 3, 24: 3, 56: 2, 18: 2, 20: 1})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -549,19 +549,19 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 34, 12: 28, 50: 14, 10: 13, 20: 11, 14: 11, 44: 10, 36: 8, 30: 8, 16: 7, 54: 7, 22: 7, 32: 5, 48: 5, 46: 5, 42: 4, 40: 4, 34: 4, 18: 3, 24: 3, 38: 3, 26: 3, 28: 2, 8: 1})\n" + "Counter({52: 31, 12: 26, 20: 13, 10: 12, 54: 10, 14: 10, 46: 9, 48: 9, 30: 8, 16: 8, 42: 8, 50: 7, 22: 6, 34: 6, 38: 6, 28: 5, 40: 4, 44: 4, 32: 4, 36: 4, 26: 3, 24: 3, 18: 2, 56: 1, 8: 1})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] From 00e8d117e7730475a1f8f5d035c9bde6157bf2ad Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Wed, 11 Sep 2019 23:23:40 -0400 Subject: [PATCH 12/29] QRW Next 2 --- .../random_walk_tutorial-checkpoint.ipynb | 222 +++++++++++++----- examples/random_walk_tutorial.ipynb | 222 +++++++++++++----- 2 files changed, 336 insertions(+), 108 deletions(-) diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb index 00d992d342a..97a47259926 100644 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -7,106 +7,164 @@ "# Quantum Random Walks With Cirq - Tutorial" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", - "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Classical Random Walks**\n", "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\biggr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium \n", + "(like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement,\n", + "the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is \n", + "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", + "at each of the integers. Let the initial position vector of our marker be $\\lvert 0\\rangle$. For $N$ steps of our\n", + "random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", + "$1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute\n", + "the value:\n", "\n", "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", "\n", "Where we know:\n", "\n", "\n", - "$$\\biggr\\lvert \\text{Final}\\rangle \\ = \\ \\biggr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", + "$$\\lvert \\text{Final}\\rangle \\ = \\ \\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", "\n", "\n", - "So for our case, the final position vector is simply $\\biggr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "So for our case, the final position vector is simply $\\lvert j\\rangle$. This model of a random walk can easily \n", + "be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random \n", + "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", + "a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", + "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", + "that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random \n", + "walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability \n", + "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is \n", + "given by:\n", "\n", "\n", "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", "\n", "\n", - "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", + "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position \n", + "$X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", + "that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, \n", + "minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", + "to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ \n", + "by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. \n", + "Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, \n", + "and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ \n", + "steps by calculating the binomial coefficient, therefore getting:\n", "\n", "\n", "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", "\n", "\n", - "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", + "And so we have shown that the probability distribution for the position of the walker for an $N$ step random \n", + "walk is given by a binomial distribution. This fact is important, as we will show that the probability \n", + "distribution that is created when a quantum random walk is simulated is nowhere close to the binomial \n", + "distribution that we expect to see for a classical 1-dimensional random walk.\n", "\n", "\n", "\n", "**Quantum Random Walks**\n", "\n", "\n", - "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", + "The process of the quantum random walk isn't that much different from its classical counterpart, although \n", + "the observed results of the two processes have many differences. First, let us motivate the creation of a \n", + "QRW. The idea is that when one performs analysis on a classical random walk, you can find that \n", + "$\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, \n", + "and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that \n", + "$\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. \n", + "At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the \n", + "classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", "\n", "\n", - "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\biggr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "In order to create a quantum random walk, we have to translate the components of the classical random walk \n", + "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", + "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a \n", + "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", + "looks something like this:\n", "\n", "\n", "\n", "\n", "\n", - "Going back to our original idea of some position vector $\\biggr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "Going back to our original idea of some position vector $\\lvert j\\rangle$, it is apparent that in order to \n", + "encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector \n", + "to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", "$H_W$ spanned by the following set:\n", "\n", "\n", - "$$H_W \\ = \\ \\{\\biggr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "$$H_W \\ = \\ \\{\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", "\n", "\n", - "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", + "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode \n", + "the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space \n", + "is spanned by the two basis states, representing forward and backward progression on our number-line-like \n", + "graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent \n", + "clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, \n", + "and we can again define our spanning set:\n", "\n", "\n", - "$$H_C \\ = \\ \\{\\biggr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "$$H_C \\ = \\ \\{\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", "\n", "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\biggr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents \n", + "clock-wise motion. Now that we have defined all of the vectors we need to encode the information about \n", + "our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is \n", + "again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations \n", + "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given \n", + "by the binary representation of $j$ corresponding to the basis vector $\\lvert j\\rangle$. For the coin vector, \n", + "since we have only two states, we only need one qubit to encode the two possible states:\n", "\n", "\n", - "$$\\biggr\\lvert 0\\rangle \\ = \\ \\biggr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\biggr\\lvert 1\\rangle \\ = \\ \\biggr\\lvert \\downarrow\\rangle$$\n", + "$$\\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\lvert 1\\rangle \\ = \\ \\lvert \\downarrow\\rangle$$\n", "\n", "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\biggr\\lvert i\\rangle \\ \\otimes \\ \\biggr\\lvert j\\rangle$.\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the \n", + "two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general \n", + "element of this Hilbert space as $\\lvert i\\rangle \\ \\otimes \\ \\lvert j\\rangle$.\n", "\n", - "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", + "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random \n", + "walk evolution operator as follows:\n", "\n", "\n", - "$$U \\ = \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert $$\n", + "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", "\n", "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\biggr\\lvert 0\\rangle$ and $\\biggr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\biggr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\biggr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the \n", + "post. Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", + "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", + "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", + "\"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), \n", + "and then sums over all possible position states until it finds the position state to which the operator is \n", + "being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, \n", + "they're orthonormal!), and the new position state of the vector is $\\lvert j \\ \\pm \\ 1\\rangle$, depending on \n", + "the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or \n", + "backwards by one step! If you're still not convinced, let's check to see what happens when we have the state \n", + "$\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle$ and we apply the $U$ operator:\n", "\n", "\n", - " $$U (\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert \\Big )(\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle)$$\n", + " $$U (\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert \\Big )(\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle)$$\n", " \n", - " $$\\Rightarrow \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert 1\\rangle \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert 1\\rangle$$\n", + " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert 1\\rangle \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert 1\\rangle$$\n", "\n", "\n", - " $$\\Rightarrow \\ \\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 2\\rangle \\ + \\ 0\\biggr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\biggr\\lvert 0\\rangle \\ = \\ \\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 2\\rangle$$\n", + " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle \\ + \\ 0\\lvert \\downarrow\\rangle \\ \\otimes \\ \\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle$$\n", "\n", "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\biggr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our \n", + " random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", + " it is necessary that we randomly flip the state of our coin vector $\\lvert i\\rangle$. The Hadamard \n", + " transformation seems like a natural choice, as:\n", "\n", "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\biggr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\biggr\\lvert \\uparrow\\rangle \\ + \\ \\biggr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\biggr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\biggr\\lvert \\uparrow\\rangle \\ - \\ \\biggr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\lvert \\uparrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ + \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\lvert \\downarrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ - \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", "\n", "\n", - " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", + " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the \n", + " right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" \n", + " that works as one complete step of the random walk, including randomizing the coin vector:\n", "\n", "\n", " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", @@ -121,7 +179,10 @@ "**Tutorial: Building a QRW With Cirq**\n", "\n", "\n", - "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we \n", + "need to translate this into code. We can start by creating a qubit register, which will be used to represent \n", + "all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers \n", + "ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" ] }, { @@ -159,7 +220,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on the coin qubit:" + "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on \n", + "the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" \n", + "is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's \n", + "also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is \n", + "an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on \n", + "the coin qubit:" ] }, { @@ -178,7 +244,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "Now that we have created and initialized our qubit register, we have to create an operation that can evolve \n", + "our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", "\n", "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", "\n", @@ -188,16 +255,23 @@ "\n", "\n", "\n", - "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", + "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker \n", + "steps forwards or backwards without ever having to be measured!\n", "\n", "\n", - "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", + "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \n", + "\"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with \n", + "adds or substracts $1$ from the position vector. \n", "\n", "\n", - "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", + "Before we actually dive into making the addition and substraction operators, it will be useful for us to define \n", + "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", + "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", + "standard $CNOT$ and Toffoli gates.\n", "\n", "\n", - "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" + "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla \n", + "qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" ] }, { @@ -225,10 +299,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", + "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", + "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", + "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", + "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", + "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", + "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", "\n", "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", + "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" ] }, { @@ -292,14 +373,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", + "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", + "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", + "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, \n", + "the idea is:\n", "\n", "\n", "\n", @@ -317,13 +401,15 @@ "\n", "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", "\n", - "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", + "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if \n", + "we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", "\n", "\n", "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", "\n", "\n", - "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", + "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, \n", + "we get:\n", "\n", "\n", " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", @@ -335,12 +421,14 @@ "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", "\n", "\n", - "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" + "So basically, our subtraction operation will just be applying our addition operator, but with the order of \n", + "gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds \n", + "or substract $1$ to the random walkers position vector, based on the coin qubit:" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -379,7 +467,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the ``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector qubits, we have:" + "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the \n", + "``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position \n", + "vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the \n", + "example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector \n", + "qubits, we have:" ] }, { @@ -419,7 +511,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the number of occurences of that position vector value on the y-axis. This gives us a probability distribution for the position of the random walker. It is important to note that the graphs will only have either even or odd numbered data point, depending on the initial position of the walker and the number of steps taken:" + "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", + "number of occurences of that position vector value on the y-axis. This gives us a probability distribution for \n", + "the position of the random walker. It is important to note that the graphs will only have either even or odd \n", + "numbered data point, depending on the initial position of the walker and the number of steps taken:" ] }, { @@ -464,7 +559,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " + "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated \n", + "applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to \n", + "the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ \n", + "and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", + "and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. \n", + "In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " ] }, { @@ -538,13 +638,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", + "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one \n", + "more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our \n", + "distribution towards only one side! We will set our initial state to:\n", "\n", "\n", "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", "\n", "\n", - "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" + "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", + "the qubit. When we simulate this with Cirq, we get:" ] }, { @@ -624,7 +727,18 @@ "So we get a probability distribution that is much more symetric!\n", "\n", "\n", - "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" + "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to \n", + "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", + "example of a QRW and many more great projects that can be made by utilizing this interesting process! \n", + "\n", + "**References**\n", + "\n", + "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", + "\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", + "\n", + "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", + "\n" ] } ], diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index 00d992d342a..97a47259926 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -7,106 +7,164 @@ "# Quantum Random Walks With Cirq - Tutorial" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", - "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Classical Random Walks**\n", "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium (like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement, the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings at each of the integers. Let the initial position vector of our marker be $\\biggr\\lvert 0\\rangle$. For $N$ steps of our random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of $1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute the value:\n", + "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium \n", + "(like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement,\n", + "the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is \n", + "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", + "at each of the integers. Let the initial position vector of our marker be $\\lvert 0\\rangle$. For $N$ steps of our\n", + "random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", + "$1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute\n", + "the value:\n", "\n", "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", "\n", "Where we know:\n", "\n", "\n", - "$$\\biggr\\lvert \\text{Final}\\rangle \\ = \\ \\biggr\\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", + "$$\\lvert \\text{Final}\\rangle \\ = \\ \\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", "\n", "\n", - "So for our case, the final position vector is simply $\\biggr\\lvert j\\rangle$. This model of a random walk can easily be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random walk on a number-line-like graph, the probability of the random walker being at a specific location follows a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is given by:\n", + "So for our case, the final position vector is simply $\\lvert j\\rangle$. This model of a random walk can easily \n", + "be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random \n", + "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", + "a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", + "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", + "that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random \n", + "walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability \n", + "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is \n", + "given by:\n", "\n", "\n", "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", "\n", "\n", - "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position $X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ steps by calculating the binomial coefficient, therefore getting:\n", + "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position \n", + "$X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", + "that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, \n", + "minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", + "to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ \n", + "by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. \n", + "Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, \n", + "and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ \n", + "steps by calculating the binomial coefficient, therefore getting:\n", "\n", "\n", "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", "\n", "\n", - "And so we have shown that the probability distribution for the position of the walker for an $N$ step random walk is given by a binomial distribution. This fact is important, as we will show that the probability distribution that is created when a quantum random walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", + "And so we have shown that the probability distribution for the position of the walker for an $N$ step random \n", + "walk is given by a binomial distribution. This fact is important, as we will show that the probability \n", + "distribution that is created when a quantum random walk is simulated is nowhere close to the binomial \n", + "distribution that we expect to see for a classical 1-dimensional random walk.\n", "\n", "\n", "\n", "**Quantum Random Walks**\n", "\n", "\n", - "The process of the quantum random walk isn't that much different from its classical counterpart, although the observed results of the two processes have many differences. First, let us motivate the creation of a QRW. The idea is that when one performs analysis on a classical random walk, you can find that $\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that $\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", + "The process of the quantum random walk isn't that much different from its classical counterpart, although \n", + "the observed results of the two processes have many differences. First, let us motivate the creation of a \n", + "QRW. The idea is that when one performs analysis on a classical random walk, you can find that \n", + "$\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, \n", + "and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that \n", + "$\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. \n", + "At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the \n", + "classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", "\n", "\n", - "In order to create a quantum random walk, we have to translate the components of the classical random walk to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\biggr\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration looks something like this:\n", + "In order to create a quantum random walk, we have to translate the components of the classical random walk \n", + "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", + "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a \n", + "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", + "looks something like this:\n", "\n", "\n", "\n", "\n", "\n", - "Going back to our original idea of some position vector $\\biggr\\lvert j\\rangle$, it is apparent that in order to encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "Going back to our original idea of some position vector $\\lvert j\\rangle$, it is apparent that in order to \n", + "encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector \n", + "to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", "$H_W$ spanned by the following set:\n", "\n", "\n", - "$$H_W \\ = \\ \\{\\biggr\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "$$H_W \\ = \\ \\{\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", "\n", "\n", - "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space is spanned by the two basis states, representing forward and backward progression on our number-line-like graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, and we can again define our spanning set:\n", + "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode \n", + "the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space \n", + "is spanned by the two basis states, representing forward and backward progression on our number-line-like \n", + "graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent \n", + "clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, \n", + "and we can again define our spanning set:\n", "\n", "\n", - "$$H_C \\ = \\ \\{\\biggr\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "$$H_C \\ = \\ \\{\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", "\n", "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents clock-wise motion. Now that we have defined all of the vectors we need to encode the information about our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given by the binary representation of $j$ corresponding to the basis vector $\\biggr\\lvert j\\rangle$. For the coin vector, since we have only two states, we only need one qubit to encode the two possible states:\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents \n", + "clock-wise motion. Now that we have defined all of the vectors we need to encode the information about \n", + "our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is \n", + "again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations \n", + "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given \n", + "by the binary representation of $j$ corresponding to the basis vector $\\lvert j\\rangle$. For the coin vector, \n", + "since we have only two states, we only need one qubit to encode the two possible states:\n", "\n", "\n", - "$$\\biggr\\lvert 0\\rangle \\ = \\ \\biggr\\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\biggr\\lvert 1\\rangle \\ = \\ \\biggr\\lvert \\downarrow\\rangle$$\n", + "$$\\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\lvert 1\\rangle \\ = \\ \\lvert \\downarrow\\rangle$$\n", "\n", "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general element of this Hilbert space as $\\biggr\\lvert i\\rangle \\ \\otimes \\ \\biggr\\lvert j\\rangle$.\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the \n", + "two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general \n", + "element of this Hilbert space as $\\lvert i\\rangle \\ \\otimes \\ \\lvert j\\rangle$.\n", "\n", - "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random walk evolution operator as follows:\n", + "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random \n", + "walk evolution operator as follows:\n", "\n", "\n", - "$$U \\ = \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert $$\n", + "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", "\n", "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the post. Essentially, since our qubits take on states $\\biggr\\lvert 0\\rangle$ and $\\biggr\\lvert 1\\rangle$, we know that any possible, general basis state vector formed from qubits $\\biggr\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to all other vectors in the basis spanning the space. Because of this, we can create an operator that first \"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), and then sums over all possible position states until it finds the position state to which the operator is being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, they're orthonormal!), and the new position state of the vector is $\\biggr\\lvert j \\ \\pm \\ 1\\rangle$, depending on the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or backwards by one step! If you're still not convinced, let's check to see what happens when we have the state $\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle$ and we apply the $U$ operator:\n", + "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the \n", + "post. Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", + "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", + "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", + "\"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), \n", + "and then sums over all possible position states until it finds the position state to which the operator is \n", + "being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, \n", + "they're orthonormal!), and the new position state of the vector is $\\lvert j \\ \\pm \\ 1\\rangle$, depending on \n", + "the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or \n", + "backwards by one step! If you're still not convinced, let's check to see what happens when we have the state \n", + "$\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle$ and we apply the $U$ operator:\n", "\n", "\n", - " $$U (\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert \\Big )(\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 1\\rangle)$$\n", + " $$U (\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert \\Big )(\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle)$$\n", " \n", - " $$\\Rightarrow \\ \\biggr\\lvert \\uparrow\\rangle\\langle\\uparrow\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ + \\ 1\\rangle\\langle j\\biggr\\lvert 1\\rangle \\ + \\ \\biggr\\lvert \\downarrow\\rangle\\langle\\downarrow\\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\biggr\\lvert j \\ - \\ 1\\rangle\\langle j\\biggr\\lvert 1\\rangle$$\n", + " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert 1\\rangle \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert 1\\rangle$$\n", "\n", "\n", - " $$\\Rightarrow \\ \\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 2\\rangle \\ + \\ 0\\biggr\\lvert \\downarrow\\rangle \\ \\otimes \\ \\biggr\\lvert 0\\rangle \\ = \\ \\biggr\\lvert \\uparrow\\rangle \\ \\otimes \\ \\biggr\\lvert 2\\rangle$$\n", + " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle \\ + \\ 0\\lvert \\downarrow\\rangle \\ \\otimes \\ \\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle$$\n", "\n", "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, it is necessary that we randomly flip the state of our coin vector $\\biggr\\lvert i\\rangle$. The Hadamard transformation seems like a natural choice, as:\n", + " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our \n", + " random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", + " it is necessary that we randomly flip the state of our coin vector $\\lvert i\\rangle$. The Hadamard \n", + " transformation seems like a natural choice, as:\n", "\n", "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\biggr\\lvert \\uparrow\\rangle \\ = \\ \\frac{\\biggr\\lvert \\uparrow\\rangle \\ + \\ \\biggr\\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\biggr\\lvert \\downarrow\\rangle \\ = \\ \\frac{\\biggr\\lvert \\uparrow\\rangle \\ - \\ \\biggr\\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\lvert \\uparrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ + \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\lvert \\downarrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ - \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", "\n", "\n", - " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" that works as one complete step of the random walk, including randomizing the coin vector:\n", + " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the \n", + " right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" \n", + " that works as one complete step of the random walk, including randomizing the coin vector:\n", "\n", "\n", " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", @@ -121,7 +179,10 @@ "**Tutorial: Building a QRW With Cirq**\n", "\n", "\n", - "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we need to translate this into code. We can start by creating a qubit register, which will be used to represent all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we \n", + "need to translate this into code. We can start by creating a qubit register, which will be used to represent \n", + "all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers \n", + "ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" ] }, { @@ -159,7 +220,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on the coin qubit:" + "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on \n", + "the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" \n", + "is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's \n", + "also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is \n", + "an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on \n", + "the coin qubit:" ] }, { @@ -178,7 +244,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now that we have created and initialized our qubit register, we have to create an operation that can evolve our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "Now that we have created and initialized our qubit register, we have to create an operation that can evolve \n", + "our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", "\n", "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", "\n", @@ -188,16 +255,23 @@ "\n", "\n", "\n", - "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker steps forwards or backwards without ever having to be measured!\n", + "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker \n", + "steps forwards or backwards without ever having to be measured!\n", "\n", "\n", - "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with adds or substracts $1$ from the position vector. \n", + "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \n", + "\"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with \n", + "adds or substracts $1$ from the position vector. \n", "\n", "\n", - "Before we actually dive into making the addition and substraction operators, it will be useful for us to define an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the standard $CNOT$ and Toffoli gates.\n", + "Before we actually dive into making the addition and substraction operators, it will be useful for us to define \n", + "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", + "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", + "standard $CNOT$ and Toffoli gates.\n", "\n", "\n", - "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" + "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla \n", + "qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" ] }, { @@ -225,10 +299,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", + "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", + "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", + "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", + "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", + "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", + "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", "\n", "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the $n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", + "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" ] }, { @@ -292,14 +373,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", + "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", + "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, the idea is:\n", + "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, \n", + "the idea is:\n", "\n", "\n", "\n", @@ -317,13 +401,15 @@ "\n", "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", "\n", - "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", + "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if \n", + "we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", "\n", "\n", "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", "\n", "\n", - "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, we get:\n", + "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, \n", + "we get:\n", "\n", "\n", " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", @@ -335,12 +421,14 @@ "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", "\n", "\n", - "So basically, our subtraction operation will just be applying our addition operator, but with the order of gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds or substract $1$ to the random walkers position vector, based on the coin qubit:" + "So basically, our subtraction operation will just be applying our addition operator, but with the order of \n", + "gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds \n", + "or substract $1$ to the random walkers position vector, based on the coin qubit:" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -379,7 +467,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the ``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector qubits, we have:" + "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the \n", + "``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position \n", + "vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the \n", + "example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector \n", + "qubits, we have:" ] }, { @@ -419,7 +511,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the number of occurences of that position vector value on the y-axis. This gives us a probability distribution for the position of the random walker. It is important to note that the graphs will only have either even or odd numbered data point, depending on the initial position of the walker and the number of steps taken:" + "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", + "number of occurences of that position vector value on the y-axis. This gives us a probability distribution for \n", + "the position of the random walker. It is important to note that the graphs will only have either even or odd \n", + "numbered data point, depending on the initial position of the walker and the number of steps taken:" ] }, { @@ -464,7 +559,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " + "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated \n", + "applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to \n", + "the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ \n", + "and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", + "and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. \n", + "In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " ] }, { @@ -538,13 +638,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our distribution towards only one side! We will set our initial state to:\n", + "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one \n", + "more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our \n", + "distribution towards only one side! We will set our initial state to:\n", "\n", "\n", "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", "\n", "\n", - "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to the qubit. When we simulate this with Cirq, we get:" + "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", + "the qubit. When we simulate this with Cirq, we get:" ] }, { @@ -624,7 +727,18 @@ "So we get a probability distribution that is much more symetric!\n", "\n", "\n", - "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to computer science, to finance. I definitely think there are a lot of possible great extensions to this basic example of a QRW and many more great projects that can be made by utilizing this interesting process! For more information on these applications, see: https://en.wikipedia.org/wiki/Random_walk#Applications" + "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to \n", + "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", + "example of a QRW and many more great projects that can be made by utilizing this interesting process! \n", + "\n", + "**References**\n", + "\n", + "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", + "\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", + "\n", + "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", + "\n" ] } ], From 8d4d1b650eec0a0cfd31d8c7fd5ac9040222a042 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Wed, 11 Sep 2019 23:43:07 -0400 Subject: [PATCH 13/29] QRW Next 3 --- .../.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb | 2 +- examples/random_walk_tutorial.ipynb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb index 97a47259926..2e134aa2858 100644 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -13,7 +13,7 @@ "source": [ "**Classical Random Walks**\n", "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium \n", + "A random walks is a random process involving a \"walker\" that is placed in some $n$-dimensional medium \n", "(like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement,\n", "the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is \n", "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index 97a47259926..2e134aa2858 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -13,7 +13,7 @@ "source": [ "**Classical Random Walks**\n", "\n", - "A random walks is a random process, involving a \"walker\" that is placed in some $n$-dimensional medium \n", + "A random walks is a random process involving a \"walker\" that is placed in some $n$-dimensional medium \n", "(like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement,\n", "the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is \n", "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", From ec54c8f643b18c87639060a98efe10578a48fcf1 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Wed, 11 Sep 2019 23:45:49 -0400 Subject: [PATCH 14/29] QRW Next 4 --- .../.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb | 2 +- examples/random_walk_tutorial.ipynb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb index 2e134aa2858..6e954a725f5 100644 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -735,7 +735,7 @@ "\n", "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", "\n", "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", "\n" diff --git a/examples/random_walk_tutorial.ipynb b/examples/random_walk_tutorial.ipynb index 2e134aa2858..6e954a725f5 100644 --- a/examples/random_walk_tutorial.ipynb +++ b/examples/random_walk_tutorial.ipynb @@ -735,7 +735,7 @@ "\n", "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", "\n", "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", "\n" From 5d2261b081d05b3502089f236df386721b6aa565 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Tue, 24 Sep 2019 21:09:16 -0400 Subject: [PATCH 15/29] Added Test --- examples/notebook_tutorials/new_test.py | 57 +++++++++++++++++++ .../random_walk_tutorial.ipynb | 0 2 files changed, 57 insertions(+) create mode 100644 examples/notebook_tutorials/new_test.py rename examples/{ => notebook_tutorials}/random_walk_tutorial.ipynb (100%) diff --git a/examples/notebook_tutorials/new_test.py b/examples/notebook_tutorials/new_test.py new file mode 100644 index 00000000000..232e3676839 --- /dev/null +++ b/examples/notebook_tutorials/new_test.py @@ -0,0 +1,57 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +import pytest + +import nbformat + + +def find_examples_jupyter_notebook_paths(): + examples_folder = os.path.dirname(__file__) + for filename in os.listdir(examples_folder): + if not filename.endswith('.ipynb'): + continue + yield os.path.join(examples_folder, filename) + + +@pytest.mark.parametrize('path', find_examples_jupyter_notebook_paths()) + +def test_can_run_examples_jupyter_notebook(path): + notebook = nbformat.read(path, nbformat.NO_CONVERT) + state = {} # type: Dict[str, Any] + + for cell in notebook.cells: + if cell.cell_type == 'code' and not is_matplotlib_cell(cell): + try: + exec(strip_magics_and_shows(cell.source), state) + # coverage: ignore + except: + print('Failed to run {}.'.format(path)) + raise + + +def is_matplotlib_cell(cell): + return "%matplotlib" in cell.source + + +def strip_magics_and_shows(text): + """Remove Jupyter magics and pyplot show commands.""" + lines = [line for line in text.split('\n') + if not contains_magic_or_show(line)] + return '\n'.join(lines) + +def contains_magic_or_show(line): + return (line.strip().startswith('%') or + 'pyplot.show(' in line or + 'plt.show(' in line) diff --git a/examples/random_walk_tutorial.ipynb b/examples/notebook_tutorials/random_walk_tutorial.ipynb similarity index 100% rename from examples/random_walk_tutorial.ipynb rename to examples/notebook_tutorials/random_walk_tutorial.ipynb From 098518023e0c1a9591f256dfb280a97484ea77bf Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 16 Dec 2019 23:55:07 -0500 Subject: [PATCH 16/29] Changes --- .../random_walk_tutorial-checkpoint.ipynb | 943 ++++++++++++++++++ examples/notebook_tutorials/assets/circ2.png | Bin 0 -> 34563 bytes examples/notebook_tutorials/assets/cycle.png | Bin 0 -> 12396 bytes .../random_walk_tutorial.ipynb | 731 +++++++++----- 4 files changed, 1397 insertions(+), 277 deletions(-) create mode 100644 examples/notebook_tutorials/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb create mode 100644 examples/notebook_tutorials/assets/circ2.png create mode 100644 examples/notebook_tutorials/assets/cycle.png diff --git a/examples/notebook_tutorials/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/notebook_tutorials/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb new file mode 100644 index 00000000000..bec009c674d --- /dev/null +++ b/examples/notebook_tutorials/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb @@ -0,0 +1,943 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum Walks With Cirq - Tutorial" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [], + "source": [ + "import cirq\n", + "import random\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "import scipy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Classical Random Walks**\n", + "\n", + "A random walks is a random process involving a \"walker\" that is placed in some $n$-dimensional medium \n", + "(like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement,\n", + "the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is \n", + "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", + "at each of the integers. Let the initial position vector of our marker be $\\lvert 0\\rangle$. For $N$ steps of our\n", + "random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", + "$1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute\n", + "the value:\n", + "\n", + "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", + "\n", + "Where we know:\n", + "\n", + "\n", + "$$\\lvert \\text{Final}\\rangle \\ = \\ \\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", + "\n", + "\n", + "So for our case, the final position vector is simply $\\lvert j\\rangle$. This model of a random walk can easily \n", + "be generalized to $n$-dimensions. \n", + "\n", + "\n", + "Another important fact to note is that for a discrete, 1-dimensional random \n", + "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", + "a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", + "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", + "that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random \n", + "walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability \n", + "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is \n", + "given by:\n", + "\n", + "\n", + "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position \n", + "$X \\ = \\ R \\ - \\ L$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", + "that for a random walk of $N$ steps, the position of the walker is determined by the number of right steps, \n", + "minus the number of left steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", + "to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ \n", + "by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. \n", + "Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, \n", + "and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ \n", + "steps by calculating the binomial coefficient, therefore getting:\n", + "\n", + "\n", + "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R} \\Rightarrow \\ X \\ = \\ R \\ - \\ L \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ + \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ + \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ - \\ X}{2}}$$\n", + "\n", + "It is important to note that this only holds true for **even numbers** if the total number of steps taken is even, and **odd numbers** if the total number of steps taken is odd. This is due to the fact that if I set the number of steps that my random walk can take to $N$, then as we previously demonstrated, $L \\ + \\ R \\ = \\ N$ and $R \\ - \\ L \\ = \\ X$. Combining these two equations, we get, just like in the equation above:\n", + "\n", + "$$R \\ = \\ \\frac{X \\ + \\ N}{2}$$\n", + "\n", + "But $R$ must be an integer, thus $X \\ + \\ N$. Must be even. It follows that if $N$ is odd, then $X$ must also be odd to make an even number, and if $N$ is even, $X$ must also be even. From this, we come to the conclusion that if we have an even $N$, the probability of being at a position $X$ that is an odd value is $0$, and if $N$ is odd, then the probability of $X$ being even is $0$.\n", + "\n", + "And so we have shown that the probability distribution for the position of the walker for an $N$ step random \n", + "walk is given by a binomial distribution on the domain of the even or the odd numbers. This fact is important, as we will show that the probability distribution that is created when a quantum walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", + "\n", + "If you don't believe me and/or the math, we can visualize this a bit better by coding up a simple program! We will define a one-dimensional random walk, starting at the point $0$ on the integer number line. We will then repeatedly \"flip a coin\", and move left and right down the number line accordingly: " + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The walker is located at: x = 8\n" + ] + } + ], + "source": [ + "# Defines all of the necessary parameters\n", + "\n", + "N = 50 #Defines the total number of steps our walked will take\n", + "pr = 0.5 #Defines the probability of our walking stepping to the right\n", + "i = 0 #Defines the initial position of our walker\n", + "\n", + "def random_walk(pr, N, i):\n", + " \n", + " position = i\n", + " \n", + " # Repeatedly queries our random variable and moves our walker, for the specified number of steps\n", + " \n", + " for j in range(0, N): \n", + " \n", + " coin_flip = list(np.random.choice(2, 1, p=[1-pr, pr])) #Flips our weighted coin\n", + " position += 2*coin_flip[0]-1 #Moves our walker according to the coin flip \n", + " \n", + " return position\n", + " \n", + "print(\"The walker is located at: x = \"+str(random_walk(pr, N, i)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's attempt to generate the probabilitiy distribution corresponding to the walker's position, and make sure that it checks out with our math:" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAQGElEQVR4nO3df6xfdX3H8edrrXROIyhcnaPdbhe6JXWYTGsxcT+MbKyIoy4rW9Fo3VjQxCYuumjRBBnzj7Itdi6yRSIsiC6FsBmbtY4xMVliBusFFVaRecUqZTgLdDhmECvv/fE93b5+d8s9eL+3397PfT6Spud8zufc+/60ua/v+X7O+X5uqgpJUrt+ZNIFSJIWl0EvSY0z6CWpcQa9JDXOoJekxq2cdAGjzjjjjJqenp50GZK0pNx5550PV9XUXMdOuqCfnp5mZmZm0mVI0pKS5OvHO+bUjSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6glxZoesdepnfsnXQZ0nEZ9JLUOINekhpn0EtS4wx6qSfn4rVUGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY076X5nrDRJw0/VHNx5wQQrkcbHK3pJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWpcr6BPsinJfUlmk+yY4/gvJbkrydEkW0aObUvyle7PtnEVLknqZ96gT7ICuBo4H1gPXJxk/Ui3bwBvAf565NwXAO8HzgE2Au9P8vyFly1J6qvPFf1GYLaq7q+qJ4HdwObhDlV1sKruBp4aOffXgFur6tGqOgLcCmwaQ93SSc/fSKWTRZ+gPxN4YGj/UNfWR69zk1yaZCbJzOHDh3t+aUlSHyfFzdiquqaqNlTVhqmpqUmXI0lN6RP0DwJrhvZXd219LORcSdIY9An6/cC6JGuTnAJsBfb0/Pq3AOcleX53E/a8rk2SdILMG/RVdRTYziCg7wVuqqoDSa5MciFAklckOQRcBHwkyYHu3EeBP2LwYrEfuLJrkySdIL1+w1RV7QP2jbRdPrS9n8G0zFznXgdct4AaJUkLcFLcjJUkLR6DXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDWu13P0UmuGV5U8uPOCCVYiLT6v6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1LheQZ9kU5L7kswm2THH8VVJbuyO35Fkumt/VpLrk9yT5N4kl423fEnSfOYN+iQrgKuB84H1wMVJ1o90uwQ4UlVnAbuAq7r2i4BVVXU28HLgrcdeBCRJJ0afK/qNwGxV3V9VTwK7gc0jfTYD13fbNwPnJglQwHOSrASeDTwJfHsslUuSeukT9GcCDwztH+ra5uxTVUeBx4DTGYT+fwMPAd8A/rSqHh39BkkuTTKTZObw4cPPeBCSpONb7JuxG4HvAz8BrAXeleSnRztV1TVVtaGqNkxNTS1ySZK0vPQJ+geBNUP7q7u2Oft00zSnAo8AbwD+vqq+V1XfAj4HbFho0dJSNr1jL9M79k66DC0jfYJ+P7AuydokpwBbgT0jffYA27rtLcBtVVUMpmteA5DkOcArgS+Po3BJUj/zBn03574duAW4F7ipqg4kuTLJhV23a4HTk8wC7wSOPYJ5NfDcJAcYvGD8VVXdPe5BSJKOb2WfTlW1D9g30nb50PYTDB6lHD3v8bnaJUknTq+gl5aq4bnwgzsvmGAl0uS4BIIkNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1LiVfTol2QR8CFgBfLSqdo4cXwV8DHg58Ajw21V1sDv2UuAjwPOAp4BXVNUT4xqABDC9Y+//bh/cecEEK5FOPvNe0SdZAVwNnA+sBy5Osn6k2yXAkao6C9gFXNWduxL4OPC2qnoJ8Grge2OrXpI0rz5TNxuB2aq6v6qeBHYDm0f6bAau77ZvBs5NEuA84O6q+iJAVT1SVd8fT+mSpD76BP2ZwAND+4e6tjn7VNVR4DHgdOBngEpyS5K7krx7rm+Q5NIkM0lmDh8+/EzHIEl6Got9M3Yl8AvAG7u/fyPJuaOdquqaqtpQVRumpqYWuSRJWl76BP2DwJqh/dVd25x9unn5UxnclD0E/FNVPVxV3wH2AS9baNGSpP76BP1+YF2StUlOAbYCe0b67AG2ddtbgNuqqoBbgLOT/Fj3AvDLwJfGU7okqY95H6+sqqNJtjMI7RXAdVV1IMmVwExV7QGuBW5IMgs8yuDFgKo6kuSDDF4sCthXVXvn/EaSpEXR6zn6qtrHYNpluO3yoe0ngIuOc+7HGTxiKelpHPssgJ8D0Lj5yVhJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXG9gj7JpiT3JZlNsmOO46uS3NgdvyPJ9Mjxn0zyeJI/GE/ZkqS+5g36JCuAq4HzgfXAxUnWj3S7BDhSVWcBu4CrRo5/EPj0wsuVJD1Tfa7oNwKzVXV/VT0J7AY2j/TZDFzfbd8MnJskAEleD3wNODCekqXlZXrHXqZ37J10GVrC+gT9mcADQ/uHurY5+1TVUeAx4PQkzwXeA/zh032DJJcmmUkyc/jw4b61S5J6WOybsVcAu6rq8afrVFXXVNWGqtowNTW1yCVJ0vKyskefB4E1Q/uru7a5+hxKshI4FXgEOAfYkuSPgdOAp5I8UVUfXnDlkqRe+gT9fmBdkrUMAn0r8IaRPnuAbcA/A1uA26qqgF881iHJFcDjhrwknVjzBn1VHU2yHbgFWAFcV1UHklwJzFTVHuBa4IYks8CjDF4MJEkngT5X9FTVPmDfSNvlQ9tPABfN8zWu+CHqkyQtkJ+MlaTG9bqil04Ww8+TH9x5wQQrkZYOr+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxfjJWJyU/ASuNj1f0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvbRETe/Y+wOPoUrHY9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjegV9kk1J7ksym2THHMdXJbmxO35Hkumu/VeT3Jnknu7v14y3fEnSfOYN+iQrgKuB84H1wMVJ1o90uwQ4UlVnAbuAq7r2h4Ffr6qzgW3ADeMqXJLUT58r+o3AbFXdX1VPAruBzSN9NgPXd9s3A+cmSVV9vqr+vWs/ADw7yapxFC5J6qdP0J8JPDC0f6hrm7NPVR0FHgNOH+nzm8BdVfXd0W+Q5NIkM0lmDh8+3Ld2SVIPJ+RmbJKXMJjOeetcx6vqmqraUFUbpqamTkRJkrRs9An6B4E1Q/uru7Y5+yRZCZwKPNLtrwY+Cby5qr660IIlSc9Mn6DfD6xLsjbJKcBWYM9Inz0MbrYCbAFuq6pKchqwF9hRVZ8bV9GSpP7mDfpuzn07cAtwL3BTVR1IcmWSC7tu1wKnJ5kF3gkcewRzO3AWcHmSL3R/Xjj2UUiSjmtln05VtQ/YN9J2+dD2E8BFc5z3AeADC6xRkrQAfjJWkhpn0EtS43pN3UiLZfiXWx/cecEEK2nHsX9T/z11jFf0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS41zrRieEa9pIk+MVvSQ1zqCXlonpHXt/4J2Vlg+DXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOD0xprPxg1NLjLxNvn1f0ktQ4g16SGmfQS1LjnKPXD8W5+PY5d9+OXlf0STYluS/JbJIdcxxfleTG7vgdSaaHjl3Wtd+X5NfGV7pOhGPro7hGirR0zRv0SVYAVwPnA+uBi5OsH+l2CXCkqs4CdgFXdeeuB7YCLwE2AX/RfT1JS5Qv/EtPnyv6jcBsVd1fVU8Cu4HNI302A9d32zcD5yZJ1767qr5bVV8DZruvpwk53g+pP7xSu1JVT98h2QJsqqrf6/bfBJxTVduH+vxr1+dQt/9V4BzgCuD2qvp4134t8Omqunnke1wKXNrt/ixw38KHNhFnAA9PuogTaLmNF5bfmJfbeGHpjvmnqmpqrgMnxc3YqroGuGbSdSxUkpmq2jDpOk6U5TZeWH5jXm7jhTbH3Gfq5kFgzdD+6q5tzj5JVgKnAo/0PFeStIj6BP1+YF2StUlOYXBzdc9Inz3Atm57C3BbDeaE9gBbu6dy1gLrgH8ZT+mSpD7mnbqpqqNJtgO3ACuA66rqQJIrgZmq2gNcC9yQZBZ4lMGLAV2/m4AvAUeBt1fV9xdpLCeDJT/99Awtt/HC8hvzchsvNDjmeW/GSpKWNpdAkKTGGfSS1DiDfoySvCtJJTmj20+SP++WgLg7ycsmXeM4JPmTJF/uxvTJJKcNHWtyyYv5lgFpQZI1ST6b5EtJDiR5R9f+giS3JvlK9/fzJ13rOCVZkeTzSf6u21/bLeUy2y3tcsqka1wog35MkqwBzgO+MdR8PoMnjdYx+EDYX06gtMVwK/BzVfVS4N+Ay6DdJS96LgPSgqPAu6pqPfBK4O3dOHcAn6mqdcBnuv2WvAO4d2j/KmBXt6TLEQZLvCxpBv347ALeDQzf3d4MfKwGbgdOS/LiiVQ3RlX1D1V1tNu9ncHnI6DdJS/6LAOy5FXVQ1V1V7f9XwzC70x+cImT64HXT6bC8UuyGrgA+Gi3H+A1DJZygUbGa9CPQZLNwINV9cWRQ2cCDwztH+raWvK7wKe77VbH2+q4jqtbgfbngTuAF1XVQ92hbwIvmlBZi+HPGFygPdXtnw7859CFTBP/1yfFEghLQZJ/BH58jkPvA97LYNqmGU833qr6VNfnfQze7n/iRNamxZXkucDfAL9fVd8eXOQOVFUlaeKZ7CSvA75VVXcmefWk61lMBn1PVfUrc7UnORtYC3yx+4FYDdyVZCNLeAmI4433mCRvAV4HnFv/92GMJTveebQ6rv8nybMYhPwnqupvu+b/SPLiqnqom3r81uQqHKtXARcmeS3wo8DzgA8xmGJd2V3VN/F/7dTNAlXVPVX1wqqarqppBm/1XlZV32SwBMSbu6dvXgk8NvQWeMlKsonB290Lq+o7Q4daXfKizzIgS143P30tcG9VfXDo0PASJ9uAT53o2hZDVV1WVau7n9utDJZueSPwWQZLuUAj4/WKfnHtA17L4Kbkd4DfmWw5Y/NhYBVwa/cu5vaqelurS14cbxmQCZe1GF4FvAm4J8kXurb3AjuBm5JcAnwd+K0J1XeivAfYneQDwOcZvPgtaS6BIEmNc+pGkhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TG/Q+ngouJPKIM8AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def dist(runs, N):\n", + " \n", + " positions = range(-1*N, N+1)\n", + " instances = [0 for i in range(-1*N, N+1)]\n", + " \n", + " for k in range(0, runs):\n", + "\n", + " result = random_walk(pr, N, i)\n", + " instances[positions.index(result)] += 1\n", + "\n", + " plt.bar(positions, [n/runs for n in instances])\n", + " plt.show()\n", + " \n", + "dist(10000, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks pretty binomial to me (which is exactly what the math predicts)! We can now plot the distribution predicted in the math, and see if the two are the same:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def height_calculate(x, N, pr):\n", + " \n", + " a = (N + x)/2\n", + " b = (N - x)/2\n", + " \n", + " if (x%2 == 0):\n", + " var = scipy.special.binom(N, a)*(pr**a)*((1-pr)**b)\n", + " else:\n", + " var = 0\n", + " return var\n", + "\n", + "heights = [height_calculate(x, N, pr) for x in positions]\n", + "plt.bar(positions, heights)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, the distributions looks very similar, with the midpoint having a probability of a little bit over $0.1$ in both graphs. Note that as we increase the `runs` variable, our simulated distribution will resemble our theoretical distribution more and more, as one would expect:" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD4CAYAAADlwTGnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAUBklEQVR4nO3df6zd9X3f8eerduxWmkgCvumY7fS6wm3nhoo0xkGKgjZYUtNkGKkmMUL8aFm9qLXUKW2XS6PSyaNS0KSxRWNZ3EJCEqhBpBFXsyOXlqR/bIP5QgjGMDcXh4IdujhASDQaqMt7f5yv08PJte+59v1h38/zIR35+/38+N7PR4j7ut/P95zPSVUhSWrPjy30ACRJC8MAkKRGGQCS1CgDQJIaZQBIUqOWLvQAZmLFihU1Ojq60MOQpDPKI4888p2qGhksP6MCYHR0lImJiYUehiSdUZL89VTlLgFJUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRhkAktQoA0CSGmUASFKjDADpFI2O7WJ0bNdCD0OaMQNAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0aKgCSbExyIMlkkrEp6i9O8miSo0k295X/8ySP9b1+kOSKru6zSb7ZV3fB7E1LkjSdpdM1SLIEuA14H3AI2JtkvKqe7Gv2LHA98Dv9favqK8AF3XXOBiaBP+tr8rtVdd+pTECSdHKmDQBgAzBZVQcBkuwENgE/DICqeqare/0E19kMfLmqXjnp0UqSZs0wS0Argef6zg91ZTO1BfiTgbI/TPJ4kluTLJ+qU5KtSSaSTBw5cuQkfqwkaSrz8hA4ybnA+cCevuIbgZ8DLgTOBj42Vd+q2lFV66tq/cjIyJyPVZJaMUwAHAZW952v6spm4kPAl6rq744VVNXz1fMq8Bl6S02SpHkyTADsBdYmWZNkGb2lnPEZ/pyrGFj+6e4KSBLgCuCJGV5TknQKpg2AqjoKbKO3fPMUcG9V7U+yPcnlAEkuTHIIuBL4dJL9x/onGaV3B/GXA5e+K8k+YB+wArj51KcjSRrWMO8Coqp2A7sHym7qO95Lb2loqr7PMMVD46q6ZCYDlSTNLj8JLEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUUMFQJKNSQ4kmUwyNkX9xUkeTXI0yeaBur9P8lj3Gu8rX5Pk4e6a93RfOC9JmifTBkCSJcBtwGXAOuCqJOsGmj0LXA/cPcUl/raqLuhel/eV3wLcWlXnAS8BN5zE+CVJJ2mYO4ANwGRVHayq14CdwKb+BlX1TFU9Drw+zA9NEuAS4L6u6E7giqFHLUk6ZcMEwErgub7zQ13ZsH48yUSSh5Ic+yV/DvDdqjo63TWTbO36Txw5cmQGP1aSdCJL5+Fn/FRVHU7y08CDSfYBLw/buap2ADsA1q9fX3M0RklqzjB3AIeB1X3nq7qyoVTV4e7fg8BXgXcCLwBvSXIsgGZ0TUnSqRsmAPYCa7t37SwDtgDj0/QBIMlbkyzvjlcA7wGerKoCvgIce8fQdcD9Mx28JOnkTRsA3Tr9NmAP8BRwb1XtT7I9yeUASS5Mcgi4Evh0kv1d938KTCT5Or1f+J+oqie7uo8BH00ySe+ZwO2zOTFJ0okN9QygqnYDuwfKbuo73ktvGWew3/8Ezj/ONQ/Se4eRJGkB+ElgSWqUASBJjTIAJKlRBoAkNcoAkKRGGQBa9EbHdjE6tmuhhyGddgwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDVqqABIsjHJgSSTScamqL84yaNJjibZ3Fd+QZL/lWR/kseTfLiv7rNJvpnkse51wexMSZI0jGm/EzjJEuA24H3AIWBvkvG+L3cHeBa4Hvidge6vANdW1TeS/BPgkSR7quq7Xf3vVtV9pzoJSdLMDfOl8BuAye5L3EmyE9gE/DAAquqZru71/o5V9Vd9x99K8m1gBPgukqQFNcwS0Ergub7zQ13ZjCTZACwDnu4r/sNuaejWJMtnek1J0smbl4fASc4FPg/8alUdu0u4Efg54ELgbOBjx+m7NclEkokjR47Mx3AlqQnDBMBhYHXf+aqubChJzgJ2AR+vqoeOlVfV89XzKvAZektNP6KqdlTV+qpaPzIyMuyPlSRNY5gA2AusTbImyTJgCzA+zMW79l8CPjf4sLe7KyBJgCuAJ2YycEnSqZk2AKrqKLAN2AM8BdxbVfuTbE9yOUCSC5McAq4EPp1kf9f9Q8DFwPVTvN3zriT7gH3ACuDmWZ2ZJOmEhnkXEFW1G9g9UHZT3/FeektDg/2+AHzhONe8ZEYjlSTNKj8JLEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNWqovYAkzb3RsV0/PH7mEx9YwJGoFd4BSFKjDABJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUqKECIMnGJAeSTCYZm6L+4iSPJjmaZPNA3XVJvtG9rusrf1eSfd01P5kkpz4dSdKwpg2AJEuA24DLgHXAVUnWDTR7FrgeuHug79nAHwDvBjYAf5DkrV31p4BfB9Z2r40nPQtJ0owNcwewAZisqoNV9RqwE9jU36Cqnqmqx4HXB/r+EvBAVb1YVS8BDwAbk5wLnFVVD1VVAZ8DrjjVyUiShjfMVhArgef6zg/R+4t+GFP1Xdm9Dk1R/iOSbAW2Arz97W8f8sdKJ+/YlgxztR2DWz7odHHaPwSuqh1Vtb6q1o+MjCz0cCRp0RgmAA4Dq/vOV3Vlwzhe38Pd8clcU5I0C4YJgL3A2iRrkiwDtgDjQ15/D/D+JG/tHv6+H9hTVc8D30tyUffun2uB+09i/JKkkzRtAFTVUWAbvV/mTwH3VtX+JNuTXA6Q5MIkh4ArgU8n2d/1fRH49/RCZC+wvSsD+A3gj4FJ4Gngy7M6M0nSCQ31fQBVtRvYPVB2U9/xXt64pNPf7g7gjinKJ4B3zGSwkqTZc9o/BJYkzQ0DQJIaZQBIUqMMAElqlAEgSY0yAKQhjY7tesM2DtKZzgCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqOGCoAkG5McSDKZZGyK+uVJ7unqH04y2pVfneSxvtfrSS7o6r7aXfNY3dtmc2KSpBObNgCSLAFuAy4D1gFXJVk30OwG4KWqOg+4FbgFoKruqqoLquoC4Brgm1X1WF+/q4/VV9W3Z2E+kqQhDXMHsAGYrKqDVfUasBPYNNBmE3Bnd3wfcGmSDLS5qusrSToNDBMAK4Hn+s4PdWVTtqmqo8DLwDkDbT4M/MlA2We65Z/fnyIwAEiyNclEkokjR44MMVxJ0jDm5SFwkncDr1TVE33FV1fV+cB7u9c1U/Wtqh1Vtb6q1o+MjMzDaCWpDcMEwGFgdd/5qq5syjZJlgJvBl7oq9/CwF//VXW4+/f7wN30lpokSfNkmADYC6xNsibJMnq/zMcH2owD13XHm4EHq6oAkvwY8CH61v+TLE2yojt+E/BB4AkkSfNm6XQNqupokm3AHmAJcEdV7U+yHZioqnHgduDzSSaBF+mFxDEXA89V1cG+suXAnu6X/xLgz4E/mpUZSZKGMm0AAFTVbmD3QNlNfcc/AK48Tt+vAhcNlP0/4F0zHKskaRb5SWA1a3RsF6NjuxZ6GNKCMQAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNcoAkKRGGQCS1CgDQJIaZQBIUqMMAElqlAEgSY0yACSpUUMFQJKNSQ4kmUwyNkX98iT3dPUPJxntykeT/G2Sx7rXf+vr864k+7o+n0yS2ZqUJGl60wZAkiXAbcBlwDrgqiTrBprdALxUVecBtwK39NU9XVUXdK+P9JV/Cvh1YG332njy05AkzdQwdwAbgMmqOlhVrwE7gU0DbTYBd3bH9wGXnugv+iTnAmdV1UNVVcDngCtmPHpJ0kkbJgBWAs/1nR/qyqZsU1VHgZeBc7q6NUm+luQvk7y3r/2haa4JQJKtSSaSTBw5cmSI4UqnB790Xqe7uX4I/Dzw9qp6J/BR4O4kZ83kAlW1o6rWV9X6kZGRORmkJLVomAA4DKzuO1/VlU3ZJslS4M3AC1X1alW9AFBVjwBPAz/TtV81zTUlSXNomADYC6xNsibJMmALMD7QZhy4rjveDDxYVZVkpHuITJKfpvew92BVPQ98L8lF3bOCa4H7Z2E+kqQhLZ2uQVUdTbIN2AMsAe6oqv1JtgMTVTUO3A58Pskk8CK9kAC4GNie5O+A14GPVNWLXd1vAJ8FfgL4cveSJM2TaQMAoKp2A7sHym7qO/4BcOUU/b4IfPE415wA3jGTwUqSZo+fBJakRhkAktQoA0CSGmUASFKjDABJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjTIAJKlRBoAkNWqoL4SRFsLo2C4AnvnEB+ak/Zni2Lxg8c1NC8s7AElq1FABkGRjkgNJJpOMTVG/PMk9Xf3DSUa78vcleSTJvu7fS/r6fLW75mPd622zNSlJ0vSmXQJKsgS4DXgfcAjYm2S8qp7sa3YD8FJVnZdkC3AL8GHgO8C/rKpvJXkHvS+WX9nX7+ruu4ElSfNsmDuADcBkVR2sqteAncCmgTabgDu74/uAS5Okqr5WVd/qyvcDP5Fk+WwMXJJ0aoYJgJXAc33nh3jjX/FvaFNVR4GXgXMG2vwK8GhVvdpX9plu+ef3k2RGI5cknZJ5eQic5OfpLQv9677iq6vqfOC93eua4/TdmmQiycSRI0fmfrCS1IhhAuAwsLrvfFVXNmWbJEuBNwMvdOergC8B11bV08c6VNXh7t/vA3fTW2r6EVW1o6rWV9X6kZGRYeYkSRrCMAGwF1ibZE2SZcAWYHygzThwXXe8GXiwqirJW4BdwFhV/Y9jjZMsTbKiO34T8EHgiVObiiRpJqYNgG5Nfxu9d/A8BdxbVfuTbE9yedfsduCcJJPAR4FjbxXdBpwH3DTwds/lwJ4kjwOP0buD+KPZnJgk6cSG+iRwVe0Gdg+U3dR3/APgyin63QzcfJzLvmv4YUqSZptbQUhnKLeI0KlyKwhJapQBIEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSowwASWqUASBJjXIrCM26Y1sUzNX2BHN9/TPd8baIcOsIDfIOQJIaZQBIUqMMAElqlAEgSY0yACSpUQaAJDXKAJCkRg0VAEk2JjmQZDLJ2BT1y5Pc09U/nGS0r+7GrvxAkl8a9pqSpLk1bQAkWQLcBlwGrAOuSrJuoNkNwEtVdR5wK3BL13cdsAX4eWAj8F+TLBnympKkOTTMHcAGYLKqDlbVa8BOYNNAm03And3xfcClSdKV76yqV6vqm8Bkd71hrilJmkOpqhM3SDYDG6vqX3Xn1wDvrqptfW2e6Noc6s6fBt4N/Dvgoar6Qld+O/DlrtsJr9l37a3A1u70Z4EDJzfVBbUC+M5CD2KetTbn1uYL7c35TJ7vT1XVyGDhab8XUFXtAHYs9DhORZKJqlq/0OOYT63NubX5QntzXozzHWYJ6DCwuu98VVc2ZZskS4E3Ay+coO8w15QkzaFhAmAvsDbJmiTL6D3UHR9oMw5c1x1vBh6s3trSOLCle5fQGmAt8L+HvKYkaQ5NuwRUVUeTbAP2AEuAO6pqf5LtwERVjQO3A59PMgm8SO8XOl27e4EngaPAb1bV3wNMdc3Zn95p44xewjpJrc25tflCe3NedPOd9iGwJGlx8pPAktQoA0CSGmUAzIMkv52kkqzozpPkk902GI8n+cWFHuNsSPIfkvyfbk5fSvKWvroptwRZDBb7tiZJVif5SpInk+xP8ltd+dlJHkjyje7fty70WGdTt2vB15L89+58TbfVzWS39c2yhR7jqTIA5liS1cD7gWf7ii+j946otfQ+5PapBRjaXHgAeEdV/QLwV8CNcPwtQRZslLOokW1NjgK/XVXrgIuA3+zmOAb8RVWtBf6iO19Mfgt4qu/8FuDWbsubl+htgXNGMwDm3q3AvwX6n7ZvAj5XPQ8Bb0ly7oKMbhZV1Z9V1dHu9CF6n++A428Jshgs+m1Nqur5qnq0O/4+vV+KK3njFjB3AlcszAhnX5JVwAeAP+7OA1xCb6sbWCTzNQDmUJJNwOGq+vpA1Urgub7zQ13ZYvJr/MO2H4t5vot5bj+i2+n3ncDDwE9W1fNd1d8AP7lAw5oL/4neH26vd+fnAN/t+wNnUfx3Pu23gjjdJflz4B9PUfVx4PfoLf8sGieab1Xd37X5OL1lg7vmc2yaW0n+EfBF4N9U1fd6fxT3VFUlWRTvKU/yQeDbVfVIkn+20OOZSwbAKaqqfzFVeZLzgTXA17v/UVYBjybZwBm8Fcbx5ntMkuuBDwKX1j98yOSMne8QFvPcfijJm+j98r+rqv60K/6/Sc6tque7JcxvL9wIZ9V7gMuT/DLw48BZwH+mt1S7tLsLWBT/nV0CmiNVta+q3lZVo1U1Su+W8Rer6m/obXtxbfduoIuAl/tupc9YSTbSu22+vKpe6as63pYgi8Gi39akW/++HXiqqv5jX1X/FjDXAffP99jmQlXdWFWruv9vt9Db2uZq4Cv0trqBRTJf7wAWxm7gl+k9DH0F+NWFHc6s+S/AcuCB7q7noar6yIm2BDnTHW+rlAUe1mx7D3ANsC/JY13Z7wGfAO5NcgPw18CHFmh88+VjwM4kNwNfoxeKZzS3gpCkRrkEJEmNMgAkqVEGgCQ1ygCQpEYZAJLUKANAkhplAEhSo/4/lrkt7BqP/ycAAAAASUVORK5CYII=\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAARD0lEQVR4nO3df6xfdX3H8edrraDTCApX52i324VuSRnGuVpM3JyRDYs46rLiikbBsaCJTVx00Ysm6Jh/yLaIW8YWyWBB0BTCZmzWOsbEZIkR1gsqrGD1ighFHJcf4hxBrLz3x/fgvnx3yz31fm9v7+c+H8lNz/l8Pud73582fX3PPed8PzdVhSSpXT+z1AVIkhaXQS9JjTPoJalxBr0kNc6gl6TGrV7qAkYdf/zxNTk5udRlSNKycssttzxYVRNz9R1xQT85Ocn09PRSlyFJy0qSbx+sz0s3ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUuF5Bn2Rzkn1JZpJMzdH/6iS3JjmQZOtQ+8uSfCnJ3iS3JfmDcRYvHQkmp3YxObVrqcuQDmreoE+yCrgUOB3YAJydZMPIsHuAc4FPj7Q/Brytqk4CNgMfT3LsQouWJPXXZ62bTcBMVd0FkGQHsAW446kBVXV31/fk8IFV9fWh7e8keQCYAL634MolSb30uXRzAnDv0P7+ru2QJNkEHAV8c46+85NMJ5menZ091JeWJD2Dw3IzNslLgKuAt1fVk6P9VXVZVW2sqo0TE3OusilJ+in1Cfr7gLVD+2u6tl6SPB/YBXywqm46tPIkSQvVJ+j3AOuTrEtyFLAN2NnnxbvxnwE+WVXX/fRlSpJ+WvMGfVUdALYD1wN3AtdW1d4kFyU5EyDJK5LsB84CPpFkb3f4m4BXA+cm+Ur39bJFmYkkaU69fsNUVe0Gdo+0XTi0vYfBJZ3R464Grl5gjZKkBfCTsZLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeq1Y/q5XrRQGvSQ1zqCXpMYZ9FJPXurRcmXQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWpcr6BPsjnJviQzSabm6H91kluTHEiydaTvnCTf6L7OGVfhkqR+5g36JKuAS4HTgQ3A2Uk2jAy7BzgX+PTIsS8EPgScAmwCPpTkBQsvW5LUV58z+k3ATFXdVVVPADuALcMDquruqroNeHLk2NcBN1TVw1X1CHADsHkMdUuSeuoT9CcA9w7t7+/a+uh1bJLzk0wnmZ6dne350pKkPo6Im7FVdVlVbayqjRMTE0tdjiQ1pU/Q3wesHdpf07X1sZBjJUlj0Cfo9wDrk6xLchSwDdjZ8/WvB05L8oLuJuxpXZt0xPIXjKg18wZ9VR0AtjMI6DuBa6tqb5KLkpwJkOQVSfYDZwGfSLK3O/Zh4M8YvFnsAS7q2iRJh8nqPoOqajewe6TtwqHtPQwuy8x17BXAFQuoUZK0AEfEzVhJ0uIx6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfTSIpmc2sXk1K6lLkMy6CWpdQa9JDXOoJekxhn0ktS4XkGfZHOSfUlmkkzN0X90kmu6/puTTHbtz0pyZZLbk9yZ5ILxli8tP96k1eE2b9AnWQVcCpwObADOTrJhZNh5wCNVdSJwCXBx134WcHRVnQz8OvCOp94EJEmHR58z+k3ATFXdVVVPADuALSNjtgBXdtvXAacmCVDAc5OsBp4DPAF8fyyVS5J66RP0JwD3Du3v79rmHFNVB4BHgeMYhP7/APcD9wB/WVUPj36DJOcnmU4yPTs7e8iTkCQd3GLfjN0E/Bj4eWAd8N4kvzQ6qKouq6qNVbVxYmJikUuSpJWlT9DfB6wd2l/Ttc05prtMcwzwEPBm4F+q6kdV9QDwRWDjQouWJPXXJ+j3AOuTrEtyFLAN2DkyZidwTre9FbixqorB5ZrXAiR5LvBK4GvjKFyS1M+8Qd9dc98OXA/cCVxbVXuTXJTkzG7Y5cBxSWaA9wBPPYJ5KfC8JHsZvGH8Q1XdNu5JSJIObnWfQVW1G9g90nbh0PbjDB6lHD3uB3O1S5IOHz8ZK0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktS41UtdgDQOk1O7frJ990fPWMJKpCOPZ/SS1DiDXpIaZ9BLUuN6BX2SzUn2JZlJMjVH/9FJrun6b04yOdT30iRfSrI3ye1Jnj2+8qV2TE7tetq9Bmlc5g36JKuAS4HTgQ3A2Uk2jAw7D3ikqk4ELgEu7o5dDVwNvLOqTgJeA/xobNVLPRigWun6nNFvAmaq6q6qegLYAWwZGbMFuLLbvg44NUmA04DbquqrAFX1UFX9eDylS5L66BP0JwD3Du3v79rmHFNVB4BHgeOAXwYqyfVJbk3yvrm+QZLzk0wnmZ6dnT3UOUiSnsFi34xdDfwG8Jbuz99LcurooKq6rKo2VtXGiYmJRS5JklaWPkF/H7B2aH9N1zbnmO66/DHAQwzO/v+9qh6sqseA3cDLF1q0JKm/PkG/B1ifZF2So4BtwM6RMTuBc7rtrcCNVVXA9cDJSX62ewP4LeCO8ZQuSepj3iUQqupAku0MQnsVcEVV7U1yETBdVTuBy4GrkswADzN4M6CqHknyMQZvFgXsrioff5Ckw6jXWjdVtZvBZZfhtguHth8HzjrIsVczeMRSkrQE/GSsJDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuNWL3UB0qGYnNr1k+27P3rGElYiLR+e0UtS4wx6SWqcQS9JjesV9Ek2J9mXZCbJ1Bz9Rye5puu/OcnkSP8vJPlBkj8ZT9mSpL7mDfokq4BLgdOBDcDZSTaMDDsPeKSqTgQuAS4e6f8Y8LmFlytJOlR9zug3ATNVdVdVPQHsALaMjNkCXNltXwecmiQASd4IfAvYO56SJUmHok/QnwDcO7S/v2ubc0xVHQAeBY5L8jzg/cCfPtM3SHJ+kukk07Ozs31rlyT1sNg3Yz8MXFJVP3imQVV1WVVtrKqNExMTi1ySJK0sfT4wdR+wdmh/Tdc215j9SVYDxwAPAacAW5P8OXAs8GSSx6vqbxZcuSSplz5BvwdYn2Qdg0DfBrx5ZMxO4BzgS8BW4MaqKuA3nxqQ5MPADwx5STq85g36qjqQZDtwPbAKuKKq9ia5CJiuqp3A5cBVSWaAhxm8GUiSjgC91rqpqt3A7pG2C4e2HwfOmuc1PvxT1CdJWiA/GStJjXP1Sh2RXKVSGh/P6KVlanJq19PeEKWDMeglqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx66QjnY5RaKINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxvUK+iSbk+xLMpNkao7+o5Nc0/XfnGSya/+dJLckub3787XjLV+SNJ95gz7JKuBS4HRgA3B2kg0jw84DHqmqE4FLgIu79geB362qk4FzgKvGVbgkqZ8+Z/SbgJmququqngB2AFtGxmwBruy2rwNOTZKq+nJVfadr3ws8J8nR4yhcktRPn6A/Abh3aH9/1zbnmKo6ADwKHDcy5veBW6vqh6PfIMn5SaaTTM/OzvatXZLUw2G5GZvkJAaXc94xV39VXVZVG6tq48TExOEoSZJWjNU9xtwHrB3aX9O1zTVmf5LVwDHAQwBJ1gCfAd5WVd9ccMVqyvAvvb77o2csYSVSu/qc0e8B1idZl+QoYBuwc2TMTgY3WwG2AjdWVSU5FtgFTFXVF8dVtCSpv3mDvrvmvh24HrgTuLaq9ia5KMmZ3bDLgeOSzADvAZ56BHM7cCJwYZKvdF8vGvssJEkH1efSDVW1G9g90nbh0PbjwFlzHPcR4CMLrFGStAB+MlaSGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS+tEJNTu562LLRWDoNekhrXa/VKaaH8BSOHz1N/1/496yme0UtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1Difo9dY+bz88uNz9+3zjF6SGmfQS1LjvHSjZ3SwSzFeommfl3Ta0euMPsnmJPuSzCSZmqP/6CTXdP03J5kc6ruga9+X5HXjK12S1Me8QZ9kFXApcDqwATg7yYaRYecBj1TVicAlwMXdsRuAbcBJwGbgb7vXk7RMudzx8tPnjH4TMFNVd1XVE8AOYMvImC3Ald32dcCpSdK176iqH1bVt4CZ7vUkSYdJquqZByRbgc1V9Ufd/luBU6pq+9CY/+zG7O/2vwmcAnwYuKmqru7aLwc+V1XXjXyP84Hzu91fAfYtfGpL4njgwaUu4jBaafOFlTfnlTZfWL5z/sWqmpir44i4GVtVlwGXLXUdC5Vkuqo2LnUdh8tKmy+svDmvtPlCm3Puc+nmPmDt0P6arm3OMUlWA8cAD/U8VpK0iPoE/R5gfZJ1SY5icHN158iYncA53fZW4MYaXBPaCWzrnspZB6wH/mM8pUuS+pj30k1VHUiyHbgeWAVcUVV7k1wETFfVTuBy4KokM8DDDN4M6MZdC9wBHADeVVU/XqS5HAmW/eWnQ7TS5gsrb84rbb7Q4JznvRkrSVreXAJBkhpn0EtS4wz6MUry3iSV5PhuP0n+ulsC4rYkL1/qGschyV8k+Vo3p88kOXaor8klL+ZbBqQFSdYm+UKSO5LsTfLurv2FSW5I8o3uzxcsda3jlGRVki8n+eduf123lMtMt7TLUUtd40IZ9GOSZC1wGnDPUPPpDJ40Ws/gA2F/twSlLYYbgF+tqpcCXwcugHaXvOi5DEgLDgDvraoNwCuBd3XznAI+X1Xrgc93+y15N3Dn0P7FwCXdki6PMFjiZVkz6MfnEuB9wPDd7S3AJ2vgJuDYJC9ZkurGqKr+taoOdLs3Mfh8BLS75EWfZUCWvaq6v6pu7bb/m0H4ncDTlzi5Enjj0lQ4fknWAGcAf9/tB3gtg6VcoJH5GvRjkGQLcF9VfXWk6wTg3qH9/V1bS/4Q+Fy33ep8W53XQXUr0P4acDPw4qq6v+v6LvDiJSprMXycwQnak93+ccD3hk5kmvi3PiKWQFgOkvwb8HNzdH0Q+ACDyzbNeKb5VtVnuzEfZPDj/qcOZ21aXEmeB/wj8MdV9f3BSe5AVVWSJp7JTvIG4IGquiXJa5a6nsVk0PdUVb89V3uSk4F1wFe7/xBrgFuTbGIZLwFxsPk+Jcm5wBuAU+v/PoyxbOc7j1bn9f8keRaDkP9UVf1T1/xfSV5SVfd3lx4fWLoKx+pVwJlJXg88G3g+8FcMLrGu7s7qm/i39tLNAlXV7VX1oqqarKpJBj/qvbyqvstgCYi3dU/fvBJ4dOhH4GUryWYGP+6eWVWPDXW1uuRFn2VAlr3u+vTlwJ1V9bGhruElTs4BPnu4a1sMVXVBVa3p/t9uY7B0y1uALzBYygUama9n9ItrN/B6BjclHwPevrTljM3fAEcDN3Q/xdxUVe9sdcmLgy0DssRlLYZXAW8Fbk/yla7tA8BHgWuTnAd8G3jTEtV3uLwf2JHkI8CXGbz5LWsugSBJjfPSjSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjftfrBTn9b1eZrsAAAAASUVORK5CYII=\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "dist(50, N)\n", + "dist(100, N)\n", + "dist(500, N)\n", + "dist(1000, N)\n", + "dist(5000, N)\n", + "dist(10000, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Quantum Walks**\n", + "\n", + "\n", + "The process of the quantum walk isn't that much different from its classical counterpart, although \n", + "the observed results of the two processes have many differences. First, let us motivate the creation of a \n", + "QW. The idea is that when one performs analysis on a classical random walk, you can find that \n", + "$\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, \n", + "and $T$ is the number of time-steps of the random walk. For the quantum walk, we can see that \n", + "$\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. \n", + "At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the \n", + "classical one, showing that the process of a QW is quadratically faster than its classical counterpart.\n", + "\n", + "\n", + "In order to create a quantum walk, we have to translate the components of the classical random walk \n", + "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", + "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a \n", + "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", + "looks something like this:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Going back to our original idea of some position vector $\\lvert j\\rangle$, it is apparent that in order to \n", + "encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector \n", + "to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "$H_W$ spanned by the following set:\n", + "\n", + "\n", + "$$H_W \\ = \\ \\{\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "\n", + "\n", + "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode \n", + "the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space \n", + "is spanned by the two basis states, representing forward and backward progression on our number-line-like \n", + "graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent \n", + "clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, \n", + "and we can again define our spanning set:\n", + "\n", + "\n", + "$$H_C \\ = \\ \\{\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "\n", + "\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents \n", + "clock-wise motion. Now that we have defined all of the vectors we need to encode the information about \n", + "our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is \n", + "again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations \n", + "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given \n", + "by the binary representation of $j$ corresponding to the basis vector $\\lvert j\\rangle$. For the coin vector, \n", + "since we have only two states, we only need one qubit to encode the two possible states:\n", + "\n", + "\n", + "$$\\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\lvert 1\\rangle \\ = \\ \\lvert \\downarrow\\rangle$$\n", + "\n", + "\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the \n", + "two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general \n", + "element of this Hilbert space as $\\lvert i\\rangle \\ \\otimes \\ \\lvert j\\rangle$.\n", + "\n", + "Moving right along, we now require a method to evolve our walk forward at each step. We define a random \n", + "walk evolution operator as follows:\n", + "\n", + "\n", + "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", + "\n", + "\n", + "By the way, I didn't come up with this operator, this came from the paper I referenced at the top of the \n", + "post. Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", + "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", + "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", + "\"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), \n", + "and then sums over all possible position states until it finds the position state to which the operator is \n", + "being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, \n", + "they're orthonormal!), and the new position state of the vector is $\\lvert j \\ \\pm \\ 1\\rangle$, depending on \n", + "the state of the coin vector. This did exactly what we wanted, it evolved our walk either forward or \n", + "backwards by one step! If you're still not convinced, let's check to see what happens when we have the state \n", + "$\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle$ and we apply the $U$ operator:\n", + "\n", + "\n", + " $$U (\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert \\Big )(\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle)$$\n", + " \n", + " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert 1\\rangle \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert 1\\rangle$$\n", + "\n", + "\n", + " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle \\ + \\ 0\\lvert \\downarrow\\rangle \\ \\otimes \\ \\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle$$\n", + "\n", + "\n", + " As you can see, it works! Now, we must consider the randomness of the classical random walk. For the purposes of our \n", + " quantum walk, we will \"set\" $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", + " it is necessary that we randomly flip the state of our coin vector $\\lvert i\\rangle$. The Hadamard \n", + " transformation seems like a natural choice, as:\n", + "\n", + "\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\lvert \\uparrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ + \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\lvert \\downarrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ - \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", + "\n", + "\n", + " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the \n", + " right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" \n", + " that works as one complete step of the random walk, including randomizing the coin vector:\n", + "\n", + "\n", + " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Building a QW With Cirq**\n", + "\n", + "\n", + "Now, that we have established all of the necessary mathematical rigour to create a quantum walk, we \n", + "need to translate this into code. We can start by creating a qubit register, which will be used to represent \n", + "all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers \n", + "ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" + ] + } + ], + "source": [ + "number_qubits = 7\n", + "qubits = cirq.GridQubit.rect(1, number_qubits)\n", + "\n", + "print(qubits)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on \n", + "the simulation that we want to make. To start, let's say that our initial position vector for our \"walker\" \n", + "is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's \n", + "also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is \n", + "an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on \n", + "the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "metadata": {}, + "outputs": [], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have created and initialized our qubit register, we have to create an operation that can evolve \n", + "our walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "\n", + "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", + "\n", + "\n", + "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", + "\n", + "\n", + "\n", + "\n", + "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker \n", + "steps forwards or backwards without ever having to be measured!\n", + "\n", + "\n", + "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \n", + "\"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with \n", + "adds or substracts $1$ from the position vector. \n", + "\n", + "\n", + "Before we actually dive into making the addition and substraction operators, it will be useful for us to define \n", + "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", + "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", + "standard $CNOT$ and Toffoli gates. In order to implement this, we can use the built-in function Cirq: `cirq.X(target).controlled_by(*controls)` (see Appendix A for an exact implementation of this gate with $CNOT$s)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, \n", + "the idea is:\n", + "\n", + "\n", + "\n", + "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", + "\n", + "\n", + "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", + "\n", + "\n", + "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", + "\n", + "\n", + "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", + "\n", + "\n", + "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition (This jusst cancels out when we apply the inverse operator to perform subtraction).\n", + "\n", + "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if \n", + "we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", + "\n", + "\n", + "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", + "\n", + "\n", + "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, \n", + "we get:\n", + "\n", + "\n", + " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", + "\n", + "\n", + "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", + "\n", + "\n", + "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", + "\n", + "\n", + "So basically, our subtraction operation will just be applying our addition operator, but with the order of \n", + "gates reversed. This allows us to create one general \"evolution operation\" for our walk, which adds \n", + "or substract $1$ to the walker's position vector, based on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "metadata": {}, + "outputs": [], + "source": [ + "def walk_step():\n", + "\n", + " #\"Flip\" the coin vector\n", + "\n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " #Implement the Addition Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits, 0, -1):\n", + " \n", + " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", + " if (i > 1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " #Implement the Substraction Operator\n", + "\n", + " for i in range(1, number_qubits+1):\n", + "\n", + " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", + " if (i < number_qubits):\n", + " yield cirq.X.on(cirq.GridQubit(0, i))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the \n", + "``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position \n", + "vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the \n", + "example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector \n", + "qubits, we have:" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({12: 1177, 14: 663, 20: 334, 10: 318, 16: 293, 52: 274, 18: 227, 48: 157, 22: 151, 40: 131, 28: 130, 54: 129, 32: 126, 30: 124, 26: 121, 42: 108, 36: 97, 38: 95, 24: 94, 34: 78, 44: 61, 46: 58, 50: 19, 8: 18, 56: 16, 58: 1})\n" + ] + } + ], + "source": [ + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 5000\n", + "\n", + "def generate_walk(number_qubits, iterator, sample_number):\n", + "\n", + " circuit = cirq.Circuit()\n", + "\n", + " circuit.append(initial_state())\n", + " for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + " circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + " simulator = cirq.Simulator()\n", + " result = simulator.run(circuit, repetitions=sample_number)\n", + " final = result.histogram(key='x')\n", + "\n", + " print(final)\n", + " return final\n", + "\n", + "final = generate_walk(number_qubits, iterator, sample_number)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", + "number of occurences of that position vector value on the y-axis. This gives us a probability distribution for \n", + "the position of the walker. It is important to note that the graphs will only have either even or odd \n", + "numbered data point, depending on the initial position of the walker and the number of steps taken:" + ] + }, + { + "cell_type": "code", + "execution_count": 223, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def graph(final):\n", + "\n", + " x_arr = list(final.keys())\n", + " y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + " x_arr_final = []\n", + " y_arr_final = []\n", + "\n", + " while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + " plt.plot(x_arr_final, y_arr_final)\n", + " plt.scatter(x_arr_final, y_arr_final)\n", + " plt.show()\n", + "\n", + "graph(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated \n", + "applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to \n", + "the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ \n", + "and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", + "and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. \n", + "In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 1222, 50: 691, 44: 362, 54: 296, 48: 271, 12: 266, 46: 189, 16: 167, 10: 141, 42: 140, 36: 128, 24: 125, 32: 112, 22: 108, 26: 103, 34: 103, 38: 99, 30: 95, 40: 88, 28: 84, 20: 65, 18: 60, 56: 34, 14: 29, 8: 21, 6: 1})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + "\n", + "final = generate_walk(number_qubits, iterator, sample_number)\n", + "graph(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one \n", + "more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our \n", + "distribution towards only one side! We will set our initial state to:\n", + "\n", + "\n", + "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", + "the qubit. When we simulate this with Cirq, we get:" + ] + }, + { + "cell_type": "code", + "execution_count": 225, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({12: 718, 52: 718, 50: 348, 14: 315, 10: 259, 16: 237, 54: 235, 48: 228, 44: 191, 20: 188, 22: 147, 18: 146, 46: 135, 42: 128, 36: 126, 38: 125, 26: 111, 34: 108, 30: 105, 24: 101, 28: 101, 32: 100, 40: 96, 8: 18, 56: 16})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " \n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + "final = generate_walk(number_qubits, iterator, sample_number)\n", + "graph(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we get a probability distribution that is much more symetric!\n", + "\n", + "\n", + "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to \n", + "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", + "example of a QW and many more great projects that can be made by utilizing this interesting process! \n", + "\n", + "**References**\n", + "\n", + "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", + "\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", + "\n", + "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Appendix A: Creating $n$-Qubit toffoli Gates From Scratch**" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" + ] + } + ], + "source": [ + "ancilla = cirq.GridQubit.rect(1, number_qubits-1, 1)\n", + "print(ancilla)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this implementation, we implemented the $n$-qubit Toffoli with a built-in function in Cirq. However, the actual decomposition of this gate must be done in terms of Toffoli gates, with a qubit ancilla (whcih we defined above).\n", + "\n", + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", + "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", + "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", + "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", + "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", + "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", + "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "\n", + "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", + "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 0): ───@───────────────────────@───\n", + " │ │\n", + "(0, 1): ───@───────────────────────@───\n", + " │ │\n", + "(0, 2): ───┼───@───────────────@───┼───\n", + " │ │ │ │\n", + "(0, 3): ───┼───┼───@───────@───┼───┼───\n", + " │ │ │ │ │ │\n", + "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", + " │ │ │ │ │ │ │\n", + "(1, 0): ───X───@───┼───┼───┼───@───X───\n", + " │ │ │ │ │\n", + "(1, 1): ───────X───@───┼───@───X───────\n", + " │ │ │\n", + "(1, 2): ───────────X───@───X───────────\n" + ] + } + ], + "source": [ + "number_qubits = 4\n", + "\n", + "def apply_n_qubit_tof(ancilla, args):\n", + "\n", + " if (len(args) == 2):\n", + " yield cirq.CNOT.on(args[0], args[1])\n", + "\n", + " elif (len(args) == 3):\n", + " yield cirq.CCX.on(args[0], args[1], args[2])\n", + "\n", + " else:\n", + "\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + " for k in range(2, len(args)-1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + "\n", + " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", + "\n", + " for k in range(len(args)-2, 1, -1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + "\n", + "\n", + "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", + "circuit = cirq.Circuit()\n", + "circuit.append(apply_n_qubit_tof(ancilla, control))\n", + "print(circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", + "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", + "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/notebook_tutorials/assets/circ2.png b/examples/notebook_tutorials/assets/circ2.png new file mode 100644 index 0000000000000000000000000000000000000000..21e2273f8baf03b308f4b664dff65284183b8814 GIT binary patch literal 34563 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 PcNYI*Y;Kfm=yKsdAp?s# literal 0 HcmV?d00001 diff --git a/examples/notebook_tutorials/assets/cycle.png b/examples/notebook_tutorials/assets/cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..89ce420986bc0edeed6af84c3afc7341c5405882 GIT binary patch literal 12396 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 literal 0 HcmV?d00001 diff --git a/examples/notebook_tutorials/random_walk_tutorial.ipynb b/examples/notebook_tutorials/random_walk_tutorial.ipynb index 6e954a725f5..bec009c674d 100644 --- a/examples/notebook_tutorials/random_walk_tutorial.ipynb +++ b/examples/notebook_tutorials/random_walk_tutorial.ipynb @@ -4,7 +4,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Quantum Random Walks With Cirq - Tutorial" + "# Quantum Walks With Cirq - Tutorial" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [], + "source": [ + "import cirq\n", + "import random\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "import scipy" ] }, { @@ -31,7 +44,10 @@ "\n", "\n", "So for our case, the final position vector is simply $\\lvert j\\rangle$. This model of a random walk can easily \n", - "be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random \n", + "be generalized to $n$-dimensions. \n", + "\n", + "\n", + "Another important fact to note is that for a discrete, 1-dimensional random \n", "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", "a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", @@ -41,13 +57,17 @@ "given by:\n", "\n", "\n", - "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", - "\n", - "\n", + "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position \n", - "$X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", - "that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, \n", - "minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", + "$X \\ = \\ R \\ - \\ L$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", + "that for a random walk of $N$ steps, the position of the walker is determined by the number of right steps, \n", + "minus the number of left steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", "to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ \n", "by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. \n", "Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, \n", @@ -55,31 +75,254 @@ "steps by calculating the binomial coefficient, therefore getting:\n", "\n", "\n", - "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", - "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", + "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R} \\Rightarrow \\ X \\ = \\ R \\ - \\ L \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ + \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ + \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ - \\ X}{2}}$$\n", "\n", + "It is important to note that this only holds true for **even numbers** if the total number of steps taken is even, and **odd numbers** if the total number of steps taken is odd. This is due to the fact that if I set the number of steps that my random walk can take to $N$, then as we previously demonstrated, $L \\ + \\ R \\ = \\ N$ and $R \\ - \\ L \\ = \\ X$. Combining these two equations, we get, just like in the equation above:\n", + "\n", + "$$R \\ = \\ \\frac{X \\ + \\ N}{2}$$\n", + "\n", + "But $R$ must be an integer, thus $X \\ + \\ N$. Must be even. It follows that if $N$ is odd, then $X$ must also be odd to make an even number, and if $N$ is even, $X$ must also be even. From this, we come to the conclusion that if we have an even $N$, the probability of being at a position $X$ that is an odd value is $0$, and if $N$ is odd, then the probability of $X$ being even is $0$.\n", "\n", "And so we have shown that the probability distribution for the position of the walker for an $N$ step random \n", - "walk is given by a binomial distribution. This fact is important, as we will show that the probability \n", - "distribution that is created when a quantum random walk is simulated is nowhere close to the binomial \n", - "distribution that we expect to see for a classical 1-dimensional random walk.\n", + "walk is given by a binomial distribution on the domain of the even or the odd numbers. This fact is important, as we will show that the probability distribution that is created when a quantum walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", "\n", + "If you don't believe me and/or the math, we can visualize this a bit better by coding up a simple program! We will define a one-dimensional random walk, starting at the point $0$ on the integer number line. We will then repeatedly \"flip a coin\", and move left and right down the number line accordingly: " + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The walker is located at: x = 8\n" + ] + } + ], + "source": [ + "# Defines all of the necessary parameters\n", "\n", + "N = 50 #Defines the total number of steps our walked will take\n", + "pr = 0.5 #Defines the probability of our walking stepping to the right\n", + "i = 0 #Defines the initial position of our walker\n", "\n", - "**Quantum Random Walks**\n", + "def random_walk(pr, N, i):\n", + " \n", + " position = i\n", + " \n", + " # Repeatedly queries our random variable and moves our walker, for the specified number of steps\n", + " \n", + " for j in range(0, N): \n", + " \n", + " coin_flip = list(np.random.choice(2, 1, p=[1-pr, pr])) #Flips our weighted coin\n", + " position += 2*coin_flip[0]-1 #Moves our walker according to the coin flip \n", + " \n", + " return position\n", + " \n", + "print(\"The walker is located at: x = \"+str(random_walk(pr, N, i)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's attempt to generate the probabilitiy distribution corresponding to the walker's position, and make sure that it checks out with our math:" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAQGElEQVR4nO3df6xfdX3H8edrrXROIyhcnaPdbhe6JXWYTGsxcT+MbKyIoy4rW9Fo3VjQxCYuumjRBBnzj7Itdi6yRSIsiC6FsBmbtY4xMVliBusFFVaRecUqZTgLdDhmECvv/fE93b5+d8s9eL+3397PfT6Spud8zufc+/60ua/v+X7O+X5uqgpJUrt+ZNIFSJIWl0EvSY0z6CWpcQa9JDXOoJekxq2cdAGjzjjjjJqenp50GZK0pNx5550PV9XUXMdOuqCfnp5mZmZm0mVI0pKS5OvHO+bUjSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6glxZoesdepnfsnXQZ0nEZ9JLUOINekhpn0EtS4wx6qSfn4rVUGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY076X5nrDRJw0/VHNx5wQQrkcbHK3pJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWpcr6BPsinJfUlmk+yY4/gvJbkrydEkW0aObUvyle7PtnEVLknqZ96gT7ICuBo4H1gPXJxk/Ui3bwBvAf565NwXAO8HzgE2Au9P8vyFly1J6qvPFf1GYLaq7q+qJ4HdwObhDlV1sKruBp4aOffXgFur6tGqOgLcCmwaQ93SSc/fSKWTRZ+gPxN4YGj/UNfWR69zk1yaZCbJzOHDh3t+aUlSHyfFzdiquqaqNlTVhqmpqUmXI0lN6RP0DwJrhvZXd219LORcSdIY9An6/cC6JGuTnAJsBfb0/Pq3AOcleX53E/a8rk2SdILMG/RVdRTYziCg7wVuqqoDSa5MciFAklckOQRcBHwkyYHu3EeBP2LwYrEfuLJrkySdIL1+w1RV7QP2jbRdPrS9n8G0zFznXgdct4AaJUkLcFLcjJUkLR6DXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDWu13P0UmuGV5U8uPOCCVYiLT6v6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1LheQZ9kU5L7kswm2THH8VVJbuyO35Fkumt/VpLrk9yT5N4kl423fEnSfOYN+iQrgKuB84H1wMVJ1o90uwQ4UlVnAbuAq7r2i4BVVXU28HLgrcdeBCRJJ0afK/qNwGxV3V9VTwK7gc0jfTYD13fbNwPnJglQwHOSrASeDTwJfHsslUuSeukT9GcCDwztH+ra5uxTVUeBx4DTGYT+fwMPAd8A/rSqHh39BkkuTTKTZObw4cPPeBCSpONb7JuxG4HvAz8BrAXeleSnRztV1TVVtaGqNkxNTS1ySZK0vPQJ+geBNUP7q7u2Oft00zSnAo8AbwD+vqq+V1XfAj4HbFho0dJSNr1jL9M79k66DC0jfYJ+P7AuydokpwBbgT0jffYA27rtLcBtVVUMpmteA5DkOcArgS+Po3BJUj/zBn03574duAW4F7ipqg4kuTLJhV23a4HTk8wC7wSOPYJ5NfDcJAcYvGD8VVXdPe5BSJKOb2WfTlW1D9g30nb50PYTDB6lHD3v8bnaJUknTq+gl5aq4bnwgzsvmGAl0uS4BIIkNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1LiVfTol2QR8CFgBfLSqdo4cXwV8DHg58Ajw21V1sDv2UuAjwPOAp4BXVNUT4xqABDC9Y+//bh/cecEEK5FOPvNe0SdZAVwNnA+sBy5Osn6k2yXAkao6C9gFXNWduxL4OPC2qnoJ8Grge2OrXpI0rz5TNxuB2aq6v6qeBHYDm0f6bAau77ZvBs5NEuA84O6q+iJAVT1SVd8fT+mSpD76BP2ZwAND+4e6tjn7VNVR4DHgdOBngEpyS5K7krx7rm+Q5NIkM0lmDh8+/EzHIEl6Got9M3Yl8AvAG7u/fyPJuaOdquqaqtpQVRumpqYWuSRJWl76BP2DwJqh/dVd25x9unn5UxnclD0E/FNVPVxV3wH2AS9baNGSpP76BP1+YF2StUlOAbYCe0b67AG2ddtbgNuqqoBbgLOT/Fj3AvDLwJfGU7okqY95H6+sqqNJtjMI7RXAdVV1IMmVwExV7QGuBW5IMgs8yuDFgKo6kuSDDF4sCthXVXvn/EaSpEXR6zn6qtrHYNpluO3yoe0ngIuOc+7HGTxiKelpHPssgJ8D0Lj5yVhJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXG9gj7JpiT3JZlNsmOO46uS3NgdvyPJ9Mjxn0zyeJI/GE/ZkqS+5g36JCuAq4HzgfXAxUnWj3S7BDhSVWcBu4CrRo5/EPj0wsuVJD1Tfa7oNwKzVXV/VT0J7AY2j/TZDFzfbd8MnJskAEleD3wNODCekqXlZXrHXqZ37J10GVrC+gT9mcADQ/uHurY5+1TVUeAx4PQkzwXeA/zh032DJJcmmUkyc/jw4b61S5J6WOybsVcAu6rq8afrVFXXVNWGqtowNTW1yCVJ0vKyskefB4E1Q/uru7a5+hxKshI4FXgEOAfYkuSPgdOAp5I8UVUfXnDlkqRe+gT9fmBdkrUMAn0r8IaRPnuAbcA/A1uA26qqgF881iHJFcDjhrwknVjzBn1VHU2yHbgFWAFcV1UHklwJzFTVHuBa4IYks8CjDF4MJEkngT5X9FTVPmDfSNvlQ9tPABfN8zWu+CHqkyQtkJ+MlaTG9bqil04Ww8+TH9x5wQQrkZYOr+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxfjJWJyU/ASuNj1f0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvbRETe/Y+wOPoUrHY9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjegV9kk1J7ksym2THHMdXJbmxO35Hkumu/VeT3Jnknu7v14y3fEnSfOYN+iQrgKuB84H1wMVJ1o90uwQ4UlVnAbuAq7r2h4Ffr6qzgW3ADeMqXJLUT58r+o3AbFXdX1VPAruBzSN9NgPXd9s3A+cmSVV9vqr+vWs/ADw7yapxFC5J6qdP0J8JPDC0f6hrm7NPVR0FHgNOH+nzm8BdVfXd0W+Q5NIkM0lmDh8+3Ld2SVIPJ+RmbJKXMJjOeetcx6vqmqraUFUbpqamTkRJkrRs9An6B4E1Q/uru7Y5+yRZCZwKPNLtrwY+Cby5qr660IIlSc9Mn6DfD6xLsjbJKcBWYM9Inz0MbrYCbAFuq6pKchqwF9hRVZ8bV9GSpP7mDfpuzn07cAtwL3BTVR1IcmWSC7tu1wKnJ5kF3gkcewRzO3AWcHmSL3R/Xjj2UUiSjmtln05VtQ/YN9J2+dD2E8BFc5z3AeADC6xRkrQAfjJWkhpn0EtS43pN3UiLZfiXWx/cecEEK2nHsX9T/z11jFf0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS41zrRieEa9pIk+MVvSQ1zqCXlonpHXt/4J2Vlg+DXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOD0xprPxg1NLjLxNvn1f0ktQ4g16SGmfQS1LjnKPXD8W5+PY5d9+OXlf0STYluS/JbJIdcxxfleTG7vgdSaaHjl3Wtd+X5NfGV7pOhGPro7hGirR0zRv0SVYAVwPnA+uBi5OsH+l2CXCkqs4CdgFXdeeuB7YCLwE2AX/RfT1JS5Qv/EtPnyv6jcBsVd1fVU8Cu4HNI302A9d32zcD5yZJ1767qr5bVV8DZruvpwk53g+pP7xSu1JVT98h2QJsqqrf6/bfBJxTVduH+vxr1+dQt/9V4BzgCuD2qvp4134t8Omqunnke1wKXNrt/ixw38KHNhFnAA9PuogTaLmNF5bfmJfbeGHpjvmnqmpqrgMnxc3YqroGuGbSdSxUkpmq2jDpOk6U5TZeWH5jXm7jhTbH3Gfq5kFgzdD+6q5tzj5JVgKnAo/0PFeStIj6BP1+YF2StUlOYXBzdc9Inz3Atm57C3BbDeaE9gBbu6dy1gLrgH8ZT+mSpD7mnbqpqqNJtgO3ACuA66rqQJIrgZmq2gNcC9yQZBZ4lMGLAV2/m4AvAUeBt1fV9xdpLCeDJT/99Awtt/HC8hvzchsvNDjmeW/GSpKWNpdAkKTGGfSS1DiDfoySvCtJJTmj20+SP++WgLg7ycsmXeM4JPmTJF/uxvTJJKcNHWtyyYv5lgFpQZI1ST6b5EtJDiR5R9f+giS3JvlK9/fzJ13rOCVZkeTzSf6u21/bLeUy2y3tcsqka1wog35MkqwBzgO+MdR8PoMnjdYx+EDYX06gtMVwK/BzVfVS4N+Ay6DdJS96LgPSgqPAu6pqPfBK4O3dOHcAn6mqdcBnuv2WvAO4d2j/KmBXt6TLEQZLvCxpBv347ALeDQzf3d4MfKwGbgdOS/LiiVQ3RlX1D1V1tNu9ncHnI6DdJS/6LAOy5FXVQ1V1V7f9XwzC70x+cImT64HXT6bC8UuyGrgA+Gi3H+A1DJZygUbGa9CPQZLNwINV9cWRQ2cCDwztH+raWvK7wKe77VbH2+q4jqtbgfbngTuAF1XVQ92hbwIvmlBZi+HPGFygPdXtnw7859CFTBP/1yfFEghLQZJ/BH58jkPvA97LYNqmGU833qr6VNfnfQze7n/iRNamxZXkucDfAL9fVd8eXOQOVFUlaeKZ7CSvA75VVXcmefWk61lMBn1PVfUrc7UnORtYC3yx+4FYDdyVZCNLeAmI4433mCRvAV4HnFv/92GMJTveebQ6rv8nybMYhPwnqupvu+b/SPLiqnqom3r81uQqHKtXARcmeS3wo8DzgA8xmGJd2V3VN/F/7dTNAlXVPVX1wqqarqppBm/1XlZV32SwBMSbu6dvXgk8NvQWeMlKsonB290Lq+o7Q4daXfKizzIgS143P30tcG9VfXDo0PASJ9uAT53o2hZDVV1WVau7n9utDJZueSPwWQZLuUAj4/WKfnHtA17L4Kbkd4DfmWw5Y/NhYBVwa/cu5vaqelurS14cbxmQCZe1GF4FvAm4J8kXurb3AjuBm5JcAnwd+K0J1XeivAfYneQDwOcZvPgtaS6BIEmNc+pGkhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TG/Q+ngouJPKIM8AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def dist(runs, N):\n", + " \n", + " positions = range(-1*N, N+1)\n", + " instances = [0 for i in range(-1*N, N+1)]\n", + " \n", + " for k in range(0, runs):\n", + "\n", + " result = random_walk(pr, N, i)\n", + " instances[positions.index(result)] += 1\n", + "\n", + " plt.bar(positions, [n/runs for n in instances])\n", + " plt.show()\n", + " \n", + "dist(10000, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks pretty binomial to me (which is exactly what the math predicts)! We can now plot the distribution predicted in the math, and see if the two are the same:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def height_calculate(x, N, pr):\n", + " \n", + " a = (N + x)/2\n", + " b = (N - x)/2\n", + " \n", + " if (x%2 == 0):\n", + " var = scipy.special.binom(N, a)*(pr**a)*((1-pr)**b)\n", + " else:\n", + " var = 0\n", + " return var\n", + "\n", + "heights = [height_calculate(x, N, pr) for x in positions]\n", + "plt.bar(positions, heights)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, the distributions looks very similar, with the midpoint having a probability of a little bit over $0.1$ in both graphs. Note that as we increase the `runs` variable, our simulated distribution will resemble our theoretical distribution more and more, as one would expect:" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAARD0lEQVR4nO3df6xfdX3H8edrraDTCApX52i324VuSRnGuVpM3JyRDYs46rLiikbBsaCJTVx00Ysm6Jh/yLaIW8YWyWBB0BTCZmzWOsbEZIkR1gsqrGD1ighFHJcf4hxBrLz3x/fgvnx3yz31fm9v7+c+H8lNz/l8Pud73582fX3PPed8PzdVhSSpXT+z1AVIkhaXQS9JjTPoJalxBr0kNc6gl6TGrV7qAkYdf/zxNTk5udRlSNKycssttzxYVRNz9R1xQT85Ocn09PRSlyFJy0qSbx+sz0s3ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUuF5Bn2Rzkn1JZpJMzdH/6iS3JjmQZOtQ+8uSfCnJ3iS3JfmDcRYvHQkmp3YxObVrqcuQDmreoE+yCrgUOB3YAJydZMPIsHuAc4FPj7Q/Brytqk4CNgMfT3LsQouWJPXXZ62bTcBMVd0FkGQHsAW446kBVXV31/fk8IFV9fWh7e8keQCYAL634MolSb30uXRzAnDv0P7+ru2QJNkEHAV8c46+85NMJ5menZ091JeWJD2Dw3IzNslLgKuAt1fVk6P9VXVZVW2sqo0TE3OusilJ+in1Cfr7gLVD+2u6tl6SPB/YBXywqm46tPIkSQvVJ+j3AOuTrEtyFLAN2NnnxbvxnwE+WVXX/fRlSpJ+WvMGfVUdALYD1wN3AtdW1d4kFyU5EyDJK5LsB84CPpFkb3f4m4BXA+cm+Ur39bJFmYkkaU69fsNUVe0Gdo+0XTi0vYfBJZ3R464Grl5gjZKkBfCTsZLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeq1Y/q5XrRQGvSQ1zqCXpMYZ9FJPXurRcmXQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWpcr6BPsjnJviQzSabm6H91kluTHEiydaTvnCTf6L7OGVfhkqR+5g36JKuAS4HTgQ3A2Uk2jAy7BzgX+PTIsS8EPgScAmwCPpTkBQsvW5LUV58z+k3ATFXdVVVPADuALcMDquruqroNeHLk2NcBN1TVw1X1CHADsHkMdUuSeuoT9CcA9w7t7+/a+uh1bJLzk0wnmZ6dne350pKkPo6Im7FVdVlVbayqjRMTE0tdjiQ1pU/Q3wesHdpf07X1sZBjJUlj0Cfo9wDrk6xLchSwDdjZ8/WvB05L8oLuJuxpXZt0xPIXjKg18wZ9VR0AtjMI6DuBa6tqb5KLkpwJkOQVSfYDZwGfSLK3O/Zh4M8YvFnsAS7q2iRJh8nqPoOqajewe6TtwqHtPQwuy8x17BXAFQuoUZK0AEfEzVhJ0uIx6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfTSIpmc2sXk1K6lLkMy6CWpdQa9JDXOoJekxhn0ktS4XkGfZHOSfUlmkkzN0X90kmu6/puTTHbtz0pyZZLbk9yZ5ILxli8tP96k1eE2b9AnWQVcCpwObADOTrJhZNh5wCNVdSJwCXBx134WcHRVnQz8OvCOp94EJEmHR58z+k3ATFXdVVVPADuALSNjtgBXdtvXAacmCVDAc5OsBp4DPAF8fyyVS5J66RP0JwD3Du3v79rmHFNVB4BHgeMYhP7/APcD9wB/WVUPj36DJOcnmU4yPTs7e8iTkCQd3GLfjN0E/Bj4eWAd8N4kvzQ6qKouq6qNVbVxYmJikUuSpJWlT9DfB6wd2l/Ttc05prtMcwzwEPBm4F+q6kdV9QDwRWDjQouWJPXXJ+j3AOuTrEtyFLAN2DkyZidwTre9FbixqorB5ZrXAiR5LvBK4GvjKFyS1M+8Qd9dc98OXA/cCVxbVXuTXJTkzG7Y5cBxSWaA9wBPPYJ5KfC8JHsZvGH8Q1XdNu5JSJIObnWfQVW1G9g90nbh0PbjDB6lHD3uB3O1S5IOHz8ZK0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktS41UtdgDQOk1O7frJ990fPWMJKpCOPZ/SS1DiDXpIaZ9BLUuN6BX2SzUn2JZlJMjVH/9FJrun6b04yOdT30iRfSrI3ye1Jnj2+8qV2TE7tetq9Bmlc5g36JKuAS4HTgQ3A2Uk2jAw7D3ikqk4ELgEu7o5dDVwNvLOqTgJeA/xobNVLPRigWun6nNFvAmaq6q6qegLYAWwZGbMFuLLbvg44NUmA04DbquqrAFX1UFX9eDylS5L66BP0JwD3Du3v79rmHFNVB4BHgeOAXwYqyfVJbk3yvrm+QZLzk0wnmZ6dnT3UOUiSnsFi34xdDfwG8Jbuz99LcurooKq6rKo2VtXGiYmJRS5JklaWPkF/H7B2aH9N1zbnmO66/DHAQwzO/v+9qh6sqseA3cDLF1q0JKm/PkG/B1ifZF2So4BtwM6RMTuBc7rtrcCNVVXA9cDJSX62ewP4LeCO8ZQuSepj3iUQqupAku0MQnsVcEVV7U1yETBdVTuBy4GrkswADzN4M6CqHknyMQZvFgXsrioff5Ckw6jXWjdVtZvBZZfhtguHth8HzjrIsVczeMRSkrQE/GSsJDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuNWL3UB0qGYnNr1k+27P3rGElYiLR+e0UtS4wx6SWqcQS9JjesV9Ek2J9mXZCbJ1Bz9Rye5puu/OcnkSP8vJPlBkj8ZT9mSpL7mDfokq4BLgdOBDcDZSTaMDDsPeKSqTgQuAS4e6f8Y8LmFlytJOlR9zug3ATNVdVdVPQHsALaMjNkCXNltXwecmiQASd4IfAvYO56SJUmHok/QnwDcO7S/v2ubc0xVHQAeBY5L8jzg/cCfPtM3SHJ+kukk07Ozs31rlyT1sNg3Yz8MXFJVP3imQVV1WVVtrKqNExMTi1ySJK0sfT4wdR+wdmh/Tdc215j9SVYDxwAPAacAW5P8OXAs8GSSx6vqbxZcuSSplz5BvwdYn2Qdg0DfBrx5ZMxO4BzgS8BW4MaqKuA3nxqQ5MPADwx5STq85g36qjqQZDtwPbAKuKKq9ia5CJiuqp3A5cBVSWaAhxm8GUiSjgC91rqpqt3A7pG2C4e2HwfOmuc1PvxT1CdJWiA/GStJjXP1Sh2RXKVSGh/P6KVlanJq19PeEKWDMeglqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx66QjnY5RaKINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxvUK+iSbk+xLMpNkao7+o5Nc0/XfnGSya/+dJLckub3787XjLV+SNJ95gz7JKuBS4HRgA3B2kg0jw84DHqmqE4FLgIu79geB362qk4FzgKvGVbgkqZ8+Z/SbgJmququqngB2AFtGxmwBruy2rwNOTZKq+nJVfadr3ws8J8nR4yhcktRPn6A/Abh3aH9/1zbnmKo6ADwKHDcy5veBW6vqh6PfIMn5SaaTTM/OzvatXZLUw2G5GZvkJAaXc94xV39VXVZVG6tq48TExOEoSZJWjNU9xtwHrB3aX9O1zTVmf5LVwDHAQwBJ1gCfAd5WVd9ccMVqyvAvvb77o2csYSVSu/qc0e8B1idZl+QoYBuwc2TMTgY3WwG2AjdWVSU5FtgFTFXVF8dVtCSpv3mDvrvmvh24HrgTuLaq9ia5KMmZ3bDLgeOSzADvAZ56BHM7cCJwYZKvdF8vGvssJEkH1efSDVW1G9g90nbh0PbjwFlzHPcR4CMLrFGStAB+MlaSGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS+tEJNTu562LLRWDoNekhrXa/VKaaH8BSOHz1N/1/496yme0UtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1Difo9dY+bz88uNz9+3zjF6SGmfQS1LjvHSjZ3SwSzFeommfl3Ta0euMPsnmJPuSzCSZmqP/6CTXdP03J5kc6ruga9+X5HXjK12S1Me8QZ9kFXApcDqwATg7yYaRYecBj1TVicAlwMXdsRuAbcBJwGbgb7vXk7RMudzx8tPnjH4TMFNVd1XVE8AOYMvImC3Ald32dcCpSdK176iqH1bVt4CZ7vUkSYdJquqZByRbgc1V9Ufd/luBU6pq+9CY/+zG7O/2vwmcAnwYuKmqru7aLwc+V1XXjXyP84Hzu91fAfYtfGpL4njgwaUu4jBaafOFlTfnlTZfWL5z/sWqmpir44i4GVtVlwGXLXUdC5Vkuqo2LnUdh8tKmy+svDmvtPlCm3Puc+nmPmDt0P6arm3OMUlWA8cAD/U8VpK0iPoE/R5gfZJ1SY5icHN158iYncA53fZW4MYaXBPaCWzrnspZB6wH/mM8pUuS+pj30k1VHUiyHbgeWAVcUVV7k1wETFfVTuBy4KokM8DDDN4M6MZdC9wBHADeVVU/XqS5HAmW/eWnQ7TS5gsrb84rbb7Q4JznvRkrSVreXAJBkhpn0EtS4wz6MUry3iSV5PhuP0n+ulsC4rYkL1/qGschyV8k+Vo3p88kOXaor8klL+ZbBqQFSdYm+UKSO5LsTfLurv2FSW5I8o3uzxcsda3jlGRVki8n+eduf123lMtMt7TLUUtd40IZ9GOSZC1wGnDPUPPpDJ40Ws/gA2F/twSlLYYbgF+tqpcCXwcugHaXvOi5DEgLDgDvraoNwCuBd3XznAI+X1Xrgc93+y15N3Dn0P7FwCXdki6PMFjiZVkz6MfnEuB9wPDd7S3AJ2vgJuDYJC9ZkurGqKr+taoOdLs3Mfh8BLS75EWfZUCWvaq6v6pu7bb/m0H4ncDTlzi5Enjj0lQ4fknWAGcAf9/tB3gtg6VcoJH5GvRjkGQLcF9VfXWk6wTg3qH9/V1bS/4Q+Fy33ep8W53XQXUr0P4acDPw4qq6v+v6LvDiJSprMXycwQnak93+ccD3hk5kmvi3PiKWQFgOkvwb8HNzdH0Q+ACDyzbNeKb5VtVnuzEfZPDj/qcOZ21aXEmeB/wj8MdV9f3BSe5AVVWSJp7JTvIG4IGquiXJa5a6nsVk0PdUVb89V3uSk4F1wFe7/xBrgFuTbGIZLwFxsPk+Jcm5wBuAU+v/PoyxbOc7j1bn9f8keRaDkP9UVf1T1/xfSV5SVfd3lx4fWLoKx+pVwJlJXg88G3g+8FcMLrGu7s7qm/i39tLNAlXV7VX1oqqarKpJBj/qvbyqvstgCYi3dU/fvBJ4dOhH4GUryWYGP+6eWVWPDXW1uuRFn2VAlr3u+vTlwJ1V9bGhruElTs4BPnu4a1sMVXVBVa3p/t9uY7B0y1uALzBYygUama9n9ItrN/B6BjclHwPevrTljM3fAEcDN3Q/xdxUVe9sdcmLgy0DssRlLYZXAW8Fbk/yla7tA8BHgWuTnAd8G3jTEtV3uLwf2JHkI8CXGbz5LWsugSBJjfPSjSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjftfrBTn9b1eZrsAAAAASUVORK5CYII=\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "dist(50, N)\n", + "dist(100, N)\n", + "dist(500, N)\n", + "dist(1000, N)\n", + "dist(5000, N)\n", + "dist(10000, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Quantum Walks**\n", "\n", "\n", - "The process of the quantum random walk isn't that much different from its classical counterpart, although \n", + "The process of the quantum walk isn't that much different from its classical counterpart, although \n", "the observed results of the two processes have many differences. First, let us motivate the creation of a \n", - "QRW. The idea is that when one performs analysis on a classical random walk, you can find that \n", + "QW. The idea is that when one performs analysis on a classical random walk, you can find that \n", "$\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, \n", - "and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that \n", + "and $T$ is the number of time-steps of the random walk. For the quantum walk, we can see that \n", "$\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. \n", "At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the \n", - "classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", + "classical one, showing that the process of a QW is quadratically faster than its classical counterpart.\n", "\n", "\n", - "In order to create a quantum random walk, we have to translate the components of the classical random walk \n", + "In order to create a quantum walk, we have to translate the components of the classical random walk \n", "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a \n", "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", @@ -125,14 +368,14 @@ "two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general \n", "element of this Hilbert space as $\\lvert i\\rangle \\ \\otimes \\ \\lvert j\\rangle$.\n", "\n", - "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random \n", + "Moving right along, we now require a method to evolve our walk forward at each step. We define a random \n", "walk evolution operator as follows:\n", "\n", "\n", "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", "\n", "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the \n", + "By the way, I didn't come up with this operator, this came from the paper I referenced at the top of the \n", "post. Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", @@ -140,7 +383,7 @@ "and then sums over all possible position states until it finds the position state to which the operator is \n", "being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, \n", "they're orthonormal!), and the new position state of the vector is $\\lvert j \\ \\pm \\ 1\\rangle$, depending on \n", - "the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or \n", + "the state of the coin vector. This did exactly what we wanted, it evolved our walk either forward or \n", "backwards by one step! If you're still not convinced, let's check to see what happens when we have the state \n", "$\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle$ and we apply the $U$ operator:\n", "\n", @@ -153,8 +396,8 @@ " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle \\ + \\ 0\\lvert \\downarrow\\rangle \\ \\otimes \\ \\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle$$\n", "\n", "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our \n", - " random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", + " As you can see, it works! Now, we must consider the randomness of the classical random walk. For the purposes of our \n", + " quantum walk, we will \"set\" $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", " it is necessary that we randomly flip the state of our coin vector $\\lvert i\\rangle$. The Hadamard \n", " transformation seems like a natural choice, as:\n", "\n", @@ -167,19 +410,17 @@ " that works as one complete step of the random walk, including randomizing the coin vector:\n", "\n", "\n", - " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", - "\n", - "\n" + " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Tutorial: Building a QRW With Cirq**\n", + "**Building a QW With Cirq**\n", "\n", "\n", - "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we \n", + "Now, that we have established all of the necessary mathematical rigour to create a quantum walk, we \n", "need to translate this into code. We can start by creating a qubit register, which will be used to represent \n", "all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers \n", "ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" @@ -187,7 +428,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 214, "metadata": {}, "outputs": [ { @@ -199,19 +440,8 @@ } ], "source": [ - "import cirq\n", - "import random\n", - "import numpy as np\n", - "import copy\n", - "import sympy\n", - "import itertools\n", - "from matplotlib import pyplot as plt\n", - "\n", "number_qubits = 7\n", - "\n", - "qubits = []\n", - "for i in range(0, number_qubits):\n", - " qubits.append(cirq.GridQubit(0, i))\n", + "qubits = cirq.GridQubit.rect(1, number_qubits)\n", "\n", "print(qubits)" ] @@ -221,7 +451,7 @@ "metadata": {}, "source": [ "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on \n", - "the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" \n", + "the simulation that we want to make. To start, let's say that our initial position vector for our \"walker\" \n", "is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's \n", "also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is \n", "an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on \n", @@ -230,7 +460,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 215, "metadata": {}, "outputs": [], "source": [ @@ -245,12 +475,12 @@ "metadata": {}, "source": [ "Now that we have created and initialized our qubit register, we have to create an operation that can evolve \n", - "our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "our walk forward by one step. At a high level, our evolution operation will follow this process:\n", "\n", "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", "\n", "\n", - "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", + "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", "\n", "\n", "\n", @@ -267,115 +497,7 @@ "Before we actually dive into making the addition and substraction operators, it will be useful for us to define \n", "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", - "standard $CNOT$ and Toffoli gates.\n", - "\n", - "\n", - "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla \n", - "qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" - ] - } - ], - "source": [ - "ancilla = []\n", - "for i in range(0, number_qubits):\n", - " ancilla.append(cirq.GridQubit(1, i))\n", - "\n", - "print(ancilla)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", - "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", - "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", - "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", - "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", - "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", - "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "\n", - "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", - "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 0): ───@───────────────────────@───\n", - " │ │\n", - "(0, 1): ───@───────────────────────@───\n", - " │ │\n", - "(0, 2): ───┼───@───────────────@───┼───\n", - " │ │ │ │\n", - "(0, 3): ───┼───┼───@───────@───┼───┼───\n", - " │ │ │ │ │ │\n", - "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", - " │ │ │ │ │ │ │\n", - "(1, 0): ───X───@───┼───┼───┼───@───X───\n", - " │ │ │ │ │\n", - "(1, 1): ───────X───@───┼───@───X───────\n", - " │ │ │\n", - "(1, 2): ───────────X───@───X───────────\n" - ] - } - ], - "source": [ - "number_qubits = 4\n", - "\n", - "def apply_n_qubit_tof(ancilla, args):\n", - "\n", - " if (len(args) == 2):\n", - " yield cirq.CNOT.on(args[0], args[1])\n", - "\n", - " elif (len(args) == 3):\n", - " yield cirq.CCX.on(args[0], args[1], args[2])\n", - "\n", - " else:\n", - "\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - " for k in range(2, len(args)-1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - "\n", - " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", - "\n", - " for k in range(len(args)-2, 1, -1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - "\n", - "\n", - "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", - "circuit = cirq.Circuit()\n", - "circuit.append(apply_n_qubit_tof(ancilla, control))\n", - "print(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", - "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", - "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + "standard $CNOT$ and Toffoli gates. In order to implement this, we can use the built-in function Cirq: `cirq.X(target).controlled_by(*controls)` (see Appendix A for an exact implementation of this gate with $CNOT$s)." ] }, { @@ -399,7 +521,7 @@ "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", "\n", "\n", - "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", + "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition (This jusst cancels out when we apply the inverse operator to perform subtraction).\n", "\n", "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if \n", "we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", @@ -422,13 +544,13 @@ "\n", "\n", "So basically, our subtraction operation will just be applying our addition operator, but with the order of \n", - "gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds \n", - "or substract $1$ to the random walkers position vector, based on the coin qubit:" + "gates reversed. This allows us to create one general \"evolution operation\" for our walk, which adds \n", + "or substract $1$ to the walker's position vector, based on the coin qubit:" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 216, "metadata": {}, "outputs": [], "source": [ @@ -443,24 +565,22 @@ " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", "\n", " for i in range(number_qubits, 0, -1):\n", - "\n", - " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " for i in range(number_qubits, 0, -1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + " \n", + " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", + " if (i > 1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", "\n", " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", "\n", " #Implement the Substraction Operator\n", "\n", - " for i in range(number_qubits, 0, -1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", " for i in range(1, number_qubits+1):\n", "\n", - " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))" + " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", + " if (i < number_qubits):\n", + " yield cirq.X.on(cirq.GridQubit(0, i))" ] }, { @@ -476,35 +596,39 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 222, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({12: 50, 14: 24, 20: 16, 10: 15, 16: 13, 52: 12, 42: 8, 22: 7, 34: 7, 24: 6, 48: 5, 32: 5, 30: 4, 54: 4, 40: 4, 36: 4, 38: 4, 18: 3, 46: 3, 26: 3, 44: 2, 50: 1})\n" + "Counter({12: 1177, 14: 663, 20: 334, 10: 318, 16: 293, 52: 274, 18: 227, 48: 157, 22: 151, 40: 131, 28: 130, 54: 129, 32: 126, 30: 124, 26: 121, 42: 108, 36: 97, 38: 95, 24: 94, 34: 78, 44: 61, 46: 58, 50: 19, 8: 18, 56: 16, 58: 1})\n" ] } ], "source": [ "number_qubits = 7\n", "iterator = 30\n", - "sample_number = 200\n", + "sample_number = 5000\n", "\n", - "circuit = cirq.Circuit()\n", + "def generate_walk(number_qubits, iterator, sample_number):\n", + "\n", + " circuit = cirq.Circuit()\n", "\n", - "circuit.append(initial_state())\n", + " circuit.append(initial_state())\n", + " for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + " circuit.append(cirq.measure(*qubits, key='x'))\n", "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", + " simulator = cirq.Simulator()\n", + " result = simulator.run(circuit, repetitions=sample_number)\n", + " final = result.histogram(key='x')\n", "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", + " print(final)\n", + " return final\n", "\n", - "print(final)" + "final = generate_walk(number_qubits, iterator, sample_number)" ] }, { @@ -513,18 +637,20 @@ "source": [ "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", "number of occurences of that position vector value on the y-axis. This gives us a probability distribution for \n", - "the position of the random walker. It is important to note that the graphs will only have either even or odd \n", + "the position of the walker. It is important to note that the graphs will only have either even or odd \n", "numbered data point, depending on the initial position of the walker and the number of steps taken:" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, + "execution_count": 223, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -536,23 +662,27 @@ } ], "source": [ - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "def graph(final):\n", "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", + " x_arr = list(final.keys())\n", + " y_arr = [dict(final)[j] for j in dict(final).keys()]\n", "\n", - "while (len(x_arr) > 0):\n", + " x_arr_final = []\n", + " y_arr_final = []\n", "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", + " while (len(x_arr) > 0):\n", "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + " plt.plot(x_arr_final, y_arr_final)\n", + " plt.scatter(x_arr_final, y_arr_final)\n", + " plt.show()\n", + "\n", + "graph(final)" ] }, { @@ -569,19 +699,19 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 224, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 46, 50: 21, 44: 15, 12: 14, 54: 12, 42: 8, 48: 7, 16: 6, 10: 6, 40: 6, 32: 6, 30: 6, 26: 6, 46: 6, 38: 5, 34: 5, 36: 5, 22: 5, 28: 4, 14: 3, 24: 3, 56: 2, 18: 2, 20: 1})\n" + "Counter({52: 1222, 50: 691, 44: 362, 54: 296, 48: 271, 12: 266, 46: 189, 16: 167, 10: 141, 42: 140, 36: 128, 24: 125, 32: 112, 22: 108, 26: 103, 34: 103, 38: 99, 30: 95, 40: 88, 28: 84, 20: 65, 18: 60, 56: 34, 14: 29, 8: 21, 6: 1})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -597,41 +727,8 @@ "\n", " yield cirq.X.on(cirq.GridQubit(0, 1))\n", "\n", - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)\n", - "\n", - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" + "final = generate_walk(number_qubits, iterator, sample_number)\n", + "graph(final)" ] }, { @@ -652,19 +749,19 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 225, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({52: 31, 12: 26, 20: 13, 10: 12, 54: 10, 14: 10, 46: 9, 48: 9, 30: 8, 16: 8, 42: 8, 50: 7, 22: 6, 34: 6, 38: 6, 28: 5, 40: 4, 44: 4, 32: 4, 36: 4, 26: 3, 24: 3, 18: 2, 56: 1, 8: 1})\n" + "Counter({12: 718, 52: 718, 50: 348, 14: 315, 10: 259, 16: 237, 54: 235, 48: 228, 44: 191, 20: 188, 22: 147, 18: 146, 46: 135, 42: 128, 36: 126, 38: 125, 26: 111, 34: 108, 30: 105, 24: 101, 28: 101, 32: 100, 40: 96, 8: 18, 56: 16})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -683,41 +780,8 @@ " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", "\n", - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)\n", - "\n", - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" + "final = generate_walk(number_qubits, iterator, sample_number)\n", + "graph(final)" ] }, { @@ -729,7 +793,7 @@ "\n", "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to \n", "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", - "example of a QRW and many more great projects that can be made by utilizing this interesting process! \n", + "example of a QW and many more great projects that can be made by utilizing this interesting process! \n", "\n", "**References**\n", "\n", @@ -740,6 +804,119 @@ "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", "\n" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Appendix A: Creating $n$-Qubit toffoli Gates From Scratch**" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" + ] + } + ], + "source": [ + "ancilla = cirq.GridQubit.rect(1, number_qubits-1, 1)\n", + "print(ancilla)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this implementation, we implemented the $n$-qubit Toffoli with a built-in function in Cirq. However, the actual decomposition of this gate must be done in terms of Toffoli gates, with a qubit ancilla (whcih we defined above).\n", + "\n", + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", + "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", + "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", + "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", + "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", + "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", + "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "\n", + "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", + "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 0): ───@───────────────────────@───\n", + " │ │\n", + "(0, 1): ───@───────────────────────@───\n", + " │ │\n", + "(0, 2): ───┼───@───────────────@───┼───\n", + " │ │ │ │\n", + "(0, 3): ───┼───┼───@───────@───┼───┼───\n", + " │ │ │ │ │ │\n", + "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", + " │ │ │ │ │ │ │\n", + "(1, 0): ───X───@───┼───┼───┼───@───X───\n", + " │ │ │ │ │\n", + "(1, 1): ───────X───@───┼───@───X───────\n", + " │ │ │\n", + "(1, 2): ───────────X───@───X───────────\n" + ] + } + ], + "source": [ + "number_qubits = 4\n", + "\n", + "def apply_n_qubit_tof(ancilla, args):\n", + "\n", + " if (len(args) == 2):\n", + " yield cirq.CNOT.on(args[0], args[1])\n", + "\n", + " elif (len(args) == 3):\n", + " yield cirq.CCX.on(args[0], args[1], args[2])\n", + "\n", + " else:\n", + "\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + " for k in range(2, len(args)-1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + "\n", + " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", + "\n", + " for k in range(len(args)-2, 1, -1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + "\n", + "\n", + "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", + "circuit = cirq.Circuit()\n", + "circuit.append(apply_n_qubit_tof(ancilla, control))\n", + "print(circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", + "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", + "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + ] } ], "metadata": { @@ -758,7 +935,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.7.5" } }, "nbformat": 4, From 0439c3df3ac1cb5299525090da81daef7c06b8dc Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Thu, 30 Jan 2020 23:02:47 -0500 Subject: [PATCH 17/29] New --- .../random_walk_tutorial-checkpoint.ipynb | 943 ------------------ .../random_walk_tutorial.ipynb | 51 +- 2 files changed, 34 insertions(+), 960 deletions(-) delete mode 100644 examples/notebook_tutorials/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb diff --git a/examples/notebook_tutorials/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/notebook_tutorials/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb deleted file mode 100644 index bec009c674d..00000000000 --- a/examples/notebook_tutorials/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ /dev/null @@ -1,943 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quantum Walks With Cirq - Tutorial" - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "metadata": {}, - "outputs": [], - "source": [ - "import cirq\n", - "import random\n", - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "import scipy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Classical Random Walks**\n", - "\n", - "A random walks is a random process involving a \"walker\" that is placed in some $n$-dimensional medium \n", - "(like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement,\n", - "the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is \n", - "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", - "at each of the integers. Let the initial position vector of our marker be $\\lvert 0\\rangle$. For $N$ steps of our\n", - "random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", - "$1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute\n", - "the value:\n", - "\n", - "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", - "\n", - "Where we know:\n", - "\n", - "\n", - "$$\\lvert \\text{Final}\\rangle \\ = \\ \\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", - "\n", - "\n", - "So for our case, the final position vector is simply $\\lvert j\\rangle$. This model of a random walk can easily \n", - "be generalized to $n$-dimensions. \n", - "\n", - "\n", - "Another important fact to note is that for a discrete, 1-dimensional random \n", - "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", - "a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", - "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", - "that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random \n", - "walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability \n", - "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is \n", - "given by:\n", - "\n", - "\n", - "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position \n", - "$X \\ = \\ R \\ - \\ L$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", - "that for a random walk of $N$ steps, the position of the walker is determined by the number of right steps, \n", - "minus the number of left steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", - "to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ \n", - "by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. \n", - "Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, \n", - "and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ \n", - "steps by calculating the binomial coefficient, therefore getting:\n", - "\n", - "\n", - "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R} \\Rightarrow \\ X \\ = \\ R \\ - \\ L \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ + \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ + \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ - \\ X}{2}}$$\n", - "\n", - "It is important to note that this only holds true for **even numbers** if the total number of steps taken is even, and **odd numbers** if the total number of steps taken is odd. This is due to the fact that if I set the number of steps that my random walk can take to $N$, then as we previously demonstrated, $L \\ + \\ R \\ = \\ N$ and $R \\ - \\ L \\ = \\ X$. Combining these two equations, we get, just like in the equation above:\n", - "\n", - "$$R \\ = \\ \\frac{X \\ + \\ N}{2}$$\n", - "\n", - "But $R$ must be an integer, thus $X \\ + \\ N$. Must be even. It follows that if $N$ is odd, then $X$ must also be odd to make an even number, and if $N$ is even, $X$ must also be even. From this, we come to the conclusion that if we have an even $N$, the probability of being at a position $X$ that is an odd value is $0$, and if $N$ is odd, then the probability of $X$ being even is $0$.\n", - "\n", - "And so we have shown that the probability distribution for the position of the walker for an $N$ step random \n", - "walk is given by a binomial distribution on the domain of the even or the odd numbers. This fact is important, as we will show that the probability distribution that is created when a quantum walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", - "\n", - "If you don't believe me and/or the math, we can visualize this a bit better by coding up a simple program! We will define a one-dimensional random walk, starting at the point $0$ on the integer number line. We will then repeatedly \"flip a coin\", and move left and right down the number line accordingly: " - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The walker is located at: x = 8\n" - ] - } - ], - "source": [ - "# Defines all of the necessary parameters\n", - "\n", - "N = 50 #Defines the total number of steps our walked will take\n", - "pr = 0.5 #Defines the probability of our walking stepping to the right\n", - "i = 0 #Defines the initial position of our walker\n", - "\n", - "def random_walk(pr, N, i):\n", - " \n", - " position = i\n", - " \n", - " # Repeatedly queries our random variable and moves our walker, for the specified number of steps\n", - " \n", - " for j in range(0, N): \n", - " \n", - " coin_flip = list(np.random.choice(2, 1, p=[1-pr, pr])) #Flips our weighted coin\n", - " position += 2*coin_flip[0]-1 #Moves our walker according to the coin flip \n", - " \n", - " return position\n", - " \n", - "print(\"The walker is located at: x = \"+str(random_walk(pr, N, i)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, let's attempt to generate the probabilitiy distribution corresponding to the walker's position, and make sure that it checks out with our math:" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAQGElEQVR4nO3df6xfdX3H8edrrXROIyhcnaPdbhe6JXWYTGsxcT+MbKyIoy4rW9Fo3VjQxCYuumjRBBnzj7Itdi6yRSIsiC6FsBmbtY4xMVliBusFFVaRecUqZTgLdDhmECvv/fE93b5+d8s9eL+3397PfT6Spud8zufc+/60ua/v+X7O+X5uqgpJUrt+ZNIFSJIWl0EvSY0z6CWpcQa9JDXOoJekxq2cdAGjzjjjjJqenp50GZK0pNx5550PV9XUXMdOuqCfnp5mZmZm0mVI0pKS5OvHO+bUjSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6glxZoesdepnfsnXQZ0nEZ9JLUOINekhpn0EtS4wx6qSfn4rVUGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY076X5nrDRJw0/VHNx5wQQrkcbHK3pJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWpcr6BPsinJfUlmk+yY4/gvJbkrydEkW0aObUvyle7PtnEVLknqZ96gT7ICuBo4H1gPXJxk/Ui3bwBvAf565NwXAO8HzgE2Au9P8vyFly1J6qvPFf1GYLaq7q+qJ4HdwObhDlV1sKruBp4aOffXgFur6tGqOgLcCmwaQ93SSc/fSKWTRZ+gPxN4YGj/UNfWR69zk1yaZCbJzOHDh3t+aUlSHyfFzdiquqaqNlTVhqmpqUmXI0lN6RP0DwJrhvZXd219LORcSdIY9An6/cC6JGuTnAJsBfb0/Pq3AOcleX53E/a8rk2SdILMG/RVdRTYziCg7wVuqqoDSa5MciFAklckOQRcBHwkyYHu3EeBP2LwYrEfuLJrkySdIL1+w1RV7QP2jbRdPrS9n8G0zFznXgdct4AaJUkLcFLcjJUkLR6DXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDWu13P0UmuGV5U8uPOCCVYiLT6v6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1LheQZ9kU5L7kswm2THH8VVJbuyO35Fkumt/VpLrk9yT5N4kl423fEnSfOYN+iQrgKuB84H1wMVJ1o90uwQ4UlVnAbuAq7r2i4BVVXU28HLgrcdeBCRJJ0afK/qNwGxV3V9VTwK7gc0jfTYD13fbNwPnJglQwHOSrASeDTwJfHsslUuSeukT9GcCDwztH+ra5uxTVUeBx4DTGYT+fwMPAd8A/rSqHh39BkkuTTKTZObw4cPPeBCSpONb7JuxG4HvAz8BrAXeleSnRztV1TVVtaGqNkxNTS1ySZK0vPQJ+geBNUP7q7u2Oft00zSnAo8AbwD+vqq+V1XfAj4HbFho0dJSNr1jL9M79k66DC0jfYJ+P7AuydokpwBbgT0jffYA27rtLcBtVVUMpmteA5DkOcArgS+Po3BJUj/zBn03574duAW4F7ipqg4kuTLJhV23a4HTk8wC7wSOPYJ5NfDcJAcYvGD8VVXdPe5BSJKOb2WfTlW1D9g30nb50PYTDB6lHD3v8bnaJUknTq+gl5aq4bnwgzsvmGAl0uS4BIIkNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1LiVfTol2QR8CFgBfLSqdo4cXwV8DHg58Ajw21V1sDv2UuAjwPOAp4BXVNUT4xqABDC9Y+//bh/cecEEK5FOPvNe0SdZAVwNnA+sBy5Osn6k2yXAkao6C9gFXNWduxL4OPC2qnoJ8Grge2OrXpI0rz5TNxuB2aq6v6qeBHYDm0f6bAau77ZvBs5NEuA84O6q+iJAVT1SVd8fT+mSpD76BP2ZwAND+4e6tjn7VNVR4DHgdOBngEpyS5K7krx7rm+Q5NIkM0lmDh8+/EzHIEl6Got9M3Yl8AvAG7u/fyPJuaOdquqaqtpQVRumpqYWuSRJWl76BP2DwJqh/dVd25x9unn5UxnclD0E/FNVPVxV3wH2AS9baNGSpP76BP1+YF2StUlOAbYCe0b67AG2ddtbgNuqqoBbgLOT/Fj3AvDLwJfGU7okqY95H6+sqqNJtjMI7RXAdVV1IMmVwExV7QGuBW5IMgs8yuDFgKo6kuSDDF4sCthXVXvn/EaSpEXR6zn6qtrHYNpluO3yoe0ngIuOc+7HGTxiKelpHPssgJ8D0Lj5yVhJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXG9gj7JpiT3JZlNsmOO46uS3NgdvyPJ9Mjxn0zyeJI/GE/ZkqS+5g36JCuAq4HzgfXAxUnWj3S7BDhSVWcBu4CrRo5/EPj0wsuVJD1Tfa7oNwKzVXV/VT0J7AY2j/TZDFzfbd8MnJskAEleD3wNODCekqXlZXrHXqZ37J10GVrC+gT9mcADQ/uHurY5+1TVUeAx4PQkzwXeA/zh032DJJcmmUkyc/jw4b61S5J6WOybsVcAu6rq8afrVFXXVNWGqtowNTW1yCVJ0vKyskefB4E1Q/uru7a5+hxKshI4FXgEOAfYkuSPgdOAp5I8UVUfXnDlkqRe+gT9fmBdkrUMAn0r8IaRPnuAbcA/A1uA26qqgF881iHJFcDjhrwknVjzBn1VHU2yHbgFWAFcV1UHklwJzFTVHuBa4IYks8CjDF4MJEkngT5X9FTVPmDfSNvlQ9tPABfN8zWu+CHqkyQtkJ+MlaTG9bqil04Ww8+TH9x5wQQrkZYOr+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxfjJWJyU/ASuNj1f0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvbRETe/Y+wOPoUrHY9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjegV9kk1J7ksym2THHMdXJbmxO35Hkumu/VeT3Jnknu7v14y3fEnSfOYN+iQrgKuB84H1wMVJ1o90uwQ4UlVnAbuAq7r2h4Ffr6qzgW3ADeMqXJLUT58r+o3AbFXdX1VPAruBzSN9NgPXd9s3A+cmSVV9vqr+vWs/ADw7yapxFC5J6qdP0J8JPDC0f6hrm7NPVR0FHgNOH+nzm8BdVfXd0W+Q5NIkM0lmDh8+3Ld2SVIPJ+RmbJKXMJjOeetcx6vqmqraUFUbpqamTkRJkrRs9An6B4E1Q/uru7Y5+yRZCZwKPNLtrwY+Cby5qr660IIlSc9Mn6DfD6xLsjbJKcBWYM9Inz0MbrYCbAFuq6pKchqwF9hRVZ8bV9GSpP7mDfpuzn07cAtwL3BTVR1IcmWSC7tu1wKnJ5kF3gkcewRzO3AWcHmSL3R/Xjj2UUiSjmtln05VtQ/YN9J2+dD2E8BFc5z3AeADC6xRkrQAfjJWkhpn0EtS43pN3UiLZfiXWx/cecEEK2nHsX9T/z11jFf0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS41zrRieEa9pIk+MVvSQ1zqCXlonpHXt/4J2Vlg+DXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOD0xprPxg1NLjLxNvn1f0ktQ4g16SGmfQS1LjnKPXD8W5+PY5d9+OXlf0STYluS/JbJIdcxxfleTG7vgdSaaHjl3Wtd+X5NfGV7pOhGPro7hGirR0zRv0SVYAVwPnA+uBi5OsH+l2CXCkqs4CdgFXdeeuB7YCLwE2AX/RfT1JS5Qv/EtPnyv6jcBsVd1fVU8Cu4HNI302A9d32zcD5yZJ1767qr5bVV8DZruvpwk53g+pP7xSu1JVT98h2QJsqqrf6/bfBJxTVduH+vxr1+dQt/9V4BzgCuD2qvp4134t8Omqunnke1wKXNrt/ixw38KHNhFnAA9PuogTaLmNF5bfmJfbeGHpjvmnqmpqrgMnxc3YqroGuGbSdSxUkpmq2jDpOk6U5TZeWH5jXm7jhTbH3Gfq5kFgzdD+6q5tzj5JVgKnAo/0PFeStIj6BP1+YF2StUlOYXBzdc9Inz3Atm57C3BbDeaE9gBbu6dy1gLrgH8ZT+mSpD7mnbqpqqNJtgO3ACuA66rqQJIrgZmq2gNcC9yQZBZ4lMGLAV2/m4AvAUeBt1fV9xdpLCeDJT/99Awtt/HC8hvzchsvNDjmeW/GSpKWNpdAkKTGGfSS1DiDfoySvCtJJTmj20+SP++WgLg7ycsmXeM4JPmTJF/uxvTJJKcNHWtyyYv5lgFpQZI1ST6b5EtJDiR5R9f+giS3JvlK9/fzJ13rOCVZkeTzSf6u21/bLeUy2y3tcsqka1wog35MkqwBzgO+MdR8PoMnjdYx+EDYX06gtMVwK/BzVfVS4N+Ay6DdJS96LgPSgqPAu6pqPfBK4O3dOHcAn6mqdcBnuv2WvAO4d2j/KmBXt6TLEQZLvCxpBv347ALeDQzf3d4MfKwGbgdOS/LiiVQ3RlX1D1V1tNu9ncHnI6DdJS/6LAOy5FXVQ1V1V7f9XwzC70x+cImT64HXT6bC8UuyGrgA+Gi3H+A1DJZygUbGa9CPQZLNwINV9cWRQ2cCDwztH+raWvK7wKe77VbH2+q4jqtbgfbngTuAF1XVQ92hbwIvmlBZi+HPGFygPdXtnw7859CFTBP/1yfFEghLQZJ/BH58jkPvA97LYNqmGU833qr6VNfnfQze7n/iRNamxZXkucDfAL9fVd8eXOQOVFUlaeKZ7CSvA75VVXcmefWk61lMBn1PVfUrc7UnORtYC3yx+4FYDdyVZCNLeAmI4433mCRvAV4HnFv/92GMJTveebQ6rv8nybMYhPwnqupvu+b/SPLiqnqom3r81uQqHKtXARcmeS3wo8DzgA8xmGJd2V3VN/F/7dTNAlXVPVX1wqqarqppBm/1XlZV32SwBMSbu6dvXgk8NvQWeMlKsonB290Lq+o7Q4daXfKizzIgS143P30tcG9VfXDo0PASJ9uAT53o2hZDVV1WVau7n9utDJZueSPwWQZLuUAj4/WKfnHtA17L4Kbkd4DfmWw5Y/NhYBVwa/cu5vaqelurS14cbxmQCZe1GF4FvAm4J8kXurb3AjuBm5JcAnwd+K0J1XeivAfYneQDwOcZvPgtaS6BIEmNc+pGkhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TG/Q+ngouJPKIM8AAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def dist(runs, N):\n", - " \n", - " positions = range(-1*N, N+1)\n", - " instances = [0 for i in range(-1*N, N+1)]\n", - " \n", - " for k in range(0, runs):\n", - "\n", - " result = random_walk(pr, N, i)\n", - " instances[positions.index(result)] += 1\n", - "\n", - " plt.bar(positions, [n/runs for n in instances])\n", - " plt.show()\n", - " \n", - "dist(10000, N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That looks pretty binomial to me (which is exactly what the math predicts)! We can now plot the distribution predicted in the math, and see if the two are the same:" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def height_calculate(x, N, pr):\n", - " \n", - " a = (N + x)/2\n", - " b = (N - x)/2\n", - " \n", - " if (x%2 == 0):\n", - " var = scipy.special.binom(N, a)*(pr**a)*((1-pr)**b)\n", - " else:\n", - " var = 0\n", - " return var\n", - "\n", - "heights = [height_calculate(x, N, pr) for x in positions]\n", - "plt.bar(positions, heights)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, the distributions looks very similar, with the midpoint having a probability of a little bit over $0.1$ in both graphs. Note that as we increase the `runs` variable, our simulated distribution will resemble our theoretical distribution more and more, as one would expect:" - ] - }, - { - "cell_type": "code", - "execution_count": 105, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "dist(50, N)\n", - "dist(100, N)\n", - "dist(500, N)\n", - "dist(1000, N)\n", - "dist(5000, N)\n", - "dist(10000, N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Quantum Walks**\n", - "\n", - "\n", - "The process of the quantum walk isn't that much different from its classical counterpart, although \n", - "the observed results of the two processes have many differences. First, let us motivate the creation of a \n", - "QW. The idea is that when one performs analysis on a classical random walk, you can find that \n", - "$\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, \n", - "and $T$ is the number of time-steps of the random walk. For the quantum walk, we can see that \n", - "$\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. \n", - "At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the \n", - "classical one, showing that the process of a QW is quadratically faster than its classical counterpart.\n", - "\n", - "\n", - "In order to create a quantum walk, we have to translate the components of the classical random walk \n", - "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a \n", - "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", - "looks something like this:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Going back to our original idea of some position vector $\\lvert j\\rangle$, it is apparent that in order to \n", - "encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector \n", - "to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", - "$H_W$ spanned by the following set:\n", - "\n", - "\n", - "$$H_W \\ = \\ \\{\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", - "\n", - "\n", - "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode \n", - "the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space \n", - "is spanned by the two basis states, representing forward and backward progression on our number-line-like \n", - "graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent \n", - "clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, \n", - "and we can again define our spanning set:\n", - "\n", - "\n", - "$$H_C \\ = \\ \\{\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", - "\n", - "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents \n", - "clock-wise motion. Now that we have defined all of the vectors we need to encode the information about \n", - "our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is \n", - "again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations \n", - "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given \n", - "by the binary representation of $j$ corresponding to the basis vector $\\lvert j\\rangle$. For the coin vector, \n", - "since we have only two states, we only need one qubit to encode the two possible states:\n", - "\n", - "\n", - "$$\\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\lvert 1\\rangle \\ = \\ \\lvert \\downarrow\\rangle$$\n", - "\n", - "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the \n", - "two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general \n", - "element of this Hilbert space as $\\lvert i\\rangle \\ \\otimes \\ \\lvert j\\rangle$.\n", - "\n", - "Moving right along, we now require a method to evolve our walk forward at each step. We define a random \n", - "walk evolution operator as follows:\n", - "\n", - "\n", - "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", - "\n", - "\n", - "By the way, I didn't come up with this operator, this came from the paper I referenced at the top of the \n", - "post. Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", - "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", - "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", - "\"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), \n", - "and then sums over all possible position states until it finds the position state to which the operator is \n", - "being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, \n", - "they're orthonormal!), and the new position state of the vector is $\\lvert j \\ \\pm \\ 1\\rangle$, depending on \n", - "the state of the coin vector. This did exactly what we wanted, it evolved our walk either forward or \n", - "backwards by one step! If you're still not convinced, let's check to see what happens when we have the state \n", - "$\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle$ and we apply the $U$ operator:\n", - "\n", - "\n", - " $$U (\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert \\Big )(\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle)$$\n", - " \n", - " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert 1\\rangle \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert 1\\rangle$$\n", - "\n", - "\n", - " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle \\ + \\ 0\\lvert \\downarrow\\rangle \\ \\otimes \\ \\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle$$\n", - "\n", - "\n", - " As you can see, it works! Now, we must consider the randomness of the classical random walk. For the purposes of our \n", - " quantum walk, we will \"set\" $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", - " it is necessary that we randomly flip the state of our coin vector $\\lvert i\\rangle$. The Hadamard \n", - " transformation seems like a natural choice, as:\n", - "\n", - "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\lvert \\uparrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ + \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\lvert \\downarrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ - \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", - "\n", - "\n", - " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the \n", - " right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" \n", - " that works as one complete step of the random walk, including randomizing the coin vector:\n", - "\n", - "\n", - " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Building a QW With Cirq**\n", - "\n", - "\n", - "Now, that we have established all of the necessary mathematical rigour to create a quantum walk, we \n", - "need to translate this into code. We can start by creating a qubit register, which will be used to represent \n", - "all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers \n", - "ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" - ] - }, - { - "cell_type": "code", - "execution_count": 214, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" - ] - } - ], - "source": [ - "number_qubits = 7\n", - "qubits = cirq.GridQubit.rect(1, number_qubits)\n", - "\n", - "print(qubits)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on \n", - "the simulation that we want to make. To start, let's say that our initial position vector for our \"walker\" \n", - "is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's \n", - "also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is \n", - "an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on \n", - "the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 215, - "metadata": {}, - "outputs": [], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have created and initialized our qubit register, we have to create an operation that can evolve \n", - "our walk forward by one step. At a high level, our evolution operation will follow this process:\n", - "\n", - "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", - "\n", - "\n", - "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", - "\n", - "\n", - "\n", - "\n", - "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker \n", - "steps forwards or backwards without ever having to be measured!\n", - "\n", - "\n", - "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \n", - "\"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with \n", - "adds or substracts $1$ from the position vector. \n", - "\n", - "\n", - "Before we actually dive into making the addition and substraction operators, it will be useful for us to define \n", - "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", - "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", - "standard $CNOT$ and Toffoli gates. In order to implement this, we can use the built-in function Cirq: `cirq.X(target).controlled_by(*controls)` (see Appendix A for an exact implementation of this gate with $CNOT$s)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, \n", - "the idea is:\n", - "\n", - "\n", - "\n", - "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", - "\n", - "\n", - "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", - "\n", - "\n", - "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", - "\n", - "\n", - "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", - "\n", - "\n", - "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition (This jusst cancels out when we apply the inverse operator to perform subtraction).\n", - "\n", - "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if \n", - "we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", - "\n", - "\n", - "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", - "\n", - "\n", - "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, \n", - "we get:\n", - "\n", - "\n", - " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", - "\n", - "\n", - "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", - "\n", - "\n", - "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", - "\n", - "\n", - "So basically, our subtraction operation will just be applying our addition operator, but with the order of \n", - "gates reversed. This allows us to create one general \"evolution operation\" for our walk, which adds \n", - "or substract $1$ to the walker's position vector, based on the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 216, - "metadata": {}, - "outputs": [], - "source": [ - "def walk_step():\n", - "\n", - " #\"Flip\" the coin vector\n", - "\n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " #Implement the Addition Operator\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " for i in range(number_qubits, 0, -1):\n", - " \n", - " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", - " if (i > 1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " #Implement the Substraction Operator\n", - "\n", - " for i in range(1, number_qubits+1):\n", - "\n", - " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", - " if (i < number_qubits):\n", - " yield cirq.X.on(cirq.GridQubit(0, i))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the \n", - "``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position \n", - "vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the \n", - "example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector \n", - "qubits, we have:" - ] - }, - { - "cell_type": "code", - "execution_count": 222, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({12: 1177, 14: 663, 20: 334, 10: 318, 16: 293, 52: 274, 18: 227, 48: 157, 22: 151, 40: 131, 28: 130, 54: 129, 32: 126, 30: 124, 26: 121, 42: 108, 36: 97, 38: 95, 24: 94, 34: 78, 44: 61, 46: 58, 50: 19, 8: 18, 56: 16, 58: 1})\n" - ] - } - ], - "source": [ - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 5000\n", - "\n", - "def generate_walk(number_qubits, iterator, sample_number):\n", - "\n", - " circuit = cirq.Circuit()\n", - "\n", - " circuit.append(initial_state())\n", - " for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - " circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - " simulator = cirq.Simulator()\n", - " result = simulator.run(circuit, repetitions=sample_number)\n", - " final = result.histogram(key='x')\n", - "\n", - " print(final)\n", - " return final\n", - "\n", - "final = generate_walk(number_qubits, iterator, sample_number)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", - "number of occurences of that position vector value on the y-axis. This gives us a probability distribution for \n", - "the position of the walker. It is important to note that the graphs will only have either even or odd \n", - "numbered data point, depending on the initial position of the walker and the number of steps taken:" - ] - }, - { - "cell_type": "code", - "execution_count": 223, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def graph(final):\n", - "\n", - " x_arr = list(final.keys())\n", - " y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - " x_arr_final = []\n", - " y_arr_final = []\n", - "\n", - " while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - " plt.plot(x_arr_final, y_arr_final)\n", - " plt.scatter(x_arr_final, y_arr_final)\n", - " plt.show()\n", - "\n", - "graph(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated \n", - "applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to \n", - "the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ \n", - "and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", - "and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. \n", - "In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " - ] - }, - { - "cell_type": "code", - "execution_count": 224, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({52: 1222, 50: 691, 44: 362, 54: 296, 48: 271, 12: 266, 46: 189, 16: 167, 10: 141, 42: 140, 36: 128, 24: 125, 32: 112, 22: 108, 26: 103, 34: 103, 38: 99, 30: 95, 40: 88, 28: 84, 20: 65, 18: 60, 56: 34, 14: 29, 8: 21, 6: 1})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - "\n", - "final = generate_walk(number_qubits, iterator, sample_number)\n", - "graph(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one \n", - "more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our \n", - "distribution towards only one side! We will set our initial state to:\n", - "\n", - "\n", - "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", - "the qubit. When we simulate this with Cirq, we get:" - ] - }, - { - "cell_type": "code", - "execution_count": 225, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({12: 718, 52: 718, 50: 348, 14: 315, 10: 259, 16: 237, 54: 235, 48: 228, 44: 191, 20: 188, 22: 147, 18: 146, 46: 135, 42: 128, 36: 126, 38: 125, 26: 111, 34: 108, 30: 105, 24: 101, 28: 101, 32: 100, 40: 96, 8: 18, 56: 16})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " \n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - "final = generate_walk(number_qubits, iterator, sample_number)\n", - "graph(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we get a probability distribution that is much more symetric!\n", - "\n", - "\n", - "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to \n", - "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", - "example of a QW and many more great projects that can be made by utilizing this interesting process! \n", - "\n", - "**References**\n", - "\n", - "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", - "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", - "\n", - "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Appendix A: Creating $n$-Qubit toffoli Gates From Scratch**" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" - ] - } - ], - "source": [ - "ancilla = cirq.GridQubit.rect(1, number_qubits-1, 1)\n", - "print(ancilla)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this implementation, we implemented the $n$-qubit Toffoli with a built-in function in Cirq. However, the actual decomposition of this gate must be done in terms of Toffoli gates, with a qubit ancilla (whcih we defined above).\n", - "\n", - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", - "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", - "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", - "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", - "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", - "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", - "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", - "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 0): ───@───────────────────────@───\n", - " │ │\n", - "(0, 1): ───@───────────────────────@───\n", - " │ │\n", - "(0, 2): ───┼───@───────────────@───┼───\n", - " │ │ │ │\n", - "(0, 3): ───┼───┼───@───────@───┼───┼───\n", - " │ │ │ │ │ │\n", - "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", - " │ │ │ │ │ │ │\n", - "(1, 0): ───X───@───┼───┼───┼───@───X───\n", - " │ │ │ │ │\n", - "(1, 1): ───────X───@───┼───@───X───────\n", - " │ │ │\n", - "(1, 2): ───────────X───@───X───────────\n" - ] - } - ], - "source": [ - "number_qubits = 4\n", - "\n", - "def apply_n_qubit_tof(ancilla, args):\n", - "\n", - " if (len(args) == 2):\n", - " yield cirq.CNOT.on(args[0], args[1])\n", - "\n", - " elif (len(args) == 3):\n", - " yield cirq.CCX.on(args[0], args[1], args[2])\n", - "\n", - " else:\n", - "\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - " for k in range(2, len(args)-1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - "\n", - " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", - "\n", - " for k in range(len(args)-2, 1, -1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - "\n", - "\n", - "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", - "circuit = cirq.Circuit()\n", - "circuit.append(apply_n_qubit_tof(ancilla, control))\n", - "print(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", - "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", - "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/examples/notebook_tutorials/random_walk_tutorial.ipynb b/examples/notebook_tutorials/random_walk_tutorial.ipynb index bec009c674d..ba06c19d95d 100644 --- a/examples/notebook_tutorials/random_walk_tutorial.ipynb +++ b/examples/notebook_tutorials/random_walk_tutorial.ipynb @@ -7,6 +7,15 @@ "# Quantum Walks With Cirq - Tutorial" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The goal of this Notebook is to provide an interesting exposition into simulating quantum computational processes with Cirq. We will be investigating a very fundamental and interesting idea within quantum computing called the **quantum walk**, starting off with some information on classical random walks, and then building upon that knowledge to understand exactly what a quantum walk is, all while simulating the processes that are outlined mathematically with Cirq. \n", + "\n", + "In order to get started, we first need to import these libraries:" + ] + }, { "cell_type": "code", "execution_count": 78, @@ -20,19 +29,28 @@ "import scipy" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Obviously, we'll need `cirq`. The `random` library is used to simulate our classical random walk, `matplotlib` is used to create graphs, and `numpy` and `scipy` are used for procesing vectors, matrices, and more.\n", + "\n", + "Before we get started with quantum walks, let's first look into it's classical counterpart, and understand what a \"walk\" truly is:" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Classical Random Walks**\n", "\n", - "A random walks is a random process involving a \"walker\" that is placed in some $n$-dimensional medium \n", - "(like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement,\n", - "the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is \n", + "A random walk is a random process involving a \"walker\" that is placed in some $n$-dimensional medium, like a grid or a graph. \n", + "We then repeatedly query some random variable, and based on the outcome of our measurement,\n", + "the walker's position vector (position on the graph or grid) is updated. A basic example of a random walk is \n", "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", "at each of the integers. Let the initial position vector of our marker be $\\lvert 0\\rangle$. For $N$ steps of our\n", - "random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", - "$1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute\n", + "random walk, take a set of $N$ random variables $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", + "$1$ or $-1$ with equal probability. To find the updated position vector of our walker, we compute\n", "the value:\n", "\n", "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", @@ -43,18 +61,17 @@ "$$\\lvert \\text{Final}\\rangle \\ = \\ \\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", "\n", "\n", - "So for our case, the final position vector is simply $\\lvert j\\rangle$. This model of a random walk can easily \n", + "So for our case, the final position vector is $\\lvert j\\rangle$. This model of a random walk can \n", "be generalized to $n$-dimensions. \n", "\n", "\n", "Another important fact to note is that for a discrete, 1-dimensional random \n", "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", - "a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", + "a [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution). Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", "that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random \n", "walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability \n", - "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is \n", - "given by:\n", + "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is:\n", "\n", "\n", "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$" @@ -215,7 +232,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As you can see, the distributions looks very similar, with the midpoint having a probability of a little bit over $0.1$ in both graphs. Note that as we increase the `runs` variable, our simulated distribution will resemble our theoretical distribution more and more, as one would expect:" + "As you can see, the distributions look very similar, with the midpoint having a probability of a little bit over $0.1$ in both graphs. Note that as we increase the `runs` variable, our simulated distribution will resemble our theoretical distribution more and more, as one would expect:" ] }, { @@ -324,7 +341,7 @@ "\n", "In order to create a quantum walk, we have to translate the components of the classical random walk \n", "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a \n", + "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a basic case of a \n", "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", "looks something like this:\n", "\n", @@ -356,7 +373,7 @@ "clock-wise motion. Now that we have defined all of the vectors we need to encode the information about \n", "our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is \n", "again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations \n", - "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given \n", + "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will be given \n", "by the binary representation of $j$ corresponding to the basis vector $\\lvert j\\rangle$. For the coin vector, \n", "since we have only two states, we only need one qubit to encode the two possible states:\n", "\n", @@ -743,25 +760,25 @@ "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", "\n", "\n", - "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", + "This is implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", "the qubit. When we simulate this with Cirq, we get:" ] }, { "cell_type": "code", - "execution_count": 225, + "execution_count": 226, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Counter({12: 718, 52: 718, 50: 348, 14: 315, 10: 259, 16: 237, 54: 235, 48: 228, 44: 191, 20: 188, 22: 147, 18: 146, 46: 135, 42: 128, 36: 126, 38: 125, 26: 111, 34: 108, 30: 105, 24: 101, 28: 101, 32: 100, 40: 96, 8: 18, 56: 16})\n" + "Counter({12: 742, 52: 715, 50: 342, 14: 335, 10: 247, 54: 232, 20: 224, 48: 216, 16: 209, 44: 202, 22: 151, 42: 147, 46: 144, 18: 120, 34: 118, 30: 112, 32: 108, 26: 108, 28: 107, 36: 105, 40: 98, 24: 96, 38: 93, 56: 15, 8: 14})\n" ] }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
          " ] @@ -939,5 +956,5 @@ } }, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } From 46b4b559edfe98ecb673052896fc6c8dbddc67fe Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Thu, 30 Jan 2020 23:12:03 -0500 Subject: [PATCH 18/29] New 2 --- examples/notebook_tutorials/random_walk_tutorial.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/notebook_tutorials/random_walk_tutorial.ipynb b/examples/notebook_tutorials/random_walk_tutorial.ipynb index ba06c19d95d..ca739389040 100644 --- a/examples/notebook_tutorials/random_walk_tutorial.ipynb +++ b/examples/notebook_tutorials/random_walk_tutorial.ipynb @@ -11,7 +11,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The goal of this Notebook is to provide an interesting exposition into simulating quantum computational processes with Cirq. We will be investigating a very fundamental and interesting idea within quantum computing called the **quantum walk**, starting off with some information on classical random walks, and then building upon that knowledge to understand exactly what a quantum walk is, all while simulating the processes that are outlined mathematically with Cirq. \n", + "The goal of this Notebook is to provide an interesting exposition to simulating quantum computational processes with Cirq. We will be investigating a very fundamental and interesting idea within quantum computing called the **quantum walk**, starting off with some information on classical random walks, and then building upon that knowledge to understand exactly what a quantum walk is, all while simulating the processes that are outlined mathematically with Cirq. \n", "\n", "In order to get started, we first need to import these libraries:" ] From c735381ae637964f56f707795d579ab38e15133a Mon Sep 17 00:00:00 2001 From: Victory Omole Date: Fri, 31 Jan 2020 06:05:45 -0600 Subject: [PATCH 19/29] Delete random_walk_tutorial-checkpoint.ipynb --- .../random_walk_tutorial-checkpoint.ipynb | 766 ------------------ 1 file changed, 766 deletions(-) delete mode 100644 examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb diff --git a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb b/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb deleted file mode 100644 index 6e954a725f5..00000000000 --- a/examples/.ipynb_checkpoints/random_walk_tutorial-checkpoint.ipynb +++ /dev/null @@ -1,766 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quantum Random Walks With Cirq - Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Classical Random Walks**\n", - "\n", - "A random walks is a random process involving a \"walker\" that is placed in some $n$-dimensional medium \n", - "(like a grid or a graph). We then repeatedly query some random variable, and based on the outcome of our measurement,\n", - "the walker's position vector (position on the graph or grid) is updated. A very basic example of a random walk is \n", - "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", - "at each of the integers. Let the initial position vector of our marker be $\\lvert 0\\rangle$. For $N$ steps of our\n", - "random walk, so take a set of $N$ random variables, $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", - "$1$ or $-1$ with equal probability ($0.5$). To find the updated position vector of our walker, we simply compute\n", - "the value:\n", - "\n", - "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", - "\n", - "Where we know:\n", - "\n", - "\n", - "$$\\lvert \\text{Final}\\rangle \\ = \\ \\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", - "\n", - "\n", - "So for our case, the final position vector is simply $\\lvert j\\rangle$. This model of a random walk can easily \n", - "be generalized to $n$-dimensions. Another important fact to note is that for a discrete, 1-dimensional random \n", - "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", - "a binomial distribution. Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", - "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", - "that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random \n", - "walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability \n", - "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is \n", - "given by:\n", - "\n", - "\n", - "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$\n", - "\n", - "\n", - "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position \n", - "$X \\ = \\ L \\ - \\ R$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", - "that for a random walk of $N$ steps, the position of the walker is determined by the number of left steps, \n", - "minus the number of right steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", - "to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ \n", - "by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. \n", - "Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, \n", - "and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ \n", - "steps by calculating the binomial coefficient, therefore getting:\n", - "\n", - "\n", - "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$\n", - "$\\Rightarrow \\ X \\ = \\ L \\ - \\ R \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ - \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ - \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ + \\ X}{2}}$$\n", - "\n", - "\n", - "And so we have shown that the probability distribution for the position of the walker for an $N$ step random \n", - "walk is given by a binomial distribution. This fact is important, as we will show that the probability \n", - "distribution that is created when a quantum random walk is simulated is nowhere close to the binomial \n", - "distribution that we expect to see for a classical 1-dimensional random walk.\n", - "\n", - "\n", - "\n", - "**Quantum Random Walks**\n", - "\n", - "\n", - "The process of the quantum random walk isn't that much different from its classical counterpart, although \n", - "the observed results of the two processes have many differences. First, let us motivate the creation of a \n", - "QRW. The idea is that when one performs analysis on a classical random walk, you can find that \n", - "$\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, \n", - "and $T$ is the number of time-steps of the random walk. For the quantum random walk, we can see that \n", - "$\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. \n", - "At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the \n", - "classical one, showing that the process of a QRW is quadratically faster than its classical counterpart.\n", - "\n", - "\n", - "In order to create a quantum random walk, we have to translate the components of the classical random walk \n", - "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a very basic case of a \n", - "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", - "looks something like this:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Going back to our original idea of some position vector $\\lvert j\\rangle$, it is apparent that in order to \n", - "encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector \n", - "to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", - "$H_W$ spanned by the following set:\n", - "\n", - "\n", - "$$H_W \\ = \\ \\{\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", - "\n", - "\n", - "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode \n", - "the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space \n", - "is spanned by the two basis states, representing forward and backward progression on our number-line-like \n", - "graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent \n", - "clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, \n", - "and we can again define our spanning set:\n", - "\n", - "\n", - "$$H_C \\ = \\ \\{\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", - "\n", - "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents \n", - "clock-wise motion. Now that we have defined all of the vectors we need to encode the information about \n", - "our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is \n", - "again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations \n", - "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will simply be given \n", - "by the binary representation of $j$ corresponding to the basis vector $\\lvert j\\rangle$. For the coin vector, \n", - "since we have only two states, we only need one qubit to encode the two possible states:\n", - "\n", - "\n", - "$$\\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\lvert 1\\rangle \\ = \\ \\lvert \\downarrow\\rangle$$\n", - "\n", - "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the \n", - "two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general \n", - "element of this Hilbert space as $\\lvert i\\rangle \\ \\otimes \\ \\lvert j\\rangle$.\n", - "\n", - "Moving right along, we now require a method to evolve our random walk forward at each step. We define a random \n", - "walk evolution operator as follows:\n", - "\n", - "\n", - "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", - "\n", - "\n", - "By the way, I didn't come up with this genius operator, this came from the paper I referenced at the top of the \n", - "post. Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", - "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", - "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", - "\"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), \n", - "and then sums over all possible position states until it finds the position state to which the operator is \n", - "being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, \n", - "they're orthonormal!), and the new position state of the vector is $\\lvert j \\ \\pm \\ 1\\rangle$, depending on \n", - "the state of the coin vector. This did exactly what we wanted, it evolved our random walk either forward or \n", - "backwards by one step! If you're still not convinced, let's check to see what happens when we have the state \n", - "$\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle$ and we apply the $U$ operator:\n", - "\n", - "\n", - " $$U (\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert \\Big )(\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle)$$\n", - " \n", - " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert 1\\rangle \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert 1\\rangle$$\n", - "\n", - "\n", - " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle \\ + \\ 0\\lvert \\downarrow\\rangle \\ \\otimes \\ \\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle$$\n", - "\n", - "\n", - " As you can see, it works! Now, we must consider the randomness of the random walk. For the purposes of our \n", - " random walk, we will set $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", - " it is necessary that we randomly flip the state of our coin vector $\\lvert i\\rangle$. The Hadamard \n", - " transformation seems like a natural choice, as:\n", - "\n", - "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\lvert \\uparrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ + \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\lvert \\downarrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ - \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", - "\n", - "\n", - " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the \n", - " right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" \n", - " that works as one complete step of the random walk, including randomizing the coin vector:\n", - "\n", - "\n", - " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Tutorial: Building a QRW With Cirq**\n", - "\n", - "\n", - "Now, that we have established all of the necessary mathematical rigour to create a quantum random walk, we \n", - "need to translate this into code. We can start by creating a qubit register, which will be used to represent \n", - "all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers \n", - "ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" - ] - } - ], - "source": [ - "import cirq\n", - "import random\n", - "import numpy as np\n", - "import copy\n", - "import sympy\n", - "import itertools\n", - "from matplotlib import pyplot as plt\n", - "\n", - "number_qubits = 7\n", - "\n", - "qubits = []\n", - "for i in range(0, number_qubits):\n", - " qubits.append(cirq.GridQubit(0, i))\n", - "\n", - "print(qubits)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on \n", - "the simulation that we want to make. To start, let's say that our initial position vector for our \"random walker\" \n", - "is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's \n", - "also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is \n", - "an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on \n", - "the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have created and initialized our qubit register, we have to create an operation that can evolve \n", - "our random walk forward by one step. At a high level, our evolution operation will follow this process:\n", - "\n", - "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", - "\n", - "\n", - "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the random walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", - "\n", - "\n", - "\n", - "\n", - "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker \n", - "steps forwards or backwards without ever having to be measured!\n", - "\n", - "\n", - "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \n", - "\"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with \n", - "adds or substracts $1$ from the position vector. \n", - "\n", - "\n", - "Before we actually dive into making the addition and substraction operators, it will be useful for us to define \n", - "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", - "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", - "standard $CNOT$ and Toffoli gates.\n", - "\n", - "\n", - "In order to implement this, we have to use a series of Toffoli gates, along with a collection of ancilla \n", - "qubits ($n \\ - \\ 1$) ancilla qubits to be exact:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" - ] - } - ], - "source": [ - "ancilla = []\n", - "for i in range(0, number_qubits):\n", - " ancilla.append(cirq.GridQubit(1, i))\n", - "\n", - "print(ancilla)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", - "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", - "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", - "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", - "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", - "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", - "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "\n", - "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", - "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 0): ───@───────────────────────@───\n", - " │ │\n", - "(0, 1): ───@───────────────────────@───\n", - " │ │\n", - "(0, 2): ───┼───@───────────────@───┼───\n", - " │ │ │ │\n", - "(0, 3): ───┼───┼───@───────@───┼───┼───\n", - " │ │ │ │ │ │\n", - "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", - " │ │ │ │ │ │ │\n", - "(1, 0): ───X───@───┼───┼───┼───@───X───\n", - " │ │ │ │ │\n", - "(1, 1): ───────X───@───┼───@───X───────\n", - " │ │ │\n", - "(1, 2): ───────────X───@───X───────────\n" - ] - } - ], - "source": [ - "number_qubits = 4\n", - "\n", - "def apply_n_qubit_tof(ancilla, args):\n", - "\n", - " if (len(args) == 2):\n", - " yield cirq.CNOT.on(args[0], args[1])\n", - "\n", - " elif (len(args) == 3):\n", - " yield cirq.CCX.on(args[0], args[1], args[2])\n", - "\n", - " else:\n", - "\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - " for k in range(2, len(args)-1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - "\n", - " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", - "\n", - " for k in range(len(args)-2, 1, -1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - "\n", - "\n", - "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", - "circuit = cirq.Circuit()\n", - "circuit.append(apply_n_qubit_tof(ancilla, control))\n", - "print(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", - "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", - "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, \n", - "the idea is:\n", - "\n", - "\n", - "\n", - "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", - "\n", - "\n", - "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", - "\n", - "\n", - "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", - "\n", - "\n", - "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", - "\n", - "\n", - "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition.\n", - "\n", - "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if \n", - "we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", - "\n", - "\n", - "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", - "\n", - "\n", - "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, \n", - "we get:\n", - "\n", - "\n", - " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", - "\n", - "\n", - "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", - "\n", - "\n", - "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", - "\n", - "\n", - "So basically, our subtraction operation will just be applying our addition operator, but with the order of \n", - "gates reversed. This allows us to create one general \"evolution operation\" for our random walk, which adds \n", - "or substract $1$ to the random walkers position vector, based on the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "def walk_step():\n", - "\n", - " #\"Flip\" the coin vector\n", - "\n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " #Implement the Addition Operator\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " for i in range(number_qubits, 0, -1):\n", - "\n", - " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " for i in range(number_qubits, 0, -1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " #Implement the Substraction Operator\n", - "\n", - " for i in range(number_qubits, 0, -1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " for i in range(1, number_qubits+1):\n", - "\n", - " yield apply_n_qubit_tof(ancilla, [cirq.GridQubit(0, v) for v in range(number_qubits, i-2, -1)])\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the \n", - "``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position \n", - "vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the \n", - "example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector \n", - "qubits, we have:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({12: 50, 14: 24, 20: 16, 10: 15, 16: 13, 52: 12, 42: 8, 22: 7, 34: 7, 24: 6, 48: 5, 32: 5, 30: 4, 54: 4, 40: 4, 36: 4, 38: 4, 18: 3, 46: 3, 26: 3, 44: 2, 50: 1})\n" - ] - } - ], - "source": [ - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", - "number of occurences of that position vector value on the y-axis. This gives us a probability distribution for \n", - "the position of the random walker. It is important to note that the graphs will only have either even or odd \n", - "numbered data point, depending on the initial position of the walker and the number of steps taken:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated \n", - "applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to \n", - "the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ \n", - "and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", - "and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. \n", - "In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({52: 46, 50: 21, 44: 15, 12: 14, 54: 12, 42: 8, 48: 7, 16: 6, 10: 6, 40: 6, 32: 6, 30: 6, 26: 6, 46: 6, 38: 5, 34: 5, 36: 5, 22: 5, 28: 4, 14: 3, 24: 3, 56: 2, 18: 2, 20: 1})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - "\n", - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)\n", - "\n", - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one \n", - "more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our \n", - "distribution towards only one side! We will set our initial state to:\n", - "\n", - "\n", - "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "This is easily implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", - "the qubit. When we simulate this with Cirq, we get:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({52: 31, 12: 26, 20: 13, 10: 12, 54: 10, 14: 10, 46: 9, 48: 9, 30: 8, 16: 8, 42: 8, 50: 7, 22: 6, 34: 6, 38: 6, 28: 5, 40: 4, 44: 4, 32: 4, 36: 4, 26: 3, 24: 3, 18: 2, 56: 1, 8: 1})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " \n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 200\n", - "\n", - "circuit = cirq.Circuit()\n", - "\n", - "circuit.append(initial_state())\n", - "\n", - "for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - "circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - "simulator = cirq.Simulator()\n", - "result = simulator.run(circuit, repetitions=sample_number)\n", - "final = result.histogram(key='x')\n", - "\n", - "print(final)\n", - "\n", - "x_arr = [j for j in dict(final).keys()]\n", - "y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - "x_arr_final = []\n", - "y_arr_final = []\n", - "\n", - "while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - "plt.plot(x_arr_final, y_arr_final)\n", - "plt.scatter(x_arr_final, y_arr_final)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we get a probability distribution that is much more symetric!\n", - "\n", - "\n", - "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to \n", - "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", - "example of a QRW and many more great projects that can be made by utilizing this interesting process! \n", - "\n", - "**References**\n", - "\n", - "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", - "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", - "\n", - "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 080020fad3732ac7198aa227415cbc080d85dd65 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Sun, 23 Feb 2020 21:43:42 -0500 Subject: [PATCH 20/29] Fixed --- .../random_walk_tutorial.ipynb | 147 ++---------------- 1 file changed, 16 insertions(+), 131 deletions(-) diff --git a/examples/notebook_tutorials/random_walk_tutorial.ipynb b/examples/notebook_tutorials/random_walk_tutorial.ipynb index ca739389040..748cdbea802 100644 --- a/examples/notebook_tutorials/random_walk_tutorial.ipynb +++ b/examples/notebook_tutorials/random_walk_tutorial.ipynb @@ -11,6 +11,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "The goal of this Notebook is to provide an interesting exposition to simulating quantum computational processes with Cirq. We will be investigating a very fundamental and interesting idea within quantum computing called the **quantum walk**, starting off with some information on classical random walks, and then building upon that knowledge to understand exactly what a quantum walk is, all while simulating the processes that are outlined mathematically with Cirq. \n", "\n", "In order to get started, we first need to import these libraries:" @@ -18,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -33,7 +34,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Obviously, we'll need `cirq`. The `random` library is used to simulate our classical random walk, `matplotlib` is used to create graphs, and `numpy` and `scipy` are used for procesing vectors, matrices, and more.\n", + "Obviously, we'll need `cirq`. The `random` library is used to simulate our classical random walk, `matplotlib` is used to create graphs, and `numpy` and `scipy` are used for processing vectors, matrices, and more.\n", "\n", "Before we get started with quantum walks, let's first look into it's classical counterpart, and understand what a \"walk\" truly is:" ] @@ -94,7 +95,7 @@ "\n", "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R} \\Rightarrow \\ X \\ = \\ R \\ - \\ L \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ + \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ + \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ - \\ X}{2}}$$\n", "\n", - "It is important to note that this only holds true for **even numbers** if the total number of steps taken is even, and **odd numbers** if the total number of steps taken is odd. This is due to the fact that if I set the number of steps that my random walk can take to $N$, then as we previously demonstrated, $L \\ + \\ R \\ = \\ N$ and $R \\ - \\ L \\ = \\ X$. Combining these two equations, we get, just like in the equation above:\n", + "It is important to note that this only holds true for **even numbers** if the total number of steps taken is even, and **odd numbers** if the total number of steps taken is odd. This is due to the fact that if we set the number of steps that the random walk can take to $N$, then as we previously demonstrated, $L \\ + \\ R \\ = \\ N$ and $R \\ - \\ L \\ = \\ X$. Combining these two equations, we get, just like in the equation above:\n", "\n", "$$R \\ = \\ \\frac{X \\ + \\ N}{2}$$\n", "\n", @@ -108,14 +109,14 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "The walker is located at: x = 8\n" + "The walker is located at: x = -4\n" ] } ], @@ -139,14 +140,14 @@ " \n", " return position\n", " \n", - "print(\"The walker is located at: x = \"+str(random_walk(pr, N, i)))" + "print(\"The walker is located at: x = {var}\".format(var = random_walk(pr, N, i)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Now, let's attempt to generate the probabilitiy distribution corresponding to the walker's position, and make sure that it checks out with our math:" + "Now, let's attempt to generate the probability distribution corresponding to the walker's position, and make sure that it checks out with our math:" ] }, { @@ -361,7 +362,7 @@ "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode \n", "the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space \n", "is spanned by the two basis states, representing forward and backward progression on our number-line-like \n", - "graph (actually, I guess our graph looks more like a ring, so I guess our two basis states will represent \n", + "graph (actually, our graph looks more like a ring, so the two basis states will represent \n", "clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, \n", "and we can again define our spanning set:\n", "\n", @@ -392,8 +393,7 @@ "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", "\n", "\n", - "By the way, I didn't come up with this operator, this came from the paper I referenced at the top of the \n", - "post. Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", + "Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", "\"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), \n", @@ -508,10 +508,10 @@ "\n", "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \n", "\"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with \n", - "adds or substracts $1$ from the position vector. \n", + "adds or subtracts $1$ from the position vector. \n", "\n", "\n", - "Before we actually dive into making the addition and substraction operators, it will be useful for us to define \n", + "Before we actually dive into making the addition and subtraction operators, it will be useful for us to define \n", "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", "standard $CNOT$ and Toffoli gates. In order to implement this, we can use the built-in function Cirq: `cirq.X(target).controlled_by(*controls)` (see Appendix A for an exact implementation of this gate with $CNOT$s)." @@ -653,7 +653,7 @@ "metadata": {}, "source": [ "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", - "number of occurences of that position vector value on the y-axis. This gives us a probability distribution for \n", + "number of occurrences of that position vector value on the y-axis. This gives us a probability distribution for \n", "the position of the walker. It is important to note that the graphs will only have either even or odd \n", "numbered data point, depending on the initial position of the walker and the number of steps taken:" ] @@ -709,7 +709,7 @@ "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated \n", "applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to \n", "the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ \n", - "and repeatedlly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", + "and repeatedly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", "and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. \n", "In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " ] @@ -805,135 +805,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "So we get a probability distribution that is much more symetric!\n", + "So we get a probability distribution that is much more symmetric!\n", "\n", "\n", - "Random walks have applications in so many fields of scientfific inquiry, ranging from biology, to \n", + "Random walks have applications in so many fields of scientific inquiry, ranging from biology, to \n", "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", "example of a QW and many more great projects that can be made by utilizing this interesting process! \n", "\n", "**References**\n", "\n", - "The first section of this tutorial was taken from this blog post (written by the same person who wrote this tutorial): https://lucaman99.github.io/blog/2019/08/03/Quantum-Random-Walks.html\n", - "\n", "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", "\n", "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", "\n" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Appendix A: Creating $n$-Qubit toffoli Gates From Scratch**" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(1, 0), cirq.GridQubit(1, 1), cirq.GridQubit(1, 2), cirq.GridQubit(1, 3), cirq.GridQubit(1, 4), cirq.GridQubit(1, 5), cirq.GridQubit(1, 6)]\n" - ] - } - ], - "source": [ - "ancilla = cirq.GridQubit.rect(1, number_qubits-1, 1)\n", - "print(ancilla)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this implementation, we implemented the $n$-qubit Toffoli with a built-in function in Cirq. However, the actual decomposition of this gate must be done in terms of Toffoli gates, with a qubit ancilla (whcih we defined above).\n", - "\n", - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", - "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", - "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", - "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", - "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", - "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", - "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", - "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0, 0): ───@───────────────────────@───\n", - " │ │\n", - "(0, 1): ───@───────────────────────@───\n", - " │ │\n", - "(0, 2): ───┼───@───────────────@───┼───\n", - " │ │ │ │\n", - "(0, 3): ───┼───┼───@───────@───┼───┼───\n", - " │ │ │ │ │ │\n", - "(0, 4): ───┼───┼───┼───X───┼───┼───┼───\n", - " │ │ │ │ │ │ │\n", - "(1, 0): ───X───@───┼───┼───┼───@───X───\n", - " │ │ │ │ │\n", - "(1, 1): ───────X───@───┼───@───X───────\n", - " │ │ │\n", - "(1, 2): ───────────X───@───X───────────\n" - ] - } - ], - "source": [ - "number_qubits = 4\n", - "\n", - "def apply_n_qubit_tof(ancilla, args):\n", - "\n", - " if (len(args) == 2):\n", - " yield cirq.CNOT.on(args[0], args[1])\n", - "\n", - " elif (len(args) == 3):\n", - " yield cirq.CCX.on(args[0], args[1], args[2])\n", - "\n", - " else:\n", - "\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - " for k in range(2, len(args)-1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - "\n", - " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", - "\n", - " for k in range(len(args)-2, 1, -1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - "\n", - "\n", - "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", - "circuit = cirq.Circuit()\n", - "circuit.append(apply_n_qubit_tof(ancilla, control))\n", - "print(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", - "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", - "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." - ] } ], "metadata": { From 0cf81da002290fd763f560f3db0ecb0942172be1 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Sun, 23 Feb 2020 21:47:58 -0500 Subject: [PATCH 21/29] Fixed3 --- examples/notebook_tutorials/random_walk_tutorial.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/notebook_tutorials/random_walk_tutorial.ipynb b/examples/notebook_tutorials/random_walk_tutorial.ipynb index 748cdbea802..2964602a2f3 100644 --- a/examples/notebook_tutorials/random_walk_tutorial.ipynb +++ b/examples/notebook_tutorials/random_walk_tutorial.ipynb @@ -34,7 +34,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Obviously, we'll need `cirq`. The `random` library is used to simulate our classical random walk, `matplotlib` is used to create graphs, and `numpy` and `scipy` are used for processing vectors, matrices, and more.\n", + "First, we'll need `cirq`. The `random` library is used to simulate our classical random walk, `matplotlib` is used to create graphs, and `numpy` and `scipy` are used for processing vectors, matrices, and more.\n", "\n", "Before we get started with quantum walks, let's first look into it's classical counterpart, and understand what a \"walk\" truly is:" ] From e4089c2b6744e3a4d354522533728dd266f2b740 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 2 Mar 2020 12:26:52 -0500 Subject: [PATCH 22/29] New --- examples/notebook_tutorials/new_test.py | 57 ------------------------- 1 file changed, 57 deletions(-) delete mode 100644 examples/notebook_tutorials/new_test.py diff --git a/examples/notebook_tutorials/new_test.py b/examples/notebook_tutorials/new_test.py deleted file mode 100644 index 232e3676839..00000000000 --- a/examples/notebook_tutorials/new_test.py +++ /dev/null @@ -1,57 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -import pytest - -import nbformat - - -def find_examples_jupyter_notebook_paths(): - examples_folder = os.path.dirname(__file__) - for filename in os.listdir(examples_folder): - if not filename.endswith('.ipynb'): - continue - yield os.path.join(examples_folder, filename) - - -@pytest.mark.parametrize('path', find_examples_jupyter_notebook_paths()) - -def test_can_run_examples_jupyter_notebook(path): - notebook = nbformat.read(path, nbformat.NO_CONVERT) - state = {} # type: Dict[str, Any] - - for cell in notebook.cells: - if cell.cell_type == 'code' and not is_matplotlib_cell(cell): - try: - exec(strip_magics_and_shows(cell.source), state) - # coverage: ignore - except: - print('Failed to run {}.'.format(path)) - raise - - -def is_matplotlib_cell(cell): - return "%matplotlib" in cell.source - - -def strip_magics_and_shows(text): - """Remove Jupyter magics and pyplot show commands.""" - lines = [line for line in text.split('\n') - if not contains_magic_or_show(line)] - return '\n'.join(lines) - -def contains_magic_or_show(line): - return (line.strip().startswith('%') or - 'pyplot.show(' in line or - 'plt.show(' in line) From 76d8ff092aae16580caf3a13a104d4f2680001e2 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Sun, 8 Mar 2020 20:56:20 -0400 Subject: [PATCH 23/29] Final --- examples/notebooks/assets/circ2.png | Bin 0 -> 34563 bytes examples/notebooks/assets/cycle.png | Bin 0 -> 12396 bytes examples/notebooks/nqubittoff.ipynb | 123 +++ examples/notebooks/random_walk_tutorial.ipynb | 845 ++++++++++++++++++ 4 files changed, 968 insertions(+) create mode 100644 examples/notebooks/assets/circ2.png create mode 100644 examples/notebooks/assets/cycle.png create mode 100644 examples/notebooks/nqubittoff.ipynb create mode 100644 examples/notebooks/random_walk_tutorial.ipynb diff --git a/examples/notebooks/assets/circ2.png b/examples/notebooks/assets/circ2.png new file mode 100644 index 0000000000000000000000000000000000000000..21e2273f8baf03b308f4b664dff65284183b8814 GIT binary patch literal 34563 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 PcNYI*Y;Kfm=yKsdAp?s# literal 0 HcmV?d00001 diff --git a/examples/notebooks/assets/cycle.png b/examples/notebooks/assets/cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..89ce420986bc0edeed6af84c3afc7341c5405882 GIT binary patch literal 12396 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 literal 0 HcmV?d00001 diff --git a/examples/notebooks/nqubittoff.ipynb b/examples/notebooks/nqubittoff.ipynb new file mode 100644 index 00000000000..67919945973 --- /dev/null +++ b/examples/notebooks/nqubittoff.ipynb @@ -0,0 +1,123 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Appendix A: Creating $n$-Qubit toffoli Gates From Scratch**" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'cirq' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mancilla\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcirq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGridQubit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumber_qubits\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mancilla\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'cirq' is not defined" + ] + } + ], + "source": [ + "ancilla = cirq.GridQubit.rect(1, number_qubits-1, 1)\n", + "print(ancilla)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this implementation, we implemented the $n$-qubit Toffoli with a built-in function in Cirq. However, the actual decomposition of this gate must be done in terms of Toffoli gates, with a qubit ancilla (whcih we defined above).\n", + "\n", + "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", + "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", + "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", + "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", + "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", + "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", + "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", + "\n", + "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", + "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "number_qubits = 4\n", + "\n", + "def apply_n_qubit_tof(ancilla, args):\n", + "\n", + " if (len(args) == 2):\n", + " yield cirq.CNOT.on(args[0], args[1])\n", + "\n", + " elif (len(args) == 3):\n", + " yield cirq.CCX.on(args[0], args[1], args[2])\n", + "\n", + " else:\n", + "\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + " for k in range(2, len(args)-1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + "\n", + " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", + "\n", + " for k in range(len(args)-2, 1, -1):\n", + " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", + " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", + "\n", + "\n", + "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", + "circuit = cirq.Circuit()\n", + "circuit.append(apply_n_qubit_tof(ancilla, control))\n", + "print(circuit)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", + "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", + "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/notebooks/random_walk_tutorial.ipynb b/examples/notebooks/random_walk_tutorial.ipynb new file mode 100644 index 00000000000..2964602a2f3 --- /dev/null +++ b/examples/notebooks/random_walk_tutorial.ipynb @@ -0,0 +1,845 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum Walks With Cirq - Tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "The goal of this Notebook is to provide an interesting exposition to simulating quantum computational processes with Cirq. We will be investigating a very fundamental and interesting idea within quantum computing called the **quantum walk**, starting off with some information on classical random walks, and then building upon that knowledge to understand exactly what a quantum walk is, all while simulating the processes that are outlined mathematically with Cirq. \n", + "\n", + "In order to get started, we first need to import these libraries:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import cirq\n", + "import random\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "import scipy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we'll need `cirq`. The `random` library is used to simulate our classical random walk, `matplotlib` is used to create graphs, and `numpy` and `scipy` are used for processing vectors, matrices, and more.\n", + "\n", + "Before we get started with quantum walks, let's first look into it's classical counterpart, and understand what a \"walk\" truly is:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Classical Random Walks**\n", + "\n", + "A random walk is a random process involving a \"walker\" that is placed in some $n$-dimensional medium, like a grid or a graph. \n", + "We then repeatedly query some random variable, and based on the outcome of our measurement,\n", + "the walker's position vector (position on the graph or grid) is updated. A basic example of a random walk is \n", + "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", + "at each of the integers. Let the initial position vector of our marker be $\\lvert 0\\rangle$. For $N$ steps of our\n", + "random walk, take a set of $N$ random variables $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", + "$1$ or $-1$ with equal probability. To find the updated position vector of our walker, we compute\n", + "the value:\n", + "\n", + "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", + "\n", + "Where we know:\n", + "\n", + "\n", + "$$\\lvert \\text{Final}\\rangle \\ = \\ \\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", + "\n", + "\n", + "So for our case, the final position vector is $\\lvert j\\rangle$. This model of a random walk can \n", + "be generalized to $n$-dimensions. \n", + "\n", + "\n", + "Another important fact to note is that for a discrete, 1-dimensional random \n", + "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", + "a [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution). Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", + "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", + "that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random \n", + "walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability \n", + "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is:\n", + "\n", + "\n", + "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position \n", + "$X \\ = \\ R \\ - \\ L$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", + "that for a random walk of $N$ steps, the position of the walker is determined by the number of right steps, \n", + "minus the number of left steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", + "to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ \n", + "by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. \n", + "Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, \n", + "and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ \n", + "steps by calculating the binomial coefficient, therefore getting:\n", + "\n", + "\n", + "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R} \\Rightarrow \\ X \\ = \\ R \\ - \\ L \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ + \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ + \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ - \\ X}{2}}$$\n", + "\n", + "It is important to note that this only holds true for **even numbers** if the total number of steps taken is even, and **odd numbers** if the total number of steps taken is odd. This is due to the fact that if we set the number of steps that the random walk can take to $N$, then as we previously demonstrated, $L \\ + \\ R \\ = \\ N$ and $R \\ - \\ L \\ = \\ X$. Combining these two equations, we get, just like in the equation above:\n", + "\n", + "$$R \\ = \\ \\frac{X \\ + \\ N}{2}$$\n", + "\n", + "But $R$ must be an integer, thus $X \\ + \\ N$. Must be even. It follows that if $N$ is odd, then $X$ must also be odd to make an even number, and if $N$ is even, $X$ must also be even. From this, we come to the conclusion that if we have an even $N$, the probability of being at a position $X$ that is an odd value is $0$, and if $N$ is odd, then the probability of $X$ being even is $0$.\n", + "\n", + "And so we have shown that the probability distribution for the position of the walker for an $N$ step random \n", + "walk is given by a binomial distribution on the domain of the even or the odd numbers. This fact is important, as we will show that the probability distribution that is created when a quantum walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", + "\n", + "If you don't believe me and/or the math, we can visualize this a bit better by coding up a simple program! We will define a one-dimensional random walk, starting at the point $0$ on the integer number line. We will then repeatedly \"flip a coin\", and move left and right down the number line accordingly: " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The walker is located at: x = -4\n" + ] + } + ], + "source": [ + "# Defines all of the necessary parameters\n", + "\n", + "N = 50 #Defines the total number of steps our walked will take\n", + "pr = 0.5 #Defines the probability of our walking stepping to the right\n", + "i = 0 #Defines the initial position of our walker\n", + "\n", + "def random_walk(pr, N, i):\n", + " \n", + " position = i\n", + " \n", + " # Repeatedly queries our random variable and moves our walker, for the specified number of steps\n", + " \n", + " for j in range(0, N): \n", + " \n", + " coin_flip = list(np.random.choice(2, 1, p=[1-pr, pr])) #Flips our weighted coin\n", + " position += 2*coin_flip[0]-1 #Moves our walker according to the coin flip \n", + " \n", + " return position\n", + " \n", + "print(\"The walker is located at: x = {var}\".format(var = random_walk(pr, N, i)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's attempt to generate the probability distribution corresponding to the walker's position, and make sure that it checks out with our math:" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def dist(runs, N):\n", + " \n", + " positions = range(-1*N, N+1)\n", + " instances = [0 for i in range(-1*N, N+1)]\n", + " \n", + " for k in range(0, runs):\n", + "\n", + " result = random_walk(pr, N, i)\n", + " instances[positions.index(result)] += 1\n", + "\n", + " plt.bar(positions, [n/runs for n in instances])\n", + " plt.show()\n", + " \n", + "dist(10000, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That looks pretty binomial to me (which is exactly what the math predicts)! We can now plot the distribution predicted in the math, and see if the two are the same:" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def height_calculate(x, N, pr):\n", + " \n", + " a = (N + x)/2\n", + " b = (N - x)/2\n", + " \n", + " if (x%2 == 0):\n", + " var = scipy.special.binom(N, a)*(pr**a)*((1-pr)**b)\n", + " else:\n", + " var = 0\n", + " return var\n", + "\n", + "heights = [height_calculate(x, N, pr) for x in positions]\n", + "plt.bar(positions, heights)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, the distributions look very similar, with the midpoint having a probability of a little bit over $0.1$ in both graphs. Note that as we increase the `runs` variable, our simulated distribution will resemble our theoretical distribution more and more, as one would expect:" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAARNElEQVR4nO3dcYxlZX3G8e/TXVmtRlCYWstuO9uwbbJWY3VdTWytkRYXsaxNF100CpYGTdzUpjY6aIKW+ge0jdhG2kiEBkGzEFrjprt2S8WkiRG6Ayp0QXRElEUtIyDWGsSVX/+4h3i9nWXOOndmdt75fpLNnPO+77nze3Ozzz3znnvPTVUhSWrXzy13AZKkxWXQS1LjDHpJapxBL0mNM+glqXFrl7uAUSeddFJNTk4udxmStKLccsst36mqibn6jrmgn5ycZHp6ernLkKQVJcnXj9Tn0o0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJcWaHJqL5NTe5e7DOmIDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS43oFfZJtSe5KMpNkao7+lyW5NcnhJDuG2p+f5HNJDia5Lcnrxlm8JGl+8wZ9kjXAZcDpwGbg7CSbR4Z9AzgX+PhI+w+AN1XVc4BtwAeTnLDQoiVJ/fX5cvCtwExV3Q2QZDewHbjj8QFVdU/X99jwgVX15aHtbya5H5gAvrvgyiVJvfRZujkZuHdo/1DXdlSSbAWOA756tMdKkn52S3IxNsmzgauBN1fVY3P0n59kOsn07OzsUpQkSatGn6C/D9gwtL++a+slydOBvcB7quqmucZU1eVVtaWqtkxMTPR9aElSD32C/gCwKcnGJMcBO4E9fR68G/8J4KNVdf3PXqYk6Wc1b9BX1WFgF7AfuBO4rqoOJrkoyZkASV6U5BBwFvDhJAe7w18LvAw4N8kXun/PX5SZSJLm1OddN1TVPmDfSNuFQ9sHGCzpjB53DXDNAmuUJC2An4yVpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL42YnNrL5NTe5S5DGhuDXpIaZ9BLUuN6BX2SbUnuSjKTZGqO/pcluTXJ4SQ7RvrOSfKV7t854ypcktTPvEGfZA1wGXA6sBk4O8nmkWHfAM4FPj5y7DOB9wIvBrYC703yjIWXLUnqq88Z/VZgpqrurqpHgd3A9uEBVXVPVd0GPDZy7CuBG6rqwap6CLgB2DaGuiVJPfUJ+pOBe4f2D3VtffQ6Nsn5SaaTTM/OzvZ8aOnY5rt3dKw4Ji7GVtXlVbWlqrZMTEwsdzmS1JQ+QX8fsGFof33X1sdCjpUkjUGfoD8AbEqyMclxwE5gT8/H3w+cluQZ3UXY07o2adm5tKLVYt6gr6rDwC4GAX0ncF1VHUxyUZIzAZK8KMkh4Czgw0kOdsc+CPwlgxeLA8BFXZskaYms7TOoqvYB+0baLhzaPsBgWWauY68ErlxAjZKkBTgmLsZKkhaPQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9CreX4CVqudQS9JjTPoJalxBr20xFxK0lIz6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUuF5Bn2RbkruSzCSZmqN/XZJru/6bk0x27U9KclWS25PcmeSC8ZYvSZrPvEGfZA1wGXA6sBk4O8nmkWHnAQ9V1SnApcAlXftZwLqqei7wQuAtj78ISJKWRp8z+q3ATFXdXVWPAruB7SNjtgNXddvXA6cmCVDAU5OsBZ4CPAp8byyVS5J66RP0JwP3Du0f6trmHFNVh4GHgRMZhP7/At8CvgH8TVU9OPoLkpyfZDrJ9Ozs7FFPQpJ0ZIt9MXYr8GPgl4CNwDuS/OrooKq6vKq2VNWWiYmJRS5JklaXPkF/H7BhaH991zbnmG6Z5njgAeD1wL9W1Y+q6n7gs8CWhRYtSeqvT9AfADYl2ZjkOGAnsGdkzB7gnG57B3BjVRWD5ZpXACR5KvAS4EvjKFyS1M+8Qd+tue8C9gN3AtdV1cEkFyU5sxt2BXBikhngz4DH34J5GfC0JAcZvGD8Y1XdNu5JSJKObG2fQVW1D9g30nbh0PYjDN5KOXrc9+dqlyQtHT8ZK0mNM+glqXEGvSQ1zqCXpMYZ9FJPk1N7mZzau9xlSEfNoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIa1yvok2xLcleSmSRTc/SvS3Jt139zksmhvucl+VySg0luT/Lk8ZUvSZrPvEGfZA1wGXA6sBk4O8nmkWHnAQ9V1SnApcAl3bFrgWuAt1bVc4CXAz8aW/WSpHn1OaPfCsxU1d1V9SiwG9g+MmY7cFW3fT1wapIApwG3VdUXAarqgar68XhKlyT10SfoTwbuHdo/1LXNOaaqDgMPAycCvwZUkv1Jbk3yzrl+QZLzk0wnmZ6dnT3aOUiSnsBiX4xdC/wW8Ibu5x8kOXV0UFVdXlVbqmrLxMTEIpckSatLn6C/D9gwtL++a5tzTLcufzzwAIOz//+oqu9U1Q+AfcALFlq0JKm/PkF/ANiUZGOS44CdwJ6RMXuAc7rtHcCNVVXAfuC5SX6+ewH4HeCO8ZQuSepj7XwDqupwkl0MQnsNcGVVHUxyETBdVXuAK4Crk8wADzJ4MaCqHkryAQYvFgXsq6q9izQXSdIc5g16gKrax2DZZbjtwqHtR4CzjnDsNQzeYilJWgZ+MlaSGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS43rdAkE61k1O/eQWSvdcfMYyVjJ+j8+ttXlp6XhGL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPopWPE5NTen/qErzQuBr0kNc6gl6TG9Qr6JNuS3JVkJsnUHP3rklzb9d+cZHKk/5eTfD/Jn4+nbK1Wjy9vuMQh9Tdv0CdZA1wGnA5sBs5Osnlk2HnAQ1V1CnApcMlI/weATy28XEnS0epzRr8VmKmqu6vqUWA3sH1kzHbgqm77euDUJAFI8hrga8DB8ZQsSToafYL+ZODeof1DXducY6rqMPAwcGKSpwHvAv7iiX5BkvOTTCeZnp2d7Vu7JKmHxb4Y+z7g0qr6/hMNqqrLq2pLVW2ZmJhY5JIkaXXp8w1T9wEbhvbXd21zjTmUZC1wPPAA8GJgR5K/Ak4AHkvySFV9aMGVS5J66RP0B4BNSTYyCPSdwOtHxuwBzgE+B+wAbqyqAn778QFJ3gd835CXpKU1b9BX1eEku4D9wBrgyqo6mOQiYLqq9gBXAFcnmQEeZPBiIEk6BvT6cvCq2gfsG2m7cGj7EeCseR7jfT9DfZKkBfKTsZLUuF5n9NJSG/7k6z0Xn7GMlUgrn2f0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLK9Tk1N6f+spF6UgMeklqnEEvSY3rFfRJtiW5K8lMkqk5+tclubbrvznJZNf+e0luSXJ79/MV4y1fkjSfeYM+yRrgMuB0YDNwdpLNI8POAx6qqlOAS4FLuvbvAL9fVc8FzgGuHlfhkqR++pzRbwVmquruqnoU2A1sHxmzHbiq274eODVJqurzVfXNrv0g8JQk68ZRuCSpnz5BfzJw79D+oa5tzjFVdRh4GDhxZMwfArdW1Q9Hf0GS85NMJ5menZ3tW7ukOfhuHI1akouxSZ7DYDnnLXP1V9XlVbWlqrZMTEwsRUmStGr0Cfr7gA1D++u7tjnHJFkLHA880O2vBz4BvKmqvrrQgiVJR6dP0B8ANiXZmOQ4YCewZ2TMHgYXWwF2ADdWVSU5AdgLTFXVZ8dVtCSpv7XzDaiqw0l2AfuBNcCVVXUwyUXAdFXtAa4Ark4yAzzI4MUAYBdwCnBhkgu7ttOq6v5xT0Qr0/Ba8j0Xn7GMlUjtmjfoAapqH7BvpO3Coe1HgLPmOO79wPsXWKMkaQH8ZKwkNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL60Sfpfs6mXQS1LjDHpJapxBL61yLum0z6CXpMYZ9JLUuF5fDi4t1PDSwD0Xn7GMlWihHn8uR59Hn+Njl2f0ktQ4g16SGmfQS1Ljeq3RJ9kG/C2wBvhIVV080r8O+CjwQuAB4HVVdU/XdwFwHvBj4E+qav/YqteyOdJ6rOu00rFn3jP6JGuAy4DTgc3A2Uk2jww7D3ioqk4BLgUu6Y7dDOwEngNsA/6+ezxJ0hLps3SzFZipqrur6lFgN7B9ZMx24Kpu+3rg1CTp2ndX1Q+r6mvATPd4kqQlkqp64gHJDmBbVf1xt/9G4MVVtWtozH91Yw51+18FXgy8D7ipqq7p2q8APlVV14/8jvOB87vdXwfuWvjUlsVJwHeWu4gltNrmC6tvzqttvrBy5/wrVTUxV8cx8T76qrocuHy561ioJNNVtWW561gqq22+sPrmvNrmC23Ouc/SzX3AhqH99V3bnGOSrAWOZ3BRts+xkqRF1CfoDwCbkmxMchyDi6t7RsbsAc7ptncAN9ZgTWgPsDPJuiQbgU3Af46ndElSH/Mu3VTV4SS7gP0M3l55ZVUdTHIRMF1Ve4ArgKuTzAAPMngxoBt3HXAHcBh4W1X9eJHmcixY8ctPR2m1zRdW35xX23yhwTnPezFWkrSy+clYSWqcQS9JjTPoxyjJO5JUkpO6/ST5uyQzSW5L8oLlrnEckvx1ki91c/pEkhOG+i7o5ntXklcuZ53jlGRbN6eZJFPLXc9iSLIhyWeS3JHkYJK3d+3PTHJDkq90P5+x3LWOU5I1ST6f5F+6/Y1Jbu6e62u7N6GsaAb9mCTZAJwGfGOo+XQG7zTaxOADYf+wDKUthhuA36iq5wFfBi6Adm950fM2IC04DLyjqjYDLwHe1s1zCvh0VW0CPt3tt+TtwJ1D+5cAl3a3dHmIwS1eVjSDfnwuBd4JDF/d3g58tAZuAk5I8uxlqW6Mqurfqupwt3sTg89HQLu3vOhzG5AVr6q+VVW3dtv/wyD8Tuanb3FyFfCa5alw/JKsB84APtLtB3gFg1u5QCPzNejHIMl24L6q+uJI18nAvUP7h7q2lvwR8Kluu9X5tjqvI0oyCfwmcDPwrKr6Vtf1beBZy1TWYvgggxO0x7r9E4HvDp3INPFcHxO3QFgJkvw78ItzdL0HeDeDZZtmPNF8q+qT3Zj3MPhz/2NLWZsWV5KnAf8E/GlVfW9wkjtQVZWkifdkJ3k1cH9V3ZLk5ctdz2Iy6Huqqt+dqz3Jc4GNwBe7/xDrgVuTbGUF3wLiSPN9XJJzgVcDp9ZPPoyxYuc7j1bn9f8keRKDkP9YVf1z1/zfSZ5dVd/qlh7vX74Kx+qlwJlJXgU8GXg6g+/dOCHJ2u6svonn2qWbBaqq26vqF6pqsqomGfyp94Kq+jaDW0C8qXv3zUuAh4f+BF6xui+ieSdwZlX9YKir1Vte9LkNyIrXrU9fAdxZVR8Y6hq+xck5wCeXurbFUFUXVNX67v/tTga3bnkD8BkGt3KBRubrGf3i2ge8isFFyR8Ab17ecsbmQ8A64Ibur5ibquqtrd7y4ki3AVnmshbDS4E3Arcn+ULX9m7gYuC6JOcBXwdeu0z1LZV3AbuTvB/4PIMXvxXNWyBIUuNcupGkxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXH/B91c9Zbn5SxDAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "dist(50, N)\n", + "dist(100, N)\n", + "dist(500, N)\n", + "dist(1000, N)\n", + "dist(5000, N)\n", + "dist(10000, N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Quantum Walks**\n", + "\n", + "\n", + "The process of the quantum walk isn't that much different from its classical counterpart, although \n", + "the observed results of the two processes have many differences. First, let us motivate the creation of a \n", + "QW. The idea is that when one performs analysis on a classical random walk, you can find that \n", + "$\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, \n", + "and $T$ is the number of time-steps of the random walk. For the quantum walk, we can see that \n", + "$\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. \n", + "At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the \n", + "classical one, showing that the process of a QW is quadratically faster than its classical counterpart.\n", + "\n", + "\n", + "In order to create a quantum walk, we have to translate the components of the classical random walk \n", + "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", + "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a basic case of a \n", + "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", + "looks something like this:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Going back to our original idea of some position vector $\\lvert j\\rangle$, it is apparent that in order to \n", + "encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector \n", + "to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", + "$H_W$ spanned by the following set:\n", + "\n", + "\n", + "$$H_W \\ = \\ \\{\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", + "\n", + "\n", + "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode \n", + "the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space \n", + "is spanned by the two basis states, representing forward and backward progression on our number-line-like \n", + "graph (actually, our graph looks more like a ring, so the two basis states will represent \n", + "clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, \n", + "and we can again define our spanning set:\n", + "\n", + "\n", + "$$H_C \\ = \\ \\{\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", + "\n", + "\n", + "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents \n", + "clock-wise motion. Now that we have defined all of the vectors we need to encode the information about \n", + "our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is \n", + "again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations \n", + "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will be given \n", + "by the binary representation of $j$ corresponding to the basis vector $\\lvert j\\rangle$. For the coin vector, \n", + "since we have only two states, we only need one qubit to encode the two possible states:\n", + "\n", + "\n", + "$$\\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\lvert 1\\rangle \\ = \\ \\lvert \\downarrow\\rangle$$\n", + "\n", + "\n", + "In order to represent the total space of all possible states of our system, we take the tensor product of the \n", + "two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general \n", + "element of this Hilbert space as $\\lvert i\\rangle \\ \\otimes \\ \\lvert j\\rangle$.\n", + "\n", + "Moving right along, we now require a method to evolve our walk forward at each step. We define a random \n", + "walk evolution operator as follows:\n", + "\n", + "\n", + "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", + "\n", + "\n", + "Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", + "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", + "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", + "\"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), \n", + "and then sums over all possible position states until it finds the position state to which the operator is \n", + "being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, \n", + "they're orthonormal!), and the new position state of the vector is $\\lvert j \\ \\pm \\ 1\\rangle$, depending on \n", + "the state of the coin vector. This did exactly what we wanted, it evolved our walk either forward or \n", + "backwards by one step! If you're still not convinced, let's check to see what happens when we have the state \n", + "$\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle$ and we apply the $U$ operator:\n", + "\n", + "\n", + " $$U (\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert \\Big )(\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle)$$\n", + " \n", + " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert 1\\rangle \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert 1\\rangle$$\n", + "\n", + "\n", + " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle \\ + \\ 0\\lvert \\downarrow\\rangle \\ \\otimes \\ \\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle$$\n", + "\n", + "\n", + " As you can see, it works! Now, we must consider the randomness of the classical random walk. For the purposes of our \n", + " quantum walk, we will \"set\" $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", + " it is necessary that we randomly flip the state of our coin vector $\\lvert i\\rangle$. The Hadamard \n", + " transformation seems like a natural choice, as:\n", + "\n", + "\n", + " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\lvert \\uparrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ + \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\lvert \\downarrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ - \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", + "\n", + "\n", + " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the \n", + " right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" \n", + " that works as one complete step of the random walk, including randomizing the coin vector:\n", + "\n", + "\n", + " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Building a QW With Cirq**\n", + "\n", + "\n", + "Now, that we have established all of the necessary mathematical rigour to create a quantum walk, we \n", + "need to translate this into code. We can start by creating a qubit register, which will be used to represent \n", + "all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers \n", + "ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" + ] + } + ], + "source": [ + "number_qubits = 7\n", + "qubits = cirq.GridQubit.rect(1, number_qubits)\n", + "\n", + "print(qubits)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on \n", + "the simulation that we want to make. To start, let's say that our initial position vector for our \"walker\" \n", + "is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's \n", + "also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is \n", + "an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on \n", + "the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "metadata": {}, + "outputs": [], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that we have created and initialized our qubit register, we have to create an operation that can evolve \n", + "our walk forward by one step. At a high level, our evolution operation will follow this process:\n", + "\n", + "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", + "\n", + "\n", + "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", + "\n", + "\n", + "\n", + "\n", + "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker \n", + "steps forwards or backwards without ever having to be measured!\n", + "\n", + "\n", + "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \n", + "\"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with \n", + "adds or subtracts $1$ from the position vector. \n", + "\n", + "\n", + "Before we actually dive into making the addition and subtraction operators, it will be useful for us to define \n", + "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", + "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", + "standard $CNOT$ and Toffoli gates. In order to implement this, we can use the built-in function Cirq: `cirq.X(target).controlled_by(*controls)` (see Appendix A for an exact implementation of this gate with $CNOT$s)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, \n", + "the idea is:\n", + "\n", + "\n", + "\n", + "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", + "\n", + "\n", + "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", + "\n", + "\n", + "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", + "\n", + "\n", + "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", + "\n", + "\n", + "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition (This jusst cancels out when we apply the inverse operator to perform subtraction).\n", + "\n", + "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if \n", + "we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", + "\n", + "\n", + "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", + "\n", + "\n", + "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, \n", + "we get:\n", + "\n", + "\n", + " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", + "\n", + "\n", + "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", + "\n", + "\n", + "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", + "\n", + "\n", + "So basically, our subtraction operation will just be applying our addition operator, but with the order of \n", + "gates reversed. This allows us to create one general \"evolution operation\" for our walk, which adds \n", + "or substract $1$ to the walker's position vector, based on the coin qubit:" + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "metadata": {}, + "outputs": [], + "source": [ + "def walk_step():\n", + "\n", + " #\"Flip\" the coin vector\n", + "\n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " #Implement the Addition Operator\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " for i in range(number_qubits, 0, -1):\n", + " \n", + " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", + " if (i > 1):\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + " #Implement the Substraction Operator\n", + "\n", + " for i in range(1, number_qubits+1):\n", + "\n", + " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", + " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", + " if (i < number_qubits):\n", + " yield cirq.X.on(cirq.GridQubit(0, i))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the \n", + "``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position \n", + "vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the \n", + "example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector \n", + "qubits, we have:" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({12: 1177, 14: 663, 20: 334, 10: 318, 16: 293, 52: 274, 18: 227, 48: 157, 22: 151, 40: 131, 28: 130, 54: 129, 32: 126, 30: 124, 26: 121, 42: 108, 36: 97, 38: 95, 24: 94, 34: 78, 44: 61, 46: 58, 50: 19, 8: 18, 56: 16, 58: 1})\n" + ] + } + ], + "source": [ + "number_qubits = 7\n", + "iterator = 30\n", + "sample_number = 5000\n", + "\n", + "def generate_walk(number_qubits, iterator, sample_number):\n", + "\n", + " circuit = cirq.Circuit()\n", + "\n", + " circuit.append(initial_state())\n", + " for j in range(0, iterator):\n", + " circuit.append(walk_step())\n", + " circuit.append(cirq.measure(*qubits, key='x'))\n", + "\n", + " simulator = cirq.Simulator()\n", + " result = simulator.run(circuit, repetitions=sample_number)\n", + " final = result.histogram(key='x')\n", + "\n", + " print(final)\n", + " return final\n", + "\n", + "final = generate_walk(number_qubits, iterator, sample_number)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", + "number of occurrences of that position vector value on the y-axis. This gives us a probability distribution for \n", + "the position of the walker. It is important to note that the graphs will only have either even or odd \n", + "numbered data point, depending on the initial position of the walker and the number of steps taken:" + ] + }, + { + "cell_type": "code", + "execution_count": 223, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def graph(final):\n", + "\n", + " x_arr = list(final.keys())\n", + " y_arr = [dict(final)[j] for j in dict(final).keys()]\n", + "\n", + " x_arr_final = []\n", + " y_arr_final = []\n", + "\n", + " while (len(x_arr) > 0):\n", + "\n", + " x_arr_final.append(min(x_arr))\n", + " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", + " holder = x_arr.index(min(x_arr))\n", + " del x_arr[holder]\n", + " del y_arr[holder]\n", + "\n", + " plt.plot(x_arr_final, y_arr_final)\n", + " plt.scatter(x_arr_final, y_arr_final)\n", + " plt.show()\n", + "\n", + "graph(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated \n", + "applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to \n", + "the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ \n", + "and repeatedly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", + "and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. \n", + "In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({52: 1222, 50: 691, 44: 362, 54: 296, 48: 271, 12: 266, 46: 189, 16: 167, 10: 141, 42: 140, 36: 128, 24: 125, 32: 112, 22: 108, 26: 103, 34: 103, 38: 99, 30: 95, 40: 88, 28: 84, 20: 65, 18: 60, 56: 34, 14: 29, 8: 21, 6: 1})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + "\n", + "final = generate_walk(number_qubits, iterator, sample_number)\n", + "graph(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one \n", + "more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our \n", + "distribution towards only one side! We will set our initial state to:\n", + "\n", + "\n", + "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "This is implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", + "the qubit. When we simulate this with Cirq, we get:" + ] + }, + { + "cell_type": "code", + "execution_count": 226, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Counter({12: 742, 52: 715, 50: 342, 14: 335, 10: 247, 54: 232, 20: 224, 48: 216, 16: 209, 44: 202, 22: 151, 42: 147, 46: 144, 18: 120, 34: 118, 30: 112, 32: 108, 26: 108, 28: 107, 36: 105, 40: 98, 24: 96, 38: 93, 56: 15, 8: 14})\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
          " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def initial_state():\n", + "\n", + " yield cirq.X.on(cirq.GridQubit(0, 1))\n", + " \n", + " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", + " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", + "\n", + "final = generate_walk(number_qubits, iterator, sample_number)\n", + "graph(final)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we get a probability distribution that is much more symmetric!\n", + "\n", + "\n", + "Random walks have applications in so many fields of scientific inquiry, ranging from biology, to \n", + "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", + "example of a QW and many more great projects that can be made by utilizing this interesting process! \n", + "\n", + "**References**\n", + "\n", + "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", + "\n", + "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 0057872ce81fd3f2a8f248e0621ca7c60c3af820 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 9 Mar 2020 14:03:07 -0400 Subject: [PATCH 24/29] Delete nqubittoff.ipynb --- examples/notebooks/nqubittoff.ipynb | 123 ---------------------------- 1 file changed, 123 deletions(-) delete mode 100644 examples/notebooks/nqubittoff.ipynb diff --git a/examples/notebooks/nqubittoff.ipynb b/examples/notebooks/nqubittoff.ipynb deleted file mode 100644 index 67919945973..00000000000 --- a/examples/notebooks/nqubittoff.ipynb +++ /dev/null @@ -1,123 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Appendix A: Creating $n$-Qubit toffoli Gates From Scratch**" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'cirq' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mancilla\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcirq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGridQubit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumber_qubits\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mancilla\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'cirq' is not defined" - ] - } - ], - "source": [ - "ancilla = cirq.GridQubit.rect(1, number_qubits-1, 1)\n", - "print(ancilla)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this implementation, we implemented the $n$-qubit Toffoli with a built-in function in Cirq. However, the actual decomposition of this gate must be done in terms of Toffoli gates, with a qubit ancilla (whcih we defined above).\n", - "\n", - "We start by applying a Toffoli gate to the first two control qubits, with the target as the first ancilla \n", - "qubit. Then, we apply a Toffoli controlled by the third control qubit and the first ancilla qubit, which we \n", - "targetted with the previous Toffoli gate. We continue this process until all control qubits have been utilized \n", - "in Toffoli gates, and then attach a $CNOT$ gate to our final ancilla qubit, targetting the \"overall\" original \n", - "target qubit of the $n$-qubit Toffoli gate. Our final step is to perform an uncomputation operation, \n", - "which means that we apply our series of Toffoli gates in reverse. This allows us to revert our ancilla back to \n", - "its initial state $|0\\rangle^{\\otimes n \\ - \\ 1}$, thus allowing it to be re-used for future computation.\n", - "\n", - "This process may seem a little bit confusing, but here is an example of the generated circuit for the \n", - "$n$-qubit Toffoli gate for the case of $n \\ = \\ 4$, when this process is implemented in Cirq:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "number_qubits = 4\n", - "\n", - "def apply_n_qubit_tof(ancilla, args):\n", - "\n", - " if (len(args) == 2):\n", - " yield cirq.CNOT.on(args[0], args[1])\n", - "\n", - " elif (len(args) == 3):\n", - " yield cirq.CCX.on(args[0], args[1], args[2])\n", - "\n", - " else:\n", - "\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - " for k in range(2, len(args)-1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - "\n", - " yield cirq.CNOT.on(ancilla[len(args)-3], args[len(args)-1])\n", - "\n", - " for k in range(len(args)-2, 1, -1):\n", - " yield cirq.CCX(args[k], ancilla[k-2], ancilla[k-1])\n", - " yield cirq.CCX.on(args[0], args[1], ancilla[0])\n", - "\n", - "\n", - "control = [cirq.GridQubit(0, i) for i in range(0, number_qubits+1)]\n", - "circuit = cirq.Circuit()\n", - "circuit.append(apply_n_qubit_tof(ancilla, control))\n", - "print(circuit)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The reason why I have introduced an extra qubit is because the way that I coded this function takes the last entry \n", - "in the ``args`` list as the target qubit, thus I needed $4$ control qubits, plus $1$ target qubit for a total \n", - "of $5$ qubits in the ``control`` list (even though one of them is actually the target!)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From 1c3e7897ba7c8662cba503d1c72082735065d0e9 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 9 Mar 2020 14:03:52 -0400 Subject: [PATCH 25/29] Delete random_walk_tutorial.ipynb --- .../random_walk_tutorial.ipynb | 845 ------------------ 1 file changed, 845 deletions(-) delete mode 100644 examples/notebook_tutorials/random_walk_tutorial.ipynb diff --git a/examples/notebook_tutorials/random_walk_tutorial.ipynb b/examples/notebook_tutorials/random_walk_tutorial.ipynb deleted file mode 100644 index 2964602a2f3..00000000000 --- a/examples/notebook_tutorials/random_walk_tutorial.ipynb +++ /dev/null @@ -1,845 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Quantum Walks With Cirq - Tutorial" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "The goal of this Notebook is to provide an interesting exposition to simulating quantum computational processes with Cirq. We will be investigating a very fundamental and interesting idea within quantum computing called the **quantum walk**, starting off with some information on classical random walks, and then building upon that knowledge to understand exactly what a quantum walk is, all while simulating the processes that are outlined mathematically with Cirq. \n", - "\n", - "In order to get started, we first need to import these libraries:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import cirq\n", - "import random\n", - "import numpy as np\n", - "from matplotlib import pyplot as plt\n", - "import scipy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, we'll need `cirq`. The `random` library is used to simulate our classical random walk, `matplotlib` is used to create graphs, and `numpy` and `scipy` are used for processing vectors, matrices, and more.\n", - "\n", - "Before we get started with quantum walks, let's first look into it's classical counterpart, and understand what a \"walk\" truly is:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Classical Random Walks**\n", - "\n", - "A random walk is a random process involving a \"walker\" that is placed in some $n$-dimensional medium, like a grid or a graph. \n", - "We then repeatedly query some random variable, and based on the outcome of our measurement,\n", - "the walker's position vector (position on the graph or grid) is updated. A basic example of a random walk is \n", - "the one-dimensional graphical case, where we consider a marker placed on the origin of a number line with markings\n", - "at each of the integers. Let the initial position vector of our marker be $\\lvert 0\\rangle$. For $N$ steps of our\n", - "random walk, take a set of $N$ random variables $\\{X_1, \\ ..., \\ X_N\\}$, which can take on either a value of \n", - "$1$ or $-1$ with equal probability. To find the updated position vector of our walker, we compute\n", - "the value:\n", - "\n", - "$$j \\ = \\ \\displaystyle\\sum_{k \\ = \\ 1}^{N} \\ X_k$$\n", - "\n", - "Where we know:\n", - "\n", - "\n", - "$$\\lvert \\text{Final}\\rangle \\ = \\ \\lvert \\text{Initial} \\ + \\ j\\rangle$$\n", - "\n", - "\n", - "So for our case, the final position vector is $\\lvert j\\rangle$. This model of a random walk can \n", - "be generalized to $n$-dimensions. \n", - "\n", - "\n", - "Another important fact to note is that for a discrete, 1-dimensional random \n", - "walk on a number-line-like graph, the probability of the random walker being at a specific location follows \n", - "a [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution). Let us define an $N$-step random walk. Let us then assert that $N \\ = \\ L \\ + \\ R$, \n", - "where $L$ is the number of steps to the left, and $R$ is the number of steps to the right. We can then reason \n", - "that if there is some probability $p_{r}$ of the walker taking a rightward step at one time-step of the random \n", - "walk, the probability of taking a leftward step is given by $1 \\ - \\ p_{r}$. It follows that the probability \n", - "of taking $L \\ = \\ N \\ - \\ R$ leftward steps, and $R$ rightward steps in a random walk of $N$ total steps is:\n", - "\n", - "\n", - "$$P(N, \\ R) \\ = \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R}$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We then have to consider the probability that for an $N$ step random walk, our walker ends up at position \n", - "$X \\ = \\ R \\ - \\ L$. Well, we know the probability of taking $L$ left steps and $R$ right steps, and we know \n", - "that for a random walk of $N$ steps, the position of the walker is determined by the number of right steps, \n", - "minus the number of left steps. Since it doesn't matter the order in which the sequence of $N$ steps occurs, \n", - "to find the total probability of being at some location, $P(X)$, we have to multiply the probability $P(L, \\ R)$ \n", - "by the number of possible ways in which $L$ left steps and $R$ right steps can be arranged in a sequence. \n", - "Well, since we have $N$ total steps, we can \"choose\" $R$ of those steps to be allocated to rightward steps, \n", - "and automatically know that the remaining $N \\ - \\ R$ steps were left steps. We calculate $N$ \"choose\" $R$ \n", - "steps by calculating the binomial coefficient, therefore getting:\n", - "\n", - "\n", - "$$P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ R \\end{pmatrix} \\ p_{r}^R (1 \\ - \\ p_{r})^{N \\ - \\ R} \\Rightarrow \\ X \\ = \\ R \\ - \\ L \\ \\Rightarrow \\ P_{N}(X) \\ = \\ \\begin{pmatrix} N \\\\ \\frac{N \\ + \\ X}{2} \\end{pmatrix} \\ p_{r}^{\\frac{N \\ + \\ X}{2}} (1 \\ - \\ p_{r})^{\\frac{N \\ - \\ X}{2}}$$\n", - "\n", - "It is important to note that this only holds true for **even numbers** if the total number of steps taken is even, and **odd numbers** if the total number of steps taken is odd. This is due to the fact that if we set the number of steps that the random walk can take to $N$, then as we previously demonstrated, $L \\ + \\ R \\ = \\ N$ and $R \\ - \\ L \\ = \\ X$. Combining these two equations, we get, just like in the equation above:\n", - "\n", - "$$R \\ = \\ \\frac{X \\ + \\ N}{2}$$\n", - "\n", - "But $R$ must be an integer, thus $X \\ + \\ N$. Must be even. It follows that if $N$ is odd, then $X$ must also be odd to make an even number, and if $N$ is even, $X$ must also be even. From this, we come to the conclusion that if we have an even $N$, the probability of being at a position $X$ that is an odd value is $0$, and if $N$ is odd, then the probability of $X$ being even is $0$.\n", - "\n", - "And so we have shown that the probability distribution for the position of the walker for an $N$ step random \n", - "walk is given by a binomial distribution on the domain of the even or the odd numbers. This fact is important, as we will show that the probability distribution that is created when a quantum walk is simulated is nowhere close to the binomial distribution that we expect to see for a classical 1-dimensional random walk.\n", - "\n", - "If you don't believe me and/or the math, we can visualize this a bit better by coding up a simple program! We will define a one-dimensional random walk, starting at the point $0$ on the integer number line. We will then repeatedly \"flip a coin\", and move left and right down the number line accordingly: " - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The walker is located at: x = -4\n" - ] - } - ], - "source": [ - "# Defines all of the necessary parameters\n", - "\n", - "N = 50 #Defines the total number of steps our walked will take\n", - "pr = 0.5 #Defines the probability of our walking stepping to the right\n", - "i = 0 #Defines the initial position of our walker\n", - "\n", - "def random_walk(pr, N, i):\n", - " \n", - " position = i\n", - " \n", - " # Repeatedly queries our random variable and moves our walker, for the specified number of steps\n", - " \n", - " for j in range(0, N): \n", - " \n", - " coin_flip = list(np.random.choice(2, 1, p=[1-pr, pr])) #Flips our weighted coin\n", - " position += 2*coin_flip[0]-1 #Moves our walker according to the coin flip \n", - " \n", - " return position\n", - " \n", - "print(\"The walker is located at: x = {var}\".format(var = random_walk(pr, N, i)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now, let's attempt to generate the probability distribution corresponding to the walker's position, and make sure that it checks out with our math:" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def dist(runs, N):\n", - " \n", - " positions = range(-1*N, N+1)\n", - " instances = [0 for i in range(-1*N, N+1)]\n", - " \n", - " for k in range(0, runs):\n", - "\n", - " result = random_walk(pr, N, i)\n", - " instances[positions.index(result)] += 1\n", - "\n", - " plt.bar(positions, [n/runs for n in instances])\n", - " plt.show()\n", - " \n", - "dist(10000, N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That looks pretty binomial to me (which is exactly what the math predicts)! We can now plot the distribution predicted in the math, and see if the two are the same:" - ] - }, - { - "cell_type": "code", - "execution_count": 86, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def height_calculate(x, N, pr):\n", - " \n", - " a = (N + x)/2\n", - " b = (N - x)/2\n", - " \n", - " if (x%2 == 0):\n", - " var = scipy.special.binom(N, a)*(pr**a)*((1-pr)**b)\n", - " else:\n", - " var = 0\n", - " return var\n", - "\n", - "heights = [height_calculate(x, N, pr) for x in positions]\n", - "plt.bar(positions, heights)\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, the distributions look very similar, with the midpoint having a probability of a little bit over $0.1$ in both graphs. Note that as we increase the `runs` variable, our simulated distribution will resemble our theoretical distribution more and more, as one would expect:" - ] - }, - { - "cell_type": "code", - "execution_count": 105, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAARNElEQVR4nO3dcYxlZX3G8e/TXVmtRlCYWstuO9uwbbJWY3VdTWytkRYXsaxNF100CpYGTdzUpjY6aIKW+ge0jdhG2kiEBkGzEFrjprt2S8WkiRG6Ayp0QXRElEUtIyDWGsSVX/+4h3i9nWXOOndmdt75fpLNnPO+77nze3Ozzz3znnvPTVUhSWrXzy13AZKkxWXQS1LjDHpJapxBL0mNM+glqXFrl7uAUSeddFJNTk4udxmStKLccsst36mqibn6jrmgn5ycZHp6ernLkKQVJcnXj9Tn0o0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJcWaHJqL5NTe5e7DOmIDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS43oFfZJtSe5KMpNkao7+lyW5NcnhJDuG2p+f5HNJDia5Lcnrxlm8JGl+8wZ9kjXAZcDpwGbg7CSbR4Z9AzgX+PhI+w+AN1XVc4BtwAeTnLDQoiVJ/fX5cvCtwExV3Q2QZDewHbjj8QFVdU/X99jwgVX15aHtbya5H5gAvrvgyiVJvfRZujkZuHdo/1DXdlSSbAWOA756tMdKkn52S3IxNsmzgauBN1fVY3P0n59kOsn07OzsUpQkSatGn6C/D9gwtL++a+slydOBvcB7quqmucZU1eVVtaWqtkxMTPR9aElSD32C/gCwKcnGJMcBO4E9fR68G/8J4KNVdf3PXqYk6Wc1b9BX1WFgF7AfuBO4rqoOJrkoyZkASV6U5BBwFvDhJAe7w18LvAw4N8kXun/PX5SZSJLm1OddN1TVPmDfSNuFQ9sHGCzpjB53DXDNAmuUJC2An4yVpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL42YnNrL5NTe5S5DGhuDXpIaZ9BLUuN6BX2SbUnuSjKTZGqO/pcluTXJ4SQ7RvrOSfKV7t854ypcktTPvEGfZA1wGXA6sBk4O8nmkWHfAM4FPj5y7DOB9wIvBrYC703yjIWXLUnqq88Z/VZgpqrurqpHgd3A9uEBVXVPVd0GPDZy7CuBG6rqwap6CLgB2DaGuiVJPfUJ+pOBe4f2D3VtffQ6Nsn5SaaTTM/OzvZ8aOnY5rt3dKw4Ji7GVtXlVbWlqrZMTEwsdzmS1JQ+QX8fsGFof33X1sdCjpUkjUGfoD8AbEqyMclxwE5gT8/H3w+cluQZ3UXY07o2adm5tKLVYt6gr6rDwC4GAX0ncF1VHUxyUZIzAZK8KMkh4Czgw0kOdsc+CPwlgxeLA8BFXZskaYms7TOoqvYB+0baLhzaPsBgWWauY68ErlxAjZKkBTgmLsZKkhaPQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9CreX4CVqudQS9JjTPoJalxBr20xFxK0lIz6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUuF5Bn2RbkruSzCSZmqN/XZJru/6bk0x27U9KclWS25PcmeSC8ZYvSZrPvEGfZA1wGXA6sBk4O8nmkWHnAQ9V1SnApcAlXftZwLqqei7wQuAtj78ISJKWRp8z+q3ATFXdXVWPAruB7SNjtgNXddvXA6cmCVDAU5OsBZ4CPAp8byyVS5J66RP0JwP3Du0f6trmHFNVh4GHgRMZhP7/At8CvgH8TVU9OPoLkpyfZDrJ9Ozs7FFPQpJ0ZIt9MXYr8GPgl4CNwDuS/OrooKq6vKq2VNWWiYmJRS5JklaXPkF/H7BhaH991zbnmG6Z5njgAeD1wL9W1Y+q6n7gs8CWhRYtSeqvT9AfADYl2ZjkOGAnsGdkzB7gnG57B3BjVRWD5ZpXACR5KvAS4EvjKFyS1M+8Qd+tue8C9gN3AtdV1cEkFyU5sxt2BXBikhngz4DH34J5GfC0JAcZvGD8Y1XdNu5JSJKObG2fQVW1D9g30nbh0PYjDN5KOXrc9+dqlyQtHT8ZK0mNM+glqXEGvSQ1zqCXpMYZ9FJPk1N7mZzau9xlSEfNoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIa1yvok2xLcleSmSRTc/SvS3Jt139zksmhvucl+VySg0luT/Lk8ZUvSZrPvEGfZA1wGXA6sBk4O8nmkWHnAQ9V1SnApcAl3bFrgWuAt1bVc4CXAz8aW/WSpHn1OaPfCsxU1d1V9SiwG9g+MmY7cFW3fT1wapIApwG3VdUXAarqgar68XhKlyT10SfoTwbuHdo/1LXNOaaqDgMPAycCvwZUkv1Jbk3yzrl+QZLzk0wnmZ6dnT3aOUiSnsBiX4xdC/wW8Ibu5x8kOXV0UFVdXlVbqmrLxMTEIpckSatLn6C/D9gwtL++a5tzTLcufzzwAIOz//+oqu9U1Q+AfcALFlq0JKm/PkF/ANiUZGOS44CdwJ6RMXuAc7rtHcCNVVXAfuC5SX6+ewH4HeCO8ZQuSepj7XwDqupwkl0MQnsNcGVVHUxyETBdVXuAK4Crk8wADzJ4MaCqHkryAQYvFgXsq6q9izQXSdIc5g16gKrax2DZZbjtwqHtR4CzjnDsNQzeYilJWgZ+MlaSGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS43rdAkE61k1O/eQWSvdcfMYyVjJ+j8+ttXlp6XhGL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPopWPE5NTen/qErzQuBr0kNc6gl6TG9Qr6JNuS3JVkJsnUHP3rklzb9d+cZHKk/5eTfD/Jn4+nbK1Wjy9vuMQh9Tdv0CdZA1wGnA5sBs5Osnlk2HnAQ1V1CnApcMlI/weATy28XEnS0epzRr8VmKmqu6vqUWA3sH1kzHbgqm77euDUJAFI8hrga8DB8ZQsSToafYL+ZODeof1DXducY6rqMPAwcGKSpwHvAv7iiX5BkvOTTCeZnp2d7Vu7JKmHxb4Y+z7g0qr6/hMNqqrLq2pLVW2ZmJhY5JIkaXXp8w1T9wEbhvbXd21zjTmUZC1wPPAA8GJgR5K/Ak4AHkvySFV9aMGVS5J66RP0B4BNSTYyCPSdwOtHxuwBzgE+B+wAbqyqAn778QFJ3gd835CXpKU1b9BX1eEku4D9wBrgyqo6mOQiYLqq9gBXAFcnmQEeZPBiIEk6BvT6cvCq2gfsG2m7cGj7EeCseR7jfT9DfZKkBfKTsZLUuF5n9NJSG/7k6z0Xn7GMlUgrn2f0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLK9Tk1N6f+spF6UgMeklqnEEvSY3rFfRJtiW5K8lMkqk5+tclubbrvznJZNf+e0luSXJ79/MV4y1fkjSfeYM+yRrgMuB0YDNwdpLNI8POAx6qqlOAS4FLuvbvAL9fVc8FzgGuHlfhkqR++pzRbwVmquruqnoU2A1sHxmzHbiq274eODVJqurzVfXNrv0g8JQk68ZRuCSpnz5BfzJw79D+oa5tzjFVdRh4GDhxZMwfArdW1Q9Hf0GS85NMJ5menZ3tW7ukOfhuHI1akouxSZ7DYDnnLXP1V9XlVbWlqrZMTEwsRUmStGr0Cfr7gA1D++u7tjnHJFkLHA880O2vBz4BvKmqvrrQgiVJR6dP0B8ANiXZmOQ4YCewZ2TMHgYXWwF2ADdWVSU5AdgLTFXVZ8dVtCSpv7XzDaiqw0l2AfuBNcCVVXUwyUXAdFXtAa4Ark4yAzzI4MUAYBdwCnBhkgu7ttOq6v5xT0Qr0/Ba8j0Xn7GMlUjtmjfoAapqH7BvpO3Coe1HgLPmOO79wPsXWKMkaQH8ZKwkNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL60Sfpfs6mXQS1LjDHpJapxBL61yLum0z6CXpMYZ9JLUuF5fDi4t1PDSwD0Xn7GMlWihHn8uR59Hn+Njl2f0ktQ4g16SGmfQS1Ljeq3RJ9kG/C2wBvhIVV080r8O+CjwQuAB4HVVdU/XdwFwHvBj4E+qav/YqteyOdJ6rOu00rFn3jP6JGuAy4DTgc3A2Uk2jww7D3ioqk4BLgUu6Y7dDOwEngNsA/6+ezxJ0hLps3SzFZipqrur6lFgN7B9ZMx24Kpu+3rg1CTp2ndX1Q+r6mvATPd4kqQlkqp64gHJDmBbVf1xt/9G4MVVtWtozH91Yw51+18FXgy8D7ipqq7p2q8APlVV14/8jvOB87vdXwfuWvjUlsVJwHeWu4gltNrmC6tvzqttvrBy5/wrVTUxV8cx8T76qrocuHy561ioJNNVtWW561gqq22+sPrmvNrmC23Ouc/SzX3AhqH99V3bnGOSrAWOZ3BRts+xkqRF1CfoDwCbkmxMchyDi6t7RsbsAc7ptncAN9ZgTWgPsDPJuiQbgU3Af46ndElSH/Mu3VTV4SS7gP0M3l55ZVUdTHIRMF1Ve4ArgKuTzAAPMngxoBt3HXAHcBh4W1X9eJHmcixY8ctPR2m1zRdW35xX23yhwTnPezFWkrSy+clYSWqcQS9JjTPoxyjJO5JUkpO6/ST5uyQzSW5L8oLlrnEckvx1ki91c/pEkhOG+i7o5ntXklcuZ53jlGRbN6eZJFPLXc9iSLIhyWeS3JHkYJK3d+3PTHJDkq90P5+x3LWOU5I1ST6f5F+6/Y1Jbu6e62u7N6GsaAb9mCTZAJwGfGOo+XQG7zTaxOADYf+wDKUthhuA36iq5wFfBi6Adm950fM2IC04DLyjqjYDLwHe1s1zCvh0VW0CPt3tt+TtwJ1D+5cAl3a3dHmIwS1eVjSDfnwuBd4JDF/d3g58tAZuAk5I8uxlqW6Mqurfqupwt3sTg89HQLu3vOhzG5AVr6q+VVW3dtv/wyD8Tuanb3FyFfCa5alw/JKsB84APtLtB3gFg1u5QCPzNejHIMl24L6q+uJI18nAvUP7h7q2lvwR8Kluu9X5tjqvI0oyCfwmcDPwrKr6Vtf1beBZy1TWYvgggxO0x7r9E4HvDp3INPFcHxO3QFgJkvw78ItzdL0HeDeDZZtmPNF8q+qT3Zj3MPhz/2NLWZsWV5KnAf8E/GlVfW9wkjtQVZWkifdkJ3k1cH9V3ZLk5ctdz2Iy6Huqqt+dqz3Jc4GNwBe7/xDrgVuTbGUF3wLiSPN9XJJzgVcDp9ZPPoyxYuc7j1bn9f8keRKDkP9YVf1z1/zfSZ5dVd/qlh7vX74Kx+qlwJlJXgU8GXg6g+/dOCHJ2u6svonn2qWbBaqq26vqF6pqsqomGfyp94Kq+jaDW0C8qXv3zUuAh4f+BF6xui+ieSdwZlX9YKir1Vte9LkNyIrXrU9fAdxZVR8Y6hq+xck5wCeXurbFUFUXVNX67v/tTga3bnkD8BkGt3KBRubrGf3i2ge8isFFyR8Ab17ecsbmQ8A64Ibur5ibquqtrd7y4ki3AVnmshbDS4E3Arcn+ULX9m7gYuC6JOcBXwdeu0z1LZV3AbuTvB/4PIMXvxXNWyBIUuNcupGkxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXH/B91c9Zbn5SxDAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD4CAYAAADiry33AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAARD0lEQVR4nO3df6xfdX3H8edrraDTCApX52i324VuSRnGuVpM3JyRDYs46rLiikbBsaCJTVx00Ysm6Jh/yLaIW8YWyWBB0BTCZmzWOsbEZIkR1gsqrGD1ighFHJcf4hxBrLz3x/fgvnx3yz31fm9v7+c+H8lNz/l8Pud73582fX3PPed8PzdVhSSpXT+z1AVIkhaXQS9JjTPoJalxBr0kNc6gl6TGrV7qAkYdf/zxNTk5udRlSNKycssttzxYVRNz9R1xQT85Ocn09PRSlyFJy0qSbx+sz0s3ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUuF5Bn2Rzkn1JZpJMzdH/6iS3JjmQZOtQ+8uSfCnJ3iS3JfmDcRYvHQkmp3YxObVrqcuQDmreoE+yCrgUOB3YAJydZMPIsHuAc4FPj7Q/Brytqk4CNgMfT3LsQouWJPXXZ62bTcBMVd0FkGQHsAW446kBVXV31/fk8IFV9fWh7e8keQCYAL634MolSb30uXRzAnDv0P7+ru2QJNkEHAV8c46+85NMJ5menZ091JeWJD2Dw3IzNslLgKuAt1fVk6P9VXVZVW2sqo0TE3OusilJ+in1Cfr7gLVD+2u6tl6SPB/YBXywqm46tPIkSQvVJ+j3AOuTrEtyFLAN2NnnxbvxnwE+WVXX/fRlSpJ+WvMGfVUdALYD1wN3AtdW1d4kFyU5EyDJK5LsB84CPpFkb3f4m4BXA+cm+Ur39bJFmYkkaU69fsNUVe0Gdo+0XTi0vYfBJZ3R464Grl5gjZKkBfCTsZLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeq1Y/q5XrRQGvSQ1zqCXpMYZ9FJPXurRcmXQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWpcr6BPsjnJviQzSabm6H91kluTHEiydaTvnCTf6L7OGVfhkqR+5g36JKuAS4HTgQ3A2Uk2jAy7BzgX+PTIsS8EPgScAmwCPpTkBQsvW5LUV58z+k3ATFXdVVVPADuALcMDquruqroNeHLk2NcBN1TVw1X1CHADsHkMdUuSeuoT9CcA9w7t7+/a+uh1bJLzk0wnmZ6dne350pKkPo6Im7FVdVlVbayqjRMTE0tdjiQ1pU/Q3wesHdpf07X1sZBjJUlj0Cfo9wDrk6xLchSwDdjZ8/WvB05L8oLuJuxpXZt0xPIXjKg18wZ9VR0AtjMI6DuBa6tqb5KLkpwJkOQVSfYDZwGfSLK3O/Zh4M8YvFnsAS7q2iRJh8nqPoOqajewe6TtwqHtPQwuy8x17BXAFQuoUZK0AEfEzVhJ0uIx6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfTSIpmc2sXk1K6lLkMy6CWpdQa9JDXOoJekxhn0ktS4XkGfZHOSfUlmkkzN0X90kmu6/puTTHbtz0pyZZLbk9yZ5ILxli8tP96k1eE2b9AnWQVcCpwObADOTrJhZNh5wCNVdSJwCXBx134WcHRVnQz8OvCOp94EJEmHR58z+k3ATFXdVVVPADuALSNjtgBXdtvXAacmCVDAc5OsBp4DPAF8fyyVS5J66RP0JwD3Du3v79rmHFNVB4BHgeMYhP7/APcD9wB/WVUPj36DJOcnmU4yPTs7e8iTkCQd3GLfjN0E/Bj4eWAd8N4kvzQ6qKouq6qNVbVxYmJikUuSpJWlT9DfB6wd2l/Ttc05prtMcwzwEPBm4F+q6kdV9QDwRWDjQouWJPXXJ+j3AOuTrEtyFLAN2DkyZidwTre9FbixqorB5ZrXAiR5LvBK4GvjKFyS1M+8Qd9dc98OXA/cCVxbVXuTXJTkzG7Y5cBxSWaA9wBPPYJ5KfC8JHsZvGH8Q1XdNu5JSJIObnWfQVW1G9g90nbh0PbjDB6lHD3uB3O1S5IOHz8ZK0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktS41UtdgDQOk1O7frJ990fPWMJKpCOPZ/SS1DiDXpIaZ9BLUuN6BX2SzUn2JZlJMjVH/9FJrun6b04yOdT30iRfSrI3ye1Jnj2+8qV2TE7tetq9Bmlc5g36JKuAS4HTgQ3A2Uk2jAw7D3ikqk4ELgEu7o5dDVwNvLOqTgJeA/xobNVLPRigWun6nNFvAmaq6q6qegLYAWwZGbMFuLLbvg44NUmA04DbquqrAFX1UFX9eDylS5L66BP0JwD3Du3v79rmHFNVB4BHgeOAXwYqyfVJbk3yvrm+QZLzk0wnmZ6dnT3UOUiSnsFi34xdDfwG8Jbuz99LcurooKq6rKo2VtXGiYmJRS5JklaWPkF/H7B2aH9N1zbnmO66/DHAQwzO/v+9qh6sqseA3cDLF1q0JKm/PkG/B1ifZF2So4BtwM6RMTuBc7rtrcCNVVXA9cDJSX62ewP4LeCO8ZQuSepj3iUQqupAku0MQnsVcEVV7U1yETBdVTuBy4GrkswADzN4M6CqHknyMQZvFgXsrioff5Ckw6jXWjdVtZvBZZfhtguHth8HzjrIsVczeMRSkrQE/GSsJDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuNWL3UB0qGYnNr1k+27P3rGElYiLR+e0UtS4wx6SWqcQS9JjesV9Ek2J9mXZCbJ1Bz9Rye5puu/OcnkSP8vJPlBkj8ZT9mSpL7mDfokq4BLgdOBDcDZSTaMDDsPeKSqTgQuAS4e6f8Y8LmFlytJOlR9zug3ATNVdVdVPQHsALaMjNkCXNltXwecmiQASd4IfAvYO56SJUmHok/QnwDcO7S/v2ubc0xVHQAeBY5L8jzg/cCfPtM3SHJ+kukk07Ozs31rlyT1sNg3Yz8MXFJVP3imQVV1WVVtrKqNExMTi1ySJK0sfT4wdR+wdmh/Tdc215j9SVYDxwAPAacAW5P8OXAs8GSSx6vqbxZcuSSplz5BvwdYn2Qdg0DfBrx5ZMxO4BzgS8BW4MaqKuA3nxqQ5MPADwx5STq85g36qjqQZDtwPbAKuKKq9ia5CJiuqp3A5cBVSWaAhxm8GUiSjgC91rqpqt3A7pG2C4e2HwfOmuc1PvxT1CdJWiA/GStJjXP1Sh2RXKVSGh/P6KVlanJq19PeEKWDMeglqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx66QjnY5RaKINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxvUK+iSbk+xLMpNkao7+o5Nc0/XfnGSya/+dJLckub3787XjLV+SNJ95gz7JKuBS4HRgA3B2kg0jw84DHqmqE4FLgIu79geB362qk4FzgKvGVbgkqZ8+Z/SbgJmququqngB2AFtGxmwBruy2rwNOTZKq+nJVfadr3ws8J8nR4yhcktRPn6A/Abh3aH9/1zbnmKo6ADwKHDcy5veBW6vqh6PfIMn5SaaTTM/OzvatXZLUw2G5GZvkJAaXc94xV39VXVZVG6tq48TExOEoSZJWjNU9xtwHrB3aX9O1zTVmf5LVwDHAQwBJ1gCfAd5WVd9ccMVqyvAvvb77o2csYSVSu/qc0e8B1idZl+QoYBuwc2TMTgY3WwG2AjdWVSU5FtgFTFXVF8dVtCSpv3mDvrvmvh24HrgTuLaq9ia5KMmZ3bDLgeOSzADvAZ56BHM7cCJwYZKvdF8vGvssJEkH1efSDVW1G9g90nbh0PbjwFlzHPcR4CMLrFGStAB+MlaSGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS+tEJNTu562LLRWDoNekhrXa/VKaaH8BSOHz1N/1/496yme0UtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1Difo9dY+bz88uNz9+3zjF6SGmfQS1LjvHSjZ3SwSzFeommfl3Ta0euMPsnmJPuSzCSZmqP/6CTXdP03J5kc6ruga9+X5HXjK12S1Me8QZ9kFXApcDqwATg7yYaRYecBj1TVicAlwMXdsRuAbcBJwGbgb7vXk7RMudzx8tPnjH4TMFNVd1XVE8AOYMvImC3Ald32dcCpSdK176iqH1bVt4CZ7vUkSYdJquqZByRbgc1V9Ufd/luBU6pq+9CY/+zG7O/2vwmcAnwYuKmqru7aLwc+V1XXjXyP84Hzu91fAfYtfGpL4njgwaUu4jBaafOFlTfnlTZfWL5z/sWqmpir44i4GVtVlwGXLXUdC5Vkuqo2LnUdh8tKmy+svDmvtPlCm3Puc+nmPmDt0P6arm3OMUlWA8cAD/U8VpK0iPoE/R5gfZJ1SY5icHN158iYncA53fZW4MYaXBPaCWzrnspZB6wH/mM8pUuS+pj30k1VHUiyHbgeWAVcUVV7k1wETFfVTuBy4KokM8DDDN4M6MZdC9wBHADeVVU/XqS5HAmW/eWnQ7TS5gsrb84rbb7Q4JznvRkrSVreXAJBkhpn0EtS4wz6MUry3iSV5PhuP0n+ulsC4rYkL1/qGschyV8k+Vo3p88kOXaor8klL+ZbBqQFSdYm+UKSO5LsTfLurv2FSW5I8o3uzxcsda3jlGRVki8n+eduf123lMtMt7TLUUtd40IZ9GOSZC1wGnDPUPPpDJ40Ws/gA2F/twSlLYYbgF+tqpcCXwcugHaXvOi5DEgLDgDvraoNwCuBd3XznAI+X1Xrgc93+y15N3Dn0P7FwCXdki6PMFjiZVkz6MfnEuB9wPDd7S3AJ2vgJuDYJC9ZkurGqKr+taoOdLs3Mfh8BLS75EWfZUCWvaq6v6pu7bb/m0H4ncDTlzi5Enjj0lQ4fknWAGcAf9/tB3gtg6VcoJH5GvRjkGQLcF9VfXWk6wTg3qH9/V1bS/4Q+Fy33ep8W53XQXUr0P4acDPw4qq6v+v6LvDiJSprMXycwQnak93+ccD3hk5kmvi3PiKWQFgOkvwb8HNzdH0Q+ACDyzbNeKb5VtVnuzEfZPDj/qcOZ21aXEmeB/wj8MdV9f3BSe5AVVWSJp7JTvIG4IGquiXJa5a6nsVk0PdUVb89V3uSk4F1wFe7/xBrgFuTbGIZLwFxsPk+Jcm5wBuAU+v/PoyxbOc7j1bn9f8keRaDkP9UVf1T1/xfSV5SVfd3lx4fWLoKx+pVwJlJXg88G3g+8FcMLrGu7s7qm/i39tLNAlXV7VX1oqqarKpJBj/qvbyqvstgCYi3dU/fvBJ4dOhH4GUryWYGP+6eWVWPDXW1uuRFn2VAlr3u+vTlwJ1V9bGhruElTs4BPnu4a1sMVXVBVa3p/t9uY7B0y1uALzBYygUama9n9ItrN/B6BjclHwPevrTljM3fAEcDN3Q/xdxUVe9sdcmLgy0DssRlLYZXAW8Fbk/yla7tA8BHgWuTnAd8G3jTEtV3uLwf2JHkI8CXGbz5LWsugSBJjfPSjSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjftfrBTn9b1eZrsAAAAASUVORK5CYII=\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "dist(50, N)\n", - "dist(100, N)\n", - "dist(500, N)\n", - "dist(1000, N)\n", - "dist(5000, N)\n", - "dist(10000, N)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Quantum Walks**\n", - "\n", - "\n", - "The process of the quantum walk isn't that much different from its classical counterpart, although \n", - "the observed results of the two processes have many differences. First, let us motivate the creation of a \n", - "QW. The idea is that when one performs analysis on a classical random walk, you can find that \n", - "$\\sigma^2 \\ \\sim \\ T$, where $\\sigma$ is the standard deviation of the random walk's probability distribution, \n", - "and $T$ is the number of time-steps of the random walk. For the quantum walk, we can see that \n", - "$\\sigma^2 \\ \\sim \\ T^2$. In other words, the standard deviation grows at a quadratically faster rate. \n", - "At a high level, this signifies that the quantum walker \"spreads out\" quadratically faster than the \n", - "classical one, showing that the process of a QW is quadratically faster than its classical counterpart.\n", - "\n", - "\n", - "In order to create a quantum walk, we have to translate the components of the classical random walk \n", - "to a quantum problem. We can encode the position of a \"walker\" in some $n$ -dimensional space with a vector\n", - "$\\lvert j\\rangle$. For the purpose of this project, we will be investigating a basic case of a \n", - "random walk on a ring-shaped graph, with adjacent nodes connected by a single edge. The configuration \n", - "looks something like this:\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "Going back to our original idea of some position vector $\\lvert j\\rangle$, it is apparent that in order to \n", - "encode the location of a \"walker\" on this graph, we need to assign a specific value of our position vector \n", - "to each node. Well, this is fairly simple, for a graph of $K$ nodes, we form a Hilbert space\n", - "$H_W$ spanned by the following set:\n", - "\n", - "\n", - "$$H_W \\ = \\ \\{\\lvert j\\rangle \\ : \\ j \\ = \\ 0, \\ ..., \\ K \\ - \\ 1 \\}$$\n", - "\n", - "\n", - "We also require another vector in order to create a random walk. We need a \"coin vector\", which will encode \n", - "the direction in which the random walk will progress at the $T$-th step of the process. This Hilbert space \n", - "is spanned by the two basis states, representing forward and backward progression on our number-line-like \n", - "graph (actually, our graph looks more like a ring, so the two basis states will represent \n", - "clockwise and counter-clockwise motion, but it's the same idea). We will call this Hilbert space $H_C$, \n", - "and we can again define our spanning set:\n", - "\n", - "\n", - "$$H_C \\ = \\ \\{\\lvert i\\rangle \\ : \\ i \\ = \\ \\downarrow, \\ \\uparrow\\rangle\\}$$\n", - "\n", - "\n", - "Where the upward-arrow symbol represent counter-clockwise motion, and the downward arrow represents \n", - "clock-wise motion. Now that we have defined all of the vectors we need to encode the information about \n", - "our random walk, we must understand how we can realize these vectors in our quantum algorithm. Well, this is \n", - "again fairly simple. For a graph of $K \\ = \\ 2^n$ nodes, we require $n$ qubits to encode binary representations \n", - "of numbers ranging from $0$ to $K \\ - \\ 1$, therefore each of the vectors spanning $H_W$ will be given \n", - "by the binary representation of $j$ corresponding to the basis vector $\\lvert j\\rangle$. For the coin vector, \n", - "since we have only two states, we only need one qubit to encode the two possible states:\n", - "\n", - "\n", - "$$\\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\ \\text{and} \\ \\ \\lvert 1\\rangle \\ = \\ \\lvert \\downarrow\\rangle$$\n", - "\n", - "\n", - "In order to represent the total space of all possible states of our system, we take the tensor product of the \n", - "two spanning sets, which will then span the new Hilbert space $H_C \\ \\otimes \\ H_W$. We will write a general \n", - "element of this Hilbert space as $\\lvert i\\rangle \\ \\otimes \\ \\lvert j\\rangle$.\n", - "\n", - "Moving right along, we now require a method to evolve our walk forward at each step. We define a random \n", - "walk evolution operator as follows:\n", - "\n", - "\n", - "$$U \\ = \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert $$\n", - "\n", - "\n", - "Essentially, since our qubits take on states $\\lvert 0\\rangle$ and $\\lvert 1\\rangle$, we know that \n", - "any possible, general basis state vector formed from qubits $\\lvert n\\rangle^{\\otimes \\ N}$ will be orthogonal to \n", - "all other vectors in the basis spanning the space. Because of this, we can create an operator that first \n", - "\"picks out\" the coin vector's state (the other term just goes to $0$, as, like I said, the states or orthogonal), \n", - "and then sums over all possible position states until it finds the position state to which the operator is \n", - "being applied. The inner product of the vector and itself is just one (the vectors are not only orthogonal, \n", - "they're orthonormal!), and the new position state of the vector is $\\lvert j \\ \\pm \\ 1\\rangle$, depending on \n", - "the state of the coin vector. This did exactly what we wanted, it evolved our walk either forward or \n", - "backwards by one step! If you're still not convinced, let's check to see what happens when we have the state \n", - "$\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle$ and we apply the $U$ operator:\n", - "\n", - "\n", - " $$U (\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle) \\ \\ = \\ \\Big( \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert \\Big )(\\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 1\\rangle)$$\n", - " \n", - " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle\\langle\\uparrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ + \\ 1\\rangle\\langle j\\lvert 1\\rangle \\ + \\ \\lvert \\downarrow\\rangle\\langle\\downarrow\\lvert \\uparrow\\rangle \\ \\otimes \\ \\displaystyle\\sum_{j} \\ \\lvert j \\ - \\ 1\\rangle\\langle j\\lvert 1\\rangle$$\n", - "\n", - "\n", - " $$\\Rightarrow \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle \\ + \\ 0\\lvert \\downarrow\\rangle \\ \\otimes \\ \\lvert 0\\rangle \\ = \\ \\lvert \\uparrow\\rangle \\ \\otimes \\ \\lvert 2\\rangle$$\n", - "\n", - "\n", - " As you can see, it works! Now, we must consider the randomness of the classical random walk. For the purposes of our \n", - " quantum walk, we will \"set\" $p_{r} \\ = \\ 0.5$, and therefore make $p_{l} \\ = \\ 0.5$ as well. At each time step, \n", - " it is necessary that we randomly flip the state of our coin vector $\\lvert i\\rangle$. The Hadamard \n", - " transformation seems like a natural choice, as:\n", - "\n", - "\n", - " $$H \\ = \\ \\frac{1}{\\sqrt{2}}\\begin{pmatrix} 1 && 1 \\\\ 1 && -1 \\end{pmatrix} \\ \\Rightarrow \\ H \\lvert \\uparrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ + \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}} \\ \\Rightarrow \\ H \\lvert \\downarrow\\rangle \\ = \\ \\frac{\\lvert \\uparrow\\rangle \\ - \\ \\lvert \\downarrow\\rangle }{\\sqrt{2}}$$\n", - "\n", - "\n", - " The probability of measuring one of the basis states is given by squaring the coefficient in the linear combination, which we can see for both outcomes is equal to $0.5$, the same probability of a step to the \n", - " right/step to the left that we originally desired. We can now combine our operators into one \"master operator\" \n", - " that works as one complete step of the random walk, including randomizing the coin vector:\n", - "\n", - "\n", - " $$S \\ = \\ U \\ (H \\ \\otimes \\ I)$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Building a QW With Cirq**\n", - "\n", - "\n", - "Now, that we have established all of the necessary mathematical rigour to create a quantum walk, we \n", - "need to translate this into code. We can start by creating a qubit register, which will be used to represent \n", - "all of the position vectors on our graph. Recall that for an $N$ qubit register, we can encode all numbers \n", - "ranging from $0$ to $2^N \\ - \\ 1$. For now, we will set $N \\ = \\ 7$:" - ] - }, - { - "cell_type": "code", - "execution_count": 214, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[cirq.GridQubit(0, 0), cirq.GridQubit(0, 1), cirq.GridQubit(0, 2), cirq.GridQubit(0, 3), cirq.GridQubit(0, 4), cirq.GridQubit(0, 5), cirq.GridQubit(0, 6)]\n" - ] - } - ], - "source": [ - "number_qubits = 7\n", - "qubits = cirq.GridQubit.rect(1, number_qubits)\n", - "\n", - "print(qubits)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to initialize our qubit register into some initial state. This can vary quite a bit, depending on \n", - "the simulation that we want to make. To start, let's say that our initial position vector for our \"walker\" \n", - "is roughly in the middle of the graph (not exactly, as we have an even number of position vector values). Let's \n", - "also say that our coin vector is initialized in the $|\\downarrow\\rangle$ state. Since $|\\downarrow\\rangle$ corresponds to $|1\\rangle$, the only operations that have to be performed in this qubit initialization method is \n", - "an $X$ gate acting on ``GridQubit(0, 1)`` (initializing the position vector), as well as an $X$ gate acting on \n", - "the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 215, - "metadata": {}, - "outputs": [], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that we have created and initialized our qubit register, we have to create an operation that can evolve \n", - "our walk forward by one step. At a high level, our evolution operation will follow this process:\n", - "\n", - "1. \"Flip\" the coin qubit. The result of this \"flip\" will tell us in which direction our random walker should move. This \"flip\" operation is nothing more than a Hadamard transformation applied to the coin qubit after each evolution operation.\n", - "\n", - "\n", - "2. Based on the state of the coin qubit after the flip, either perform the operation $|j\\rangle \\ \\rightarrow \\ |j \\ + \\ 1\\rangle$ or $|j\\rangle \\ \\rightarrow \\ |j \\ - \\ 1\\rangle$ on the register of qubits encoding the position vector of the walker on the graph. This will involve having two operations controlled by opposite states of the coin quibt, each representing a step forward or a step backward on the graph. Thus, our evolution operation will look something like this:\n", - "\n", - "\n", - "\n", - "\n", - "If we construct our evolution operator in this fashion, the coin qubit is able to dictate whether the walker \n", - "steps forwards or backwards without ever having to be measured!\n", - "\n", - "\n", - "Now that we have a high-level setup for our evolution operator, we have to construct the \"step forward\" and \n", - "\"step backward\" operations. These are nothing more than an addition and a subtraction operator, each of with \n", - "adds or subtracts $1$ from the position vector. \n", - "\n", - "\n", - "Before we actually dive into making the addition and subtraction operators, it will be useful for us to define \n", - "an operation which we will call an n-qubit Toffoli gate. The name is pretty self-explanatory, it is just \n", - "an $X$ gate that is controlled by an arbitrary number of qubits $n$, rather than only $1$ or $2$ in the \n", - "standard $CNOT$ and Toffoli gates. In order to implement this, we can use the built-in function Cirq: `cirq.X(target).controlled_by(*controls)` (see Appendix A for an exact implementation of this gate with $CNOT$s)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can get back to creating the addition and substraction operators. Starting with the addition operator, \n", - "the idea is:\n", - "\n", - "\n", - "\n", - "1. Have a $CNOT$ gate controlled by the coin qubit targetting the least significant qubit. This means that if the coin qubit is in the \"move forward\" state, the addition operator will be activated.\n", - "\n", - "\n", - "2. Apply an $X$ gate to the qubit that was just targetted by the $CNOT$ gate.\n", - "\n", - "\n", - "3. Apply a Toffoli gate controlled by the coin qubit and the qubit on which the $X$ gate was just placed, targetting the second least-significant qubit. This acts as a \"carry operation\", meaning that if the coin qubit is in the addition state, and the least significant qubit is in the $|0\\rangle$ state (meaning it was in the $|1\\rangle$ state, but had the $CNOT$ operation applied to it, we had to apply the $X$ gate to flip it back to the $|1\\rangle$ state so it can activate the Toffoli gate), then flip the value of the next qubit, signifying that the addition mod $2$ carried over a one to the next digit of the number.\n", - "\n", - "\n", - "4. Continue this process with $n$-qubit Toffoli gates controlled by all qubits less significant than the target qubit, along with the coin qubit until all qubits have had Toffoli gates applied.\n", - "\n", - "\n", - "5. Apply $X$ gates to all qubits in the position vector register, as they all had $X$ gates applied to them in the process of addition (This jusst cancels out when we apply the inverse operator to perform subtraction).\n", - "\n", - "For the subtraction operator, we can make use of the fact that quantum operations are reversible, meaning that if \n", - "we have some addition unitary $A$, such that $A |j\\rangle \\ = \\ |j \\ + \\ 1\\rangle$, then:\n", - "\n", - "\n", - "$$A^{\\dagger}A |j\\rangle \\ = \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ \\Rightarrow \\ A^{\\dagger}|j \\ + \\ 1\\rangle \\ = \\ |j\\rangle \\ \\Rightarrow \\ A^{\\dagger}|k\\rangle \\ = \\ |k \\ - \\ 1\\rangle$$\n", - "\n", - "\n", - "And so this means that $S \\ = \\ A^{\\dagger}$. Since we can decompose $A$ into a product of a bunch of unitaries, \n", - "we get:\n", - "\n", - "\n", - " $$A \\ = \\ U_1 U_2 \\ ... \\ U_n \\ \\Rightarrow \\ S \\ = \\ A^{\\dagger} \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger}$$\n", - "\n", - "\n", - "But our method only uses $X$ gates and controlled $X$ gates, all of which are Hermitian, thus we have:\n", - "\n", - "\n", - "$$S \\ = \\ U_n^{\\dagger} U_{n - 1}^{\\dagger} \\ ... \\ U_{1}^{\\dagger} \\ = \\ U_n U_{n - 1} \\ ... \\ U_{1}$$\n", - "\n", - "\n", - "So basically, our subtraction operation will just be applying our addition operator, but with the order of \n", - "gates reversed. This allows us to create one general \"evolution operation\" for our walk, which adds \n", - "or substract $1$ to the walker's position vector, based on the coin qubit:" - ] - }, - { - "cell_type": "code", - "execution_count": 216, - "metadata": {}, - "outputs": [], - "source": [ - "def walk_step():\n", - "\n", - " #\"Flip\" the coin vector\n", - "\n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " #Implement the Addition Operator\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " for i in range(number_qubits, 0, -1):\n", - " \n", - " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", - " if (i > 1):\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1))\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - " #Implement the Substraction Operator\n", - "\n", - " for i in range(1, number_qubits+1):\n", - "\n", - " controls = [cirq.GridQubit(0, v) for v in range(number_qubits, i-1, -1)]\n", - " yield cirq.X.on(cirq.GridQubit(0, i-1)).controlled_by(*controls)\n", - " if (i < number_qubits):\n", - " yield cirq.X.on(cirq.GridQubit(0, i))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Next, we have to append these operations to our quantum circuit, specifically iteratively apply the \n", - "``walk_step()`` function in order to evolve our random walk forward. After we do this, we measure of position \n", - "vector qubit register, by applying measurement gates, and we sample our circuit repeatedly. In code, for the \n", - "example of $10$ iteration of our evolution operator, $200$ samples of the circuit, and $7$ position vector \n", - "qubits, we have:" - ] - }, - { - "cell_type": "code", - "execution_count": 222, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({12: 1177, 14: 663, 20: 334, 10: 318, 16: 293, 52: 274, 18: 227, 48: 157, 22: 151, 40: 131, 28: 130, 54: 129, 32: 126, 30: 124, 26: 121, 42: 108, 36: 97, 38: 95, 24: 94, 34: 78, 44: 61, 46: 58, 50: 19, 8: 18, 56: 16, 58: 1})\n" - ] - } - ], - "source": [ - "number_qubits = 7\n", - "iterator = 30\n", - "sample_number = 5000\n", - "\n", - "def generate_walk(number_qubits, iterator, sample_number):\n", - "\n", - " circuit = cirq.Circuit()\n", - "\n", - " circuit.append(initial_state())\n", - " for j in range(0, iterator):\n", - " circuit.append(walk_step())\n", - " circuit.append(cirq.measure(*qubits, key='x'))\n", - "\n", - " simulator = cirq.Simulator()\n", - " result = simulator.run(circuit, repetitions=sample_number)\n", - " final = result.histogram(key='x')\n", - "\n", - " print(final)\n", - " return final\n", - "\n", - "final = generate_walk(number_qubits, iterator, sample_number)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Finally, we then graph the results of our simulation, with final position vector value on the x-axis and the \n", - "number of occurrences of that position vector value on the y-axis. This gives us a probability distribution for \n", - "the position of the walker. It is important to note that the graphs will only have either even or odd \n", - "numbered data point, depending on the initial position of the walker and the number of steps taken:" - ] - }, - { - "cell_type": "code", - "execution_count": 223, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD4CAYAAAAAczaOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deXzU1bn48c+TyZ6QhCxsCZKgLMqiKKKCVQtVcGm1ar3aDZeW29Zu11bFtl7v7f3dq/7ordL+WntxabWtXS5atK0VFaFuBWVRNglEwpKwJJkkQNbJzJzfH/OdMCQzyWT2zDzv14tXZs58M9/zDcmTk+ec73PEGINSSqnUkBbvDiillIodDfpKKZVCNOgrpVQK0aCvlFIpRIO+UkqlkPR4d2AgpaWlprKyMt7dUEqpYWXTpk1Nxpgyf68ldNCvrKxk48aN8e6GUkoNKyKyP9Brmt5RSqkUokFfKaVSiAZ9pZRKIRr0lVIqhQwa9EXkKRFpEJHtPm3LRGSXiGwVkT+JSJHPa/eJSI2IVIvIQp/2RVZbjYgsjfylKKWUGkwwI/1fAYv6tL0KTDfGzAR2A/cBiMhZwM3ANOtzfi4iNhGxAT8DrgTOAm6xjlVKKRVDgwZ9Y8wbQHOftleMMU7r6Xqgwnp8LfB7Y0y3MaYWqAHmWP9qjDF7jTEO4PfWsUoppWIoEjn924G/WY/LgYM+r9VZbYHa+xGRJSKyUUQ2NjY2RqB7SimlvMK6OUtEvg84gd9GpjtgjFkBrACYPXt2Qhf7X7WlnmWrqznU2sm4ohzuXjiF62b5/V2mlFIJIeSgLyK3AtcAC8zJnVjqgfE+h1VYbQzQPiyt2lLPfc9vo7PHBUB9ayf3Pb8NQAO/UiphhZTeEZFFwD3Ap4wxHT4vvQjcLCJZIlIFTALeBd4DJolIlYhk4pnsfTG8rsfXstXVvQHfq7PHxbLV1XHqkVJKDW7Qkb6I/A64DCgVkTrgATyrdbKAV0UEYL0x5ivGmB0i8kdgJ560z53GGJf1Pl8HVgM24CljzI4oXE/MHGrtHFK7UkolgkGDvjHmFj/NTw5w/H8C/+mn/SXgpSH1LoGNK8qh3k+AH1eUE4feKKVUcPSO3BDdvXAKORm2U9pyMmzcvXBKnHqklFKD06AfoutmlfPg9TPIz/L8sZSVnsaD18/QSVylVELToB+G62aVc/lZowEYXZCtAV8plfA06Iepqa0bgLqWDhxOd5x7o5RSA9OgH6bmdgcAbuMJ/Eoplcg06IfJ3ubg9LI8APbbNegrpRKbBv0wGGOwt3dz3oSRANQ2tce5R0opNTAN+mE43uWkx2WYPHoEI7LS2W/XoK+USmwa9MNgtyZxS/IzmVCaS62md5RSCU6Dfhi8k7gleVlUluTpSF8plfA06Iehqc0K+vmZVJbkUdfSSY9Ll20qpRKXBv0w2Ns96Z3S/CwqS/NwuQ11LVpwTSmVuDToh8FujfRH5mZSWZILwD5N8SilEpgG/TDY27opyE4nMz2NylLPWv19umxTKZXANOiHwd7uoDQ/C4CSvEzys9L1Bi2lVELToB8Ge5uDkvxMAESEytJcvUFLKZXQNOiHwd7eTUleVu/zCbpsUymV4DToh8F3pA9QWZLLQV22qZRKYBr0Q+RyG5o7HJTk+QZ9z7LNel22qZRKUBr0Q9TS4cAYKMk/md7xruCp1RSPUipBadAPUW8JhvxTR/oA+3UyVymVoDToh8i7Y5bvRG5pfiZ5mTb26bJNpVSC0qAfIu/duKU+I33Pss08vStXKZWwNOiHyFtWudhnIhewqm3qSF8plZgGDfoi8pSINIjIdp+2YhF5VUT2WB9HWu0iIj8RkRoR2Soi5/p8zmLr+D0isjg6lxM79nYHaQJFuX2CfmkuB5s7cOqyTaVUAgpmpP8rYFGftqXAGmPMJGCN9RzgSmCS9W8J8Bh4fkkADwAXAHOAB7y/KIYre7uD4rxMbGlySvuEkjycbkN9qy7bVEolnkGDvjHmDaC5T/O1wNPW46eB63zanzEe64EiERkLLAReNcY0G2NagFfp/4tkWLG3nXo3rpd3BY+WY1BKJaJQc/qjjTGHrcdHgNHW43LgoM9xdVZboPZ+RGSJiGwUkY2NjY0hdi/6+t6N61VZ6imxrHl9pVQiCnsi1xhjABOBvnjfb4UxZrYxZnZZWVmk3jbivOmdvsrys8jLtOlIXymVkEIN+kettA3WxwarvR4Y73NchdUWqH3Yamrr7i2r7EtEtPCaUiphhRr0XwS8K3AWAy/4tH/RWsVzIXDMSgOtBq4QkZHWBO4VVtuw5HC6OdHlPKXujq/K0ly9QUsplZDSBztARH4HXAaUikgdnlU4DwF/FJE7gP3ATdbhLwFXATVAB3AbgDGmWUT+A3jPOu6Hxpi+k8PDxskSDP1H+uCZzH1lx1GcLjfpNr0VQimVOAYN+saYWwK8tMDPsQa4M8D7PAU8NaTeJajeEgx+JnLBE/S9yzYnWKt5lFIqEegwNAT29v4lGHz17perKR6lVILRoB+CkyUYAqV3vMs2dTJXKZVYNOiHwF9ZZV9lI7LI1WWbSqkEpEE/BE1tDjJtaYzI8j8lcnLZpqZ3lFKJRYN+COxt3ZTkZyIiAY+pLMlln470lVIJRoN+COzt/ksw+KoszeNgi1bbVEolFg36IbC3dQecxPWqLMmlx2U41NoVo14ppdTgNOiHoKnNQWmAu3G9vNU2dRctpVQi0aAfguYg0zugQV8plVg06A9Rh8NJZ48rYAkGr1EjssjJsLGvSVfwKKUShwb9IfJuiB6o2JqXZ9lmro70lVIJRYP+EA1Wd8dXVWmeBn2lVELRoD9EJ0f6A6d3wLNf7sHmDlzuiO0xo5RSYdGgP0SDlWDwdXLZpm6SrpRKDBr0h6ip3UrvBDHS1xU8SqlEo0F/iOxtDvIybeRk2gY9tnetvpZjUEolCA36Q2Rv66Y4iNQOwOiCLLIz0rSuvlIqYWjQHyJ7uyOo1A54lm1WluTpSF8plTA06A+Rvc0RcMcsfypLdNmmUipxaNAfInt7d9AjfYAJpbkcbO7UZZtKqYSgQX8IjDHY2wavu+OrqiQPh8utyzaVUglBg/4QHO904nSbQevu+Jqg1TaVUglEg/4QnFyjP4SRfu9afV3Bo5SKv7CCvoj8i4jsEJHtIvI7EckWkSoR2SAiNSLyBxHJtI7Nsp7XWK9XRuICYmkod+N6jRrhWba5X1fwKKUSQMhBX0TKgW8Cs40x0wEbcDPwMPCIMeYMoAW4w/qUO4AWq/0R67hhxd4W/N24XmlpwoRiXcGjlEoM4aZ30oEcEUkHcoHDwHxgpfX608B11uNrredYry+QgXYWT0BNVrG1oSzZBKgszdX0jlIqIYQc9I0x9cCPgAN4gv0xYBPQaoxxWofVAeXW43LgoPW5Tuv4klDPHw/eCpsjh5DTB89a/QN2rbaplIq/cNI7I/GM3quAcUAesCjcDonIEhHZKCIbGxsbw327iLK3d1OYk0GGbWhftspSz7LNw8d02aZSKr7CSe98Aqg1xjQaY3qA54F5QJGV7gGoAOqtx/XAeADr9ULA3vdNjTErjDGzjTGzy8rKwuhe5A11jb7XhJJcAN06USkVd+EE/QPAhSKSa+XmFwA7gbXAjdYxi4EXrMcvWs+xXn/dGDOs8h329m5KhzCJ61WlJZaVUgkinJz+BjwTspuBbdZ7rQDuBe4SkRo8OfsnrU95Eiix2u8ClobR77gIdaQ/ekQ2WelpWnhNKRV36YMfEpgx5gHggT7Ne4E5fo7tAj4Tzvnizd7u4IIQgn5amlVtU1fwKKXiTO/IDZLT5aalw0FxCOkd8OT1Nb2jlIo3DfpBaunowZihr9H3qizVZZtKqfjToB+k3hIMIY70K61qm0eOd0WyW0opNSQa9IPUW4Ih1JF+77JNTfEopeJHg36QmtpDK8HgVanLNpVSCUCDfpC8I/1QJ3LHFOiyTaVU/GnQD5K9zUGaQFFORkifn5Ym1goeXbaplIofDfpBsrd7lmumpYVeGHRCSZ6O9JVScaVBP0j2tu6Q8/leVaV57G/uwK3LNpVScaJBP0j29tBKMPiaUJKLw+nmsC7bVErFiQb9INnbukNeo+9VZW2SrlsnKqXiRYN+kOxtDoqHuHlKXxOsZZu1umxTKRUnGvSD0O10caLbGXZOf2xBNpnpaezXFTxKqTjRoB+E3hIM+eGldzybpOfqCh6lVNxo0A+Cd2/ckjDTO6u21HOwuYNXdh5l3kOvs2pL/eCfpJRSEaRBPwhNvXV3Qh/pr9pSz33Pb6PL6QagvrWT+57fpoFfKRVTGvSDEImR/rLV1XT2uE5p6+xxsWx1dVh9U0qpodCgHwR7e3gVNgEOtXYOqV0ppaJBg34Q7O0OMtPTyM8KfXfJcUU5Q2pXSqlo0KAfBHubg9K8TERCr7tz98Ip5GTYTmnLybBx98Ip4XZPKaWCFtbG6KnC3tYd9nLN62aVA57cfn1rJzYRHrx+Rm+7UkrFgo70g+CpsBneck3wBP63l87ne1dNxWUMH5tUGoHeKaVU8DToB8HeFn6xNV/TywsB2H7oeMTeUymlgqFBfxDGGOzt3ZSGmd7xNW2cFfTrj0XsPZVSKhhhBX0RKRKRlSKyS0Q+FJGLRKRYRF4VkT3Wx5HWsSIiPxGRGhHZKiLnRuYSoqvD4aKrxx323bi+CnMymFCSy7Y6DfpKqdgKd6S/HHjZGDMVOBv4EFgKrDHGTALWWM8BrgQmWf+WAI+Fee6Y6L0xK4IjffCkeLYf0qCvlIqtkIO+iBQClwBPAhhjHMaYVuBa4GnrsKeB66zH1wLPGI/1QJGIjA255zHS5L0xK4IjfYAZ5YXUtXTSYhVzU0qpWAhnpF8FNAK/FJEtIvKEiOQBo40xh61jjgCjrcflwEGfz6+z2k4hIktEZKOIbGxsbAyje5FxcqQf2aA/3crr79DJXKVUDIUT9NOBc4HHjDGzgHZOpnIAMMYYYEgbwhpjVhhjZhtjZpeVlYXRvchobg+/2Jo/08sLANimk7lKqRgKJ+jXAXXGmA3W85V4fgkc9aZtrI8N1uv1wHifz6+w2hJaU4TKKvdVlJtJxcgcXcGjlIqpkIO+MeYIcFBEvHUEFgA7gReBxVbbYuAF6/GLwBetVTwXAsd80kAJy97mID8rnew+JRQiYYZO5iqlYizcMgzfAH4rIpnAXuA2PL9I/igidwD7gZusY18CrgJqgA7r2IRnb++OeD7fa3p5IX/bfoRjnT0U5mRE5RxKKeUrrKBvjHkfmO3npQV+jjXAneGcLx4isSF6IN47c3fUH2PuGVqSQSkVfXpH7iDs7Q5K8iI7ies1o7ccg6Z4lFKxoUF/EPa2bkqjlN4pzsukvCiHbfW6bFMpFRsa9Afgdhua2yNbbK2vaeMK2KEreJRSMaJBfwDHu3pwuk3U0jvgSfHsbWrnRFdP1M6hlFJeGvQH0BSlu3F9Ta/QO3OVUrGjQX8A9jZv3Z3ojfSna5llpVQMadAfQHN79Ef6ZSOyGFOQrUFfKRUTGvQH0BSDoA+e9fpag0cpFQsa9AfgTe8U50Y76Bewt6md9m5nVM+jlFIa9Adgb3NQlJtBui26X6YZ5YUYAzsP62SuUiq6NOgPwN7eHfHqmv5478zV7ROVUtGmQX8A9jZHxOvo+zOqIJuyEVlajkEpFXUa9Adgb3dErQRDXzPKC3UFj1Iq6jToD8De1h3VNfq+po8roKahjU6HKybnU0qlJg36AThdblo6eqJWVrmv6eWFuHUyVykVZRr0A2ju8KzRj1l6p0LvzFVKRZ8G/QBO3o0bm/TOmIJsSvIyNegrpaJKg34A9ihtiB6IiOiduUqpqNOgH0CTt9hajEb64FnBs6ehja4encxVSkWHBv0AvCP9WOX0wVOOweU27DpyImbnVEqlFg36Adjbu7GlCQXZGTE7p3ejdE3xKKWiRYN+AM3tDorzMklLk5ids7woh5G5GWzXcgxKqSjRoB9AU5sjZpO4Xt7JXC3HoJSKFg36AdjbuimN4SSu1/TyQnYfPUG3UydzlVKRF3bQFxGbiGwRkb9Yz6tEZIOI1IjIH0Qk02rPsp7XWK9XhnvuaLK3O6K+eYo/M8oL6XEZdh9pi/m5lVLJLxIj/W8BH/o8fxh4xBhzBtAC3GG13wG0WO2PWMclLHubI2YlGHx598zVyVylVDSEFfRFpAK4GnjCei7AfGCldcjTwHXW42ut51ivL7COTzhdPS7aup1xSe+ML86hIDtdg75SKirCHek/CtwDuK3nJUCrMca7718dUG49LgcOAlivH7OOP4WILBGRjSKysbGxMczuhaa3BEMcRvreydwdOpmrlIqCkIO+iFwDNBhjNkWwPxhjVhhjZhtjZpeVlUXyrYPWW4IhDiN98OT1dx0+gcPpHvxgpZQagnBG+vOAT4nIPuD3eNI6y4EiEUm3jqkA6q3H9cB4AOv1QsAexvmjpqndW4Ih9iN98Kzgcbjc7D6qd+YqpSIr5KBvjLnPGFNhjKkEbgZeN8Z8DlgL3Ggdthh4wXr8ovUc6/XXjTEm1PNHU6yLrfXlvTNXUzxKqUiLxjr9e4G7RKQGT87+Sav9SaDEar8LWBqFc0eEPQ7F1nxNKM5lRJZO5iqlIi998EMGZ4xZB6yzHu8F5vg5pgv4TCTOF23N7Q6y0tPIy7TF5fxpacK08gK21esuWkqpyNI7cv1oanNQmp9FPFeUTh9XyIeHj9Pj0slcpVTkaND3w97eHbdJXK8ZFYU4nG5qGvTOXKVU5EQkvZNs7G2OmNbR98c7mbu9/hhnji2IyjlWbaln2epqDrV2Mq4oh7sXTuG6WeWDf6JSatjSkb4f9rZuivPiM4nrVVWSR16mLWp75q7aUs99z2+jvrUTA9S3dnLf89tYtaV+0M9VSg1fGvT7+NPmOg4d6+K5zXXMe+j1uAXBtDRh2rjo7Zm7bHU1nX22ZezscbFsdXVUzqeUSgwa9H14R79e8R79Ti8vZOfh47jckb+d4VBr55DalVLJQYO+j2Wrq+nqU/ognqPf6eUFdPW4+agx8pO5Ywqz/baPK8qJ+LmUUolDg76PRBv9zvDumRuF7RMrS/L6tWWlp3H3wikRP5dSKnFo0PcRaJQbr9HvtrpjCPCd//0govMLa6sb+MdeO/OnjqLc59rOryzW1TtKJTldsunj7oVTuOuP7+ObQs/JsMVl9LtqSz3fX7Udb1e88wtAWIG5tcPBvSu3Mnl0Pj//3LlkZ3juOv6XP7zPazuP0uFwkpup3xZKJSsd6ftYNH0MIkJ+VjoClBfl8OD1M+Iy+o3W6pp/fWEHze0OfnzTOb0BH+CWOadxotvJX7YeDuv9lVKJTYd0PrYcaMXlNvzklnOYP3V0XPsSjfmFv249zIsfHOKuyyf33vzldX7lSM4Ylc/v3j3ATbPHh3wOpYaDVL4xUUf6PjbU2hGB8yYUx7srAecRAq26GUzDiS5+sGobZ1cU8rXLTu/3uohwy5zT2HKglQ8Pa6E3lbxS/cZEDfo+3q1t5qyxBRTmZMS7K9y9cAo5Gf2rfGamp9FibecYLGMM9z23jQ6Hi/++6RzSbf7/2284t5zM9DR+9+6BkPqs1HCQ6jcmatC3OJxuNh9oYU5V/Ef54JmsffD6GZQX5fTOL9w2r5LDx7q44RfvUNfSEfR7/e/GOtbsauCeRVM5Y1R+wOOKcjO5esZY/rS5nk6HK+BxSg1nibY0O9Y0p2/ZVt9KV4+bC6r67dUeN9fNKu+XZ1w0bQxfemYjNzz2Dk/fPoepYwYuxnawuYMf/mUnF04s5ra5lYOe85Y5p/GnLfX8eeshze2rpDSuKId6PwE+VW5M1JG+Zf3eZoCEGekHcsHEEv73KxcB8Jlf/IMNewNvM+x2G+5e+QEAy248m7S0wfcH8J3QVSoZ3b1wCtnpp4a+VLoxUYO+5d3aZiaPzqc4TvviDsXUMQU899W5jBqRxReeepeXt/tfZvmrd/axfm8z919zJuOLc4N6b53QVcmu71/QgqfOla7eSSFOl5uN+5oTfpTvq2JkLiu/Mpdp4wr46m838+v1+095vaahjYdf3sWCqaOGnKbRCV2V7I539TCmIJvaB69iyaUT2XyghZqGE/HuVkxo0Ad2Hj5Ou8OVUPn8YIzMy+TZL13I/CmjuH/Vdv751xuZ++AaKpf+lSuXv0F6mvDgDTOGvO2jTuiqZNbjcvPm7iYunVyGiPDPl5xOToaN5Wtq4t21mNCgjye1A3DBMBrpe+Vk2vifL5zHBVXFrN5xlEPHugDocRl6XIZ3agLn/AfivUP3z1sPRbK7SsXd5v0tnOh28vGpZQAU52WyeG4lf9l6iN1Hk3+0r0EfzyRuVWkeowpCu/Ep3tJtaRxs7r+E0+Fyh7z2WCd0VbJaW91Iepow74zS3rYlH5tIboaN5Wv2xLFnsZHyQd/tNry3r5k5lcNvlO/rsDXC7yvUtcc6oauS1brqBmZXjmRE9smbMEfmZXLrvEpe2naYXUeS+/s95KAvIuNFZK2I7BSRHSLyLau9WEReFZE91seRVruIyE9EpEZEtorIuZG6iHBUHz3Bsc4eLpg4vIN+NMpC64SuSjZHjnWx68gJLpsyqt9rX/7YRPIy01n+WnKP9sMZ6TuB7xhjzgIuBO4UkbOApcAaY8wkYI31HOBKYJL1bwnwWBjnjhhvPn84rdzxx1/ZhnDLQuuErko266obAPi4n6BflJvJ7fMq+dv2I+w8lLyj/ZCDvjHmsDFms/X4BPAhUA5cCzxtHfY0cJ31+FrgGeOxHigSkbEh9zxCNtTaKS/KoWJkcOvYE5W/sg2RKAutE7oqmayrbmRsYTaTR/svR3LHxRMZkZ3O8jW7Y9yz2IlIGQYRqQRmARuA0cYY791CRwBvjeJy4KDPp9VZbXEr4G6M4d3aZi6ZVBavLkSUv7IN4dKSyypZOJxu3qpp4pNnjwu4jLkwN4Pb51WxfM0ettcf61eCPBmEPZErIvnAc8C3jTGn/E1kjDGA8fuJgd9viYhsFJGNjY2N4XZvQB81ttPU5hj2qZ1o0gldlSw27W+hrdvJZVMGHuTdfnEVBdnpPJqkuf2wgr6IZOAJ+L81xjxvNR/1pm2sjw1Wez3gO1SssNpOYYxZYYyZbYyZXVYW3RF47/r8icPrpqxYu36WTuiq4W9ddQMZtlOXavpTmJPBlz42kdc+PMq2umMx6l3shLN6R4AngQ+NMT/2eelFYLH1eDHwgk/7F61VPBcCx3zSQHGxodZO2YgsKkuGdz4/2kbmZXLV9DE6oauGtXXVjZxfWUx+1uBZ7dvmVVKYk8GjryVfbj+ckf484AvAfBF53/p3FfAQcLmI7AE+YT0HeAnYC9QAjwNfC+PcYTPGsGFvMxdUFQ+5TEEq+uwFE3RCVw1bh1o7qT56wu+qHX9GZGfw5Y9VsWZXAx8cbI1y72Ir5IlcY8xbeArU+bPAz/EGuDPU80XaweZOjhzvGpalF+JBJ3RVLEV6D9t11Z75wcHy+b5unVfFE2/V8uhru/nlbXNCPneiSdk7cjfUemrSaD4/OCLC9HEFbDnQSuXSvzLvoddTZk9RFVvR2MN2bXUD5UU5A+4c11d+VjpLLpnI2upGNh9oCfnciSaFg34zI3MzOKMs+G+CVLZqSz0vbz/S+zzVNpNWsRPpPWy7nS7eqWnisillQ07lLr6okuK8zKRayZOyQf/dWk/9/GB2k1KeH8Qup/uUtlTaTFrFTqT3sN24r4V2hyvofL6vPGu0/8buRjbtT47RfkrukXv4WCcHmjtYHMSescoj0A+cv71GYyXSed9kM1y/PqMLsjlyvH8BwVDrSK2rbiDTlsbcM0JL5X7xogn8v9dr+Ozj63E43cPqa+lPSgb94Vw/P14CbSadYRMONncEvR3jQIYSpLx5X28awJtuAgb8nKEEweEaNCG0r08icLsNRbkZ/YK+CHzniskhvefa6kbmVBWTmxlauHtlx1G6elw43Z77TIfL1zKQlEzvbKhtZkRWOmeOLYh3V4YNfwXdMm1p2NKEa376FmurGwJ8ZnAGm7xzutzUtXSwfq+d5zbVcf8L2/3mfe9ftZ1fvl3LC+/X89aeJnYeOs7R412s3Hhw0MlBYwwOp5u2bie/Wb+fpc9tjehkYiw9/PKuiObFY2XFm3vZdeQEN55X0VtHamRuBsZAVrpt0M/v62BzBzUNbUNatdPXstXVvQHfazh8LQNJyZH+hr12ZleOxKb5/KB5RzR9R76zTiviK7/ZzO2/eo9vzp/EtxZMCmmeJNDk3T0rt7JsdTVHjnfhcg9e0eNEt5N///POoM7Z2ePirj++z/2rttPtctPjcmMGOIX3Bz2RR3fHOnp46u3agPsr1Ld28ti6j1g4bTQTE2wRw+YDLfxodTVXTh/Dshtn9k66utyGK5e/wY9eqeaKaaPJsAU/Vl2327tUc+j5fK9IzzHEW8oF/aa2bj5qbOczutZ8yAIVdHv+q3P5wartLF+zh/cPtrL85nMoys0M+n3tbd0B5wYcLjdzqoqpGJlDeVEO5SM9FVE/9/j63q0hfY0rzObP37iY5nYH9nZH78f7V233+/5uAzfOriAzPY0sWxqZ6Z5///XSLr/Hx3MOYyAt7Q6efKuWp9/Zx4luJ9kZaXT1uPsdl2ETHn55Fw+/vIszRuWzcNporjhrDDMrCnnh/UNxS2cd6+jhG89uYUxhNg/dMPOUVTa2NOHuhVP58jMbWbmpjlvmnBb0+/69uoHxxTmcXpYXct8CpTbD2asinlIu6CdL/fxEkpNp40efmcm5E4r49xd3cs1P3+IXnz9vwAqF3U4Xa3c1sHJTfW+Nc3/Ki3J45J/O6dd+z6Kpp+SswbN/wD2LplKSn0VJfhaTfI7/xbqP/P7glhfl8MAnp/Vrf/qd/X6Pt6UJb9c0DVq/JRiRmDOwt3Xz+Ju1/Pof++jocXHV9LF8ff4ZVB854ffr8+D1Mzi/qphXdxzhlZ1H+cXf9/KztR9RmJNBW7ez96+pWOatjTHc+9xWTxruq3MpzMnod8wnzhzFuacVsfy1PXx6VjnZGYOnereZr40AAA1DSURBVLqdLt6usXPjeRVh3XV/98Ip/b6WNpGw9qqIp5QM+jkZNmYkYcnUeBIRPnfBBKaNK+Rrv9nE9Y+9w/WzynlzT1NvUPvuFZOpLM3j+c31/HnrIVo7ehg1Ios7Lq6iKCeDn7xe0y9IBfrBCpRuChSg/P3gDvT+/o7PtKVRmJPB557YwC1zxnPfVWdSkN0/QAUj3Ino0QXZnDl2BOv3NtPldPHJmeP4+vwzmDx6BEDvfFWgr8+t86q4dV4VLe0OXt/VwPdXbeuXPotVOus36/fz8o4jfO+qqZwzvsjvMSLCvYum8k8r1vPMP/ax5JLTB33fd2ub6exx9W6AHqq+32v52emc6HJSkDM8w6eYgZKYcTZ79myzcePGiL7nokffoDQ/i9986YKIvq86yd7WzS2Pr2f30bZT2gVPne3sjDQWThvD9edWcPEZpb1zK9FeLROJ1TuLpo/hkVd38/ibexk1Ipv/un4686eODvgegcx76HW/f0kU52Xy45vO9qSb0tPItNnITE/jjd2N/OiVarr73Csxe8JIHrph5pDuNPWnaulfA9ZA3/fQ1WG990B2HDrGp3/+DnNPL+GpxecPOh906y/fZcuBVt645+N+/yLw9R9/2cmv1+/ng3+9gpzMoU8CB+Jwurnmp29yosvJK/9yySl77SYKEdlkjJnt77Xh+asqRK0dDqqPnuDqGXHfsCupleRn0dbl7NdugKKcDN689+N+f1CisQlMOO8f6Pj7rjqTq2aM5e6VH3D7rzZy/axy/vWTZ7GuunHAXyrN7Q7W77Xzdk1TwLmB5nYHt/7yvaD7ePhYV9gBHwZekhutzUTau51849ktjMzN4L8/c3ZQCwC+e8UUrvnpWzz+xl6+O0h6ZW11AxdOLIlowAfITE/j4Rtmcv1j7/Dwy7v4P9fNiOj7R1tKBf339rVgjObzYyHQ6pFjnT0JOTIaqrPHF/Hnb1zMz9Z+xM/X1vDqh0fp7nHjcHlG4vWtnSx9bis7Dx3HbQzvfGRnp7UJTV6mjaz0tH6jdoCy/Cx+8YXzcDg97+Vwev7d+exmv/2I1AqSQOms7Iw0rv3Z23zp4iq+/YnJEQ2g96/azj57O89++UJK8rOC+pzp5YV88uxxPPlWLV+cO4FRI7L9HnfA3sHexnY+f8GEiPXX16zTRnL7vCqefKuWT84cN6xqeKXUOv13a+1kpqdxdoC8oYqcQCsbhuuKB3+y0m3cdflkXvz6xXT1uHoDvleX082KN/fyzPr9FOZk8N0rJvPcV+fy/gNX8PANM/1uZP/9q8/kvAkjuej0Ei6dXMblZ43m6pljKY/y19PfHsv/98aZvHnvfG6aXcH/vLGXRcvf4J2apoicb+WmOp7fUs83F0ziwiEGzO9cPpkel5ufvV4T8Jh1u60N0KeGvlRz0H5cMZnxxTksfX4bXT3DZ5+JlBrpb6ht5pzxRUHN/KvwDHXidDg7a1wBPa7Ac2NbH7ii3/dctCeiQxEonfXg9TP55Nnj+N7z2/jsExu4aXYF37/qLNZWN4Q0B1PT0Mb9q7Zz4cRivjF/0qDH91VZmsc/nT+eZ989wB0XT+Q0P5sgratuZEJJLlWloS/VHExuZjoPfnomn39yA8vX7OHeRVOjdq5ISpmg39btZHv9Me78+Bnx7kpKGGpQG+7KA+TEy4tyAg4yhjLHEO+v59zTS3n525fw6Gt7ePzNvfxt+5F+6ayBVh95J8XrWztJTxOyMtJYfvOskG+Q/OaCSTy3uY5HXtvdb0lvV4+Ldz5q4ubzg1/PH6qLJ5Vy0+wKVryxl6tnjB0WG6mnTNDftL8Ft4ELqoZP7m24i/bEbCKJ50g8VrIzbCy9cirXzBzLp3/+dr+/bjp7XPzbn3eQYUsjN9NGdoaN3Ewb73zUxKOv7emdw3C6DWlOwz8+sod8PaMLsrl1bhX/88ZH/POlE5k65mRJlQ21zXT1uLk0jNILQ+H5q6eRe1Zu5YWvzxvSHcPxkDJBf8NeO+lpwrkTNJ+vIi/eI/FYml5eGDCd1drRE3DS2ZfD5Q77HoCvXno6z27Yz49WV/PE4vN729fuaiArPY2LYjS5WpibwX9cO52v/GYTK97Ym/DZhJQJ+u/WNjOjojDkSntKDSbeI/FYCpTOGj0ii2fuuIDOHhcdDiddPS5u/5X/e23CXXlUmJvBVy47nf/7cjUb9zUzu9KzKu/vuxu56PSSmM7dLZo+hqtmjGH5mj0smj6G0xOsrpGvxP47JEI6HS4+qGvVpZpKRYi/qqs5GTbuu+pMpowZwTnji5h7einzp46O6sqj2+ZWMWpEFg+/vAtjDPua2qltag9pw5Rw/dunppGTYWPpc1txB1EcMF5SIuhvOdhCj8twoebzlYoIf0s8H7x+ht+/dAL9gojEfEdOpo1vLJjEe/taWFfd2FvHKZxSyqEaNSKbH1x9Ju/ta+G3G/bH/PzBSvoyDKu21HP/qu2c6HYytjCbexdNTZk/wZVKFNEssdHjcnPRg2s41tFDj9tgSxP++zNnx+Xn3BjDF596l837W3jlrksD/pUTbQOVYUjqoN+3qBWcrDSogV+p5LBqSz13r/zglMnleP6cH2zuYMGP/44A3U435XGY1B8o6Cd1eifQxhzDdccbpVR/y1ZX+10+Gq+f8037WzBu07tENdF2XYv5UhYRWQQsB2zAE8aYh6J1rmTb8UYp1V+i/ZwvW11Nj58y1T9YtZ3sDBszKwoZW5h9So3/WO7HHNOgLyI24GfA5UAd8J6IvGiMCW5/uyFKth1vlFL9JdrPeaBfNm3dTr7ym00AlOZnMbOikBnlhXQ4nPz6H/vpcgZ3d3O4Yp3emQPUGGP2GmMcwO+Ba6N1smiuGlBKJYZE+zkPWGywMJs/fW0uP7x2GpdOLqOupYOfvL6Hx9+s7Q34XtFMT8U6vVMOHPR5XgecspuJiCwBlgCcdlp4tTNS6S5JpVJVov2cByrJcc+iqcw6bSSzThsJF3na27udTHtgtd/3iVZ6KuFuTzXGrABWgGf1Trjvl0p3SSqVqhLp53wov4TystID3t0crfRUrIN+PTDe53mF1aaUUkljKL+EYl2GPNZB/z1gkohU4Qn2NwOfjXEflFIqYcQ6PRXToG+McYrI14HVeJZsPmWM2RHLPiilVKKJZXoq5jl9Y8xLwEuxPq9SSqkkvyNXKaXUqTToK6VUCtGgr5RSKUSDvlJKpRAN+koplUI06CulVArRoK+UUikkoXfOEpFGIF6bTZYCTXE6d6yl0rWCXm8yS6VrhcDXO8EY43ej4IQO+vEkIhsDbTeWbFLpWkGvN5ml0rVCaNer6R2llEohGvSVUiqFaNAPbEW8OxBDqXStoNebzFLpWiGE69WcvlJKpRAd6SulVArRoK+UUikk5YO+iDwlIg0ist2nrVhEXhWRPdbHkfHsYySJyHgRWSsiO0Vkh4h8y2pPumsWkWwReVdEPrCu9d+t9ioR2SAiNSLyBxHJjHdfI0lEbCKyRUT+Yj1P2usVkX0isk1E3heRjVZb0n0vA4hIkYisFJFdIvKhiFwUyrWmfNAHfgUs6tO2FFhjjJkErLGeJwsn8B1jzFnAhcCdInIWyXnN3cB8Y8zZwDnAIhG5EHgYeMQYcwbQAtwRxz5Gw7eAD32eJ/v1ftwYc47PevVk/F4GWA68bIyZCpyN5/946NdqjEn5f0AlsN3neTUw1no8FqiOdx+jeO0vAJcn+zUDucBm4AI8dzCmW+0XAavj3b8IXmeF9cM/H/gLIEl+vfuA0j5tSfe9DBQCtViLb8K5Vh3p+zfaGHPYenwEGB3PzkSLiFQCs4ANJOk1W6mO94EG4FXgI6DVGOO0DqkDYrM5aWw8CtwDuK3nJST39RrgFRHZJCJLrLZk/F6uAhqBX1qpuydEJI8QrlWD/iCM51do0q1rFZF84Dng28aY476vJdM1G2Ncxphz8IyA5wBT49ylqBGRa4AGY8ymePclhi42xpwLXIknVXmJ74tJ9L2cDpwLPGaMmQW00yeVE+y1atD376iIjAWwPjbEuT8RJSIZeAL+b40xz1vNSX3NxphWYC2e9EaRiKRbL1UA9XHrWGTNAz4lIvuA3+NJ8Swnea8XY0y99bEB+BOeX+zJ+L1cB9QZYzZYz1fi+SUw5GvVoO/fi8Bi6/FiPHnvpCAiAjwJfGiM+bHPS0l3zSJSJiJF1uMcPHMXH+IJ/jdahyXFtQIYY+4zxlQYYyqBm4HXjTGfI0mvV0TyRGSE9zFwBbCdJPxeNsYcAQ6KyBSraQGwkxCuNeXvyBWR3wGX4SlRehR4AFgF/BE4DU9p55uMMc3x6mMkicjFwJvANk7mfb+HJ6+fVNcsIjOBpwEbngHOH40xPxSRiXhGwsXAFuDzxpju+PU08kTkMuC7xphrkvV6rev6k/U0HXjWGPOfIlJCkn0vA4jIOcATQCawF7gN6/uaIVxrygd9pZRKJZreUUqpFKJBXymlUogGfaWUSiEa9JVSKoVo0FdKqRSiQV8ppVKIBn2llEoh/x9bue8y3IH/dwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def graph(final):\n", - "\n", - " x_arr = list(final.keys())\n", - " y_arr = [dict(final)[j] for j in dict(final).keys()]\n", - "\n", - " x_arr_final = []\n", - " y_arr_final = []\n", - "\n", - " while (len(x_arr) > 0):\n", - "\n", - " x_arr_final.append(min(x_arr))\n", - " y_arr_final.append(y_arr[x_arr.index(min(x_arr))])\n", - " holder = x_arr.index(min(x_arr))\n", - " del x_arr[holder]\n", - " del y_arr[holder]\n", - "\n", - " plt.plot(x_arr_final, y_arr_final)\n", - " plt.scatter(x_arr_final, y_arr_final)\n", - " plt.show()\n", - "\n", - "graph(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As you can see, we get a pretty strange probability distribution! This is due to the fact that repeated \n", - "applications of the Hadamard gate to the coin qubit (which you may recall was initialized in the $|\\downarrow\\rangle$ state). Over time, interference causes our coin qubit to bias to the left, but also creates a small bump far to \n", - "the right as well! If you think this is weird, do the math! Take a qubit in the initial state of $|1\\rangle$ \n", - "and repeatedly apply a Hadamard transformation, then calculate the probabilities of measuring $|0\\rangle$ \n", - "and $|1\\rangle$ by taking the modulus squared of the probability amplitude corresponding to each of the states. \n", - "In fact, let's see what happens when our qubit is initialized in the $|\\uparrow\\rangle$ state: " - ] - }, - { - "cell_type": "code", - "execution_count": 224, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({52: 1222, 50: 691, 44: 362, 54: 296, 48: 271, 12: 266, 46: 189, 16: 167, 10: 141, 42: 140, 36: 128, 24: 125, 32: 112, 22: 108, 26: 103, 34: 103, 38: 99, 30: 95, 40: 88, 28: 84, 20: 65, 18: 60, 56: 34, 14: 29, 8: 21, 6: 1})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - "\n", - "final = generate_walk(number_qubits, iterator, sample_number)\n", - "graph(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Cool, right!? It's the mirror image of what we saw when the coin qubit was in the other state. Let's try one \n", - "more thing, let's initialize our coin qubit in a \"balanced\" state, where interference doesn't bias our \n", - "distribution towards only one side! We will set our initial state to:\n", - "\n", - "\n", - "$$|i\\rangle \\ = \\ \\frac{|\\uparrow\\rangle \\ + \\ i|\\downarrow\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "This is implemented by applying a Hadamard gate to $|\\uparrow\\rangle$, and then applying an $S$ gate to \n", - "the qubit. When we simulate this with Cirq, we get:" - ] - }, - { - "cell_type": "code", - "execution_count": 226, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Counter({12: 742, 52: 715, 50: 342, 14: 335, 10: 247, 54: 232, 20: 224, 48: 216, 16: 209, 44: 202, 22: 151, 42: 147, 46: 144, 18: 120, 34: 118, 30: 112, 32: 108, 26: 108, 28: 107, 36: 105, 40: 98, 24: 96, 38: 93, 56: 15, 8: 14})\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
          " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def initial_state():\n", - "\n", - " yield cirq.X.on(cirq.GridQubit(0, 1))\n", - " \n", - " yield cirq.H.on(cirq.GridQubit(0, number_qubits))\n", - " yield cirq.S.on(cirq.GridQubit(0, number_qubits))\n", - "\n", - "final = generate_walk(number_qubits, iterator, sample_number)\n", - "graph(final)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we get a probability distribution that is much more symmetric!\n", - "\n", - "\n", - "Random walks have applications in so many fields of scientific inquiry, ranging from biology, to \n", - "computer science, to finance. I definitely think there are a lot of possible great extensions to this basic \n", - "example of a QW and many more great projects that can be made by utilizing this interesting process! \n", - "\n", - "**References**\n", - "\n", - "For more information about quantum random walks, see: https://arxiv.org/abs/quant-ph/0303081\n", - "\n", - "For more information about applications of random walks, see: https://en.wikipedia.org/wiki/Random_walk#Applications\n", - "\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.5" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} From 371bca57a2987f97cdec2539cf31efbb65ac4544 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 9 Mar 2020 14:04:03 -0400 Subject: [PATCH 26/29] Delete circ2.png --- examples/notebook_tutorials/assets/circ2.png | Bin 34563 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/notebook_tutorials/assets/circ2.png diff --git a/examples/notebook_tutorials/assets/circ2.png b/examples/notebook_tutorials/assets/circ2.png deleted file mode 100644 index 21e2273f8baf03b308f4b664dff65284183b8814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34563 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 PcNYI*Y;Kfm=yKsdAp?s# From 39ea413fd768e9fb06b16d78468293900884bf1c Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 9 Mar 2020 14:04:12 -0400 Subject: [PATCH 27/29] Delete cycle.png --- examples/notebook_tutorials/assets/cycle.png | Bin 12396 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/notebook_tutorials/assets/cycle.png diff --git a/examples/notebook_tutorials/assets/cycle.png b/examples/notebook_tutorials/assets/cycle.png deleted file mode 100644 index 89ce420986bc0edeed6af84c3afc7341c5405882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12396 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 From 7fce96b87e38d87c864c52c9e7143afc37b3f6ff Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 9 Mar 2020 14:04:26 -0400 Subject: [PATCH 28/29] Delete circ2.png --- examples/assets/circ2.png | Bin 34563 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/assets/circ2.png diff --git a/examples/assets/circ2.png b/examples/assets/circ2.png deleted file mode 100644 index 21e2273f8baf03b308f4b664dff65284183b8814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34563 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 PcNYI*Y;Kfm=yKsdAp?s# From 7c2ed7b474c0c9062ac3581ccb1a0103e55513e3 Mon Sep 17 00:00:00 2001 From: Jack Ceroni Date: Mon, 9 Mar 2020 14:05:29 -0400 Subject: [PATCH 29/29] Delete cycle.png --- examples/assets/cycle.png | Bin 12396 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/assets/cycle.png diff --git a/examples/assets/cycle.png b/examples/assets/cycle.png deleted file mode 100644 index 89ce420986bc0edeed6af84c3afc7341c5405882..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12396 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