{ "cells": [ { "cell_type": "markdown", "id": "2e096950", "metadata": {}, "source": [ "# Learning Outcomes\n", "- Deutsch-Jozsa Algorithm\n", "- Berstein-Vazirani Algorithm\n", "- Constructing Oracles" ] }, { "cell_type": "markdown", "id": "e8c2ab06", "metadata": {}, "source": [ "This week we will be covering Chapter 3.2 Deutsch-Jozsa Algorithm and Chapter 3.3 Berstein-Vazirani Algorithm from the Qiskit Textbook. " ] }, { "cell_type": "markdown", "id": "2bf4a942", "metadata": { "tags": [ "remove_cell" ] }, "source": [ "# Deutsch-Jozsa Algorithm" ] }, { "cell_type": "markdown", "id": "386cdd63", "metadata": {}, "source": [ "In this section, we first introduce the Deutsch-Jozsa problem, and classical and quantum algorithms to solve it. We then implement the quantum algorithm using Qiskit, and run it on a simulator and device." ] }, { "cell_type": "markdown", "id": "dfa579c4", "metadata": { "tags": [ "contents" ] }, "source": [ "## Contents\n", "\n", "1. [Introduction](#introduction) \n", " 1.1 [Deutsch-Jozsa Problem](#djproblem) \n", " 1.2 [Deutsch-Jozsa Algorithm](#classical-solution) \n", " 1.3 [The Quantum Solution](#quantum-solution) \n", " 1.4 [Why Does This Work?](#why-does-this-work) \n", "2. [Worked Example](#example)\n", "3. [Creating Quantum Oracles](#creating-quantum-oracles) \n", "4. [Qiskit Implementation](#implementation) \n", " 4.1 [Constant Oracle](#const_oracle) \n", " 4.2 [Balanced Oracle](#balanced_oracle) \n", " 4.3 [The Full Algorithm](#full_alg) \n", " 4.4 [Generalised Circuit](#general_circs) \n", "5. [Running on Real Devices](#device) \n", "6. [Problems](#problems)\n", "7. [References](#references)" ] }, { "cell_type": "markdown", "id": "48e8d6b9", "metadata": {}, "source": [ "## 1. Introduction " ] }, { "cell_type": "markdown", "id": "04eb540a", "metadata": {}, "source": [ "The Deutsch-Jozsa algorithm, first introduced in Reference [1], was the first example of a quantum algorithm that performs better than the best classical algorithm. It showed that there can be advantages to using a quantum computer as a computational tool for a specific problem." ] }, { "cell_type": "markdown", "id": "1762b072", "metadata": {}, "source": [ "### 1.1 Deutsch-Jozsa Problem \n", "\n", "We are given a hidden Boolean function $f$, which takes as input a string of bits, and returns either $0$ or $1$, that is:\n", "\n", "$$\n", "f(\\{x_0,x_1,x_2,...\\}) \\rightarrow 0 \\textrm{ or } 1 \\textrm{ , where } x_n \\textrm{ is } 0 \\textrm{ or } 1$$\n", "\n", "The property of the given Boolean function is that it is guaranteed to either be balanced or constant. A constant function returns all $0$'s or all $1$'s for any input, while a balanced function returns $0$'s for exactly half of all inputs and $1$'s for the other half. Our task is to determine whether the given function is balanced or constant. \n", "\n", "Note that the Deutsch-Jozsa problem is an $n$-bit extension of the single bit Deutsch problem. \n", "\n", "### 1.2 The Classical Solution \n", "\n", "Classically, in the best case, two queries to the oracle can determine if the hidden Boolean function, $f(x)$, is balanced: \n", "e.g. if we get both $f(0,0,0,...)\\rightarrow 0$ and $f(1,0,0,...) \\rightarrow 1$, then we know the function is balanced as we have obtained the two different outputs. \n", "\n", "In the worst case, if we continue to see the same output for each input we try, we will have to check exactly half of all possible inputs plus one in order to be certain that $f(x)$ is constant. Since the total number of possible inputs is $2^n$, this implies that we need $2^{n-1}+1$ trial inputs to be certain that $f(x)$ is constant in the worst case. For example, for a $4$-bit string, if we checked $8$ out of the $16$ possible combinations, getting all $0$'s, it is still possible that the $9^\\textrm{th}$ input returns a $1$ and $f(x)$ is balanced. Probabilistically, this is a very unlikely event. In fact, if we get the same result continually in succession, we can express the probability that the function is constant as a function of $k$ inputs as:\n", "\n", "\n", "\n", "$$ P_\\textrm{constant}(k) = 1 - \\frac{1}{2^{k-1}} \\qquad \\textrm{for } 1 < k \\leq 2^{n-1}$$\n", "\n", "\n", "\n", "Realistically, we could opt to truncate our classical algorithm early, say if we were over x% confident. But if we want to be 100% confident, we would need to check $2^{n-1}+1$ inputs." ] }, { "attachments": { "image.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9cAAAE5CAYAAACaptPyAAAgAElEQVR4Aey9B5wURfr/D4iInIiAgBETRhAQUTlFCYqngAp6IGJARU/MgphFz/ATRYJ4AgpySFL8G1DQUwkiQUWSgAqygGSQpOCyuyywPP/5lN9ae2cndM90z1R3f+r1GtiZqaqueldNd32qnnqqjDCQAAmQAAmQAAmQAAmQAAmQAAmQAAmkRaBMWqmZmARIgARIgARIgARIgARIgARIgARIQCiu2QlIgARIgARIgARIgARIgARIgARIIE0CFNdpAmRyEiABEiABEiABEiABEiABEiABEqC4Zh8gARIgARIgARIgARIgARIgARIggTQJUFynCZDJSYAESIAESIAESIAESIAESIAESIDimn2ABEiABEiABEiABEiABEiABEiABNIkQHGdJkAmJwESIAESIAESIAESIAESIAESIAGKa/YBEiABEiABEiABEiABEiABEiABEkiTAMV1mgCZnARIgARIgARIgARIgARIgARIgAQortkHSIAESIAESIAESIAESIAESIAESCBNAhTXaQJkchIgARIgARIgARIgARIgARIgARKguGYfIAESIAESIAESIAESIAESIAESIIE0CVBcpwmQyUmABEiABEiABEiABEiABEiABEiA4pp9gARIgARIgARIgARIgARIgARIgATSJEBxnSZAJicBEiABEiABEiABEiABEiABEiABimv2ARIgARIgARIgARIgARIgARIgARJIkwDFdZoAmZwESIAESIAESIAESIAESIAESIAEKK7ZB0iABEiABEiABEiABEiABEiABEggTQIU12kCZHISIAESIAESIAESIAESIAESIAESoLhmHyABEiABEiABEiABEiABEiABEiCBNAlQXKcJkMlJgARIgARIgARIgARIgARIgARIgOKafYAESIAESIAESIAESIAESIAESIAE0iRAcZ0mQCYnARIgARIgARIgARIgARIgARIgAYpr9gESIAESIAESIAESIAESIAESIAESSJMAxXWaAJmcBEiABEiABEiABEiABEiABEiABCiu2QdIgARIgARIgARIgARIgARIgARIIE0CFNdpAmRyEiABEiABEiABEiABEiABEiABEqC4Zh8gARIgAQMIFBYWyv79+w0oCYtAAiRAAskJ7NmzV/Di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XnutQGTHCytWrJC77rpLFi5cGC8KPyeBYgLYYoDz0SGu8br5lpvj9i+cp67jHXDAAZGjur4rzod/kIApBCiuTWkJloMESCCUBCiuQ9nsrDQJ+IpAbm6u9Hm5j3Tq1Enmzp0rW7ZsKfWCuTiE0ttvvy0333yz4KxiBhKwQ+DYY49Vx7nVq1dPPvroo1JbDXQeL730UrG4btKkiaxZs0Z/xf9JwBgCFNfGNAULQgIkEEYCOCMWM/CYjcc5ngwkQAIkYBqBQYMGSa1ataRRo0ZyzTX/jPlq3769XH755VKnTh25/vrrZevWraZVg+UxlED//v3lqKOOkvHjx0thYWHMUmLy5vjjj1fPShz9BpPweHFjZsAPSSBDBCiuMwSalyEBEiABEICzFuxFnDp1qowYMULOPffcYpO4U089VX2G7xBnyZIlhEYCJEACWSWAlcTKlSsXrxhqs9xE/z/44INSUFCQ1XLz4v4hsH37drn33nulTZs28vU3X5dauYblxD333KP6ICaje/XqpbYp+KeGLGmYCFBch6m1WVcSIIGsE4BH1OrVq6tZ+qOPPlqqVasmhx56qHphNh6f4XX44YdL69ats15eFoAESCDcBDDpl0hIR38Hp1Swwonl7CzcJFn7eATQV7Ay3bt3bznppJPUs2/o0KHy+eefy9ixY6Vly5bKbByr2xMmTBCIbfaveDT5ebYJUFxnuwV4fRIgARIgARIgARIgARIgAVm/fr0MGDBAbrjhBmnQoIGcffbZalV73Lhxkp+fT0IkYDwBimvjm4gFJAESIAESIAESIAESIAESIAESMJ0AxbXpLcTykQAJkAAJkAAJkAAJkAAJkAAJGE+A4tr4JmIBSYAESIAESIAESIAESIAESIAETCdAcW16C7F8JEACJEACJEACJEACJEACJEACxhOguDa+iVhAEiABEiABEiABEiABEiABEiAB0wlQXJveQiwfCZAACZAACZAACZAACZAACZCA8QQoro1vIhaQBEiABEiABEiABEiABEiABEjAdAIU16a3EMtHAiRAAiRAAiRAAiRAAiRAAiRgPAGKa+ObiAUkARIgARIgARIgARIgARIgARIwnQDFtektxPKRAAmQAAmQAAmQAAmQAAmQAAkYT4Di2vgmYgFJgARIgARIgARIgARIgARIgARMJ0BxbXoLsXwkQAIkQAIkQAIk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67wN62Re24Yyp2l1mduituSuWeXHLpyxMlNcZww1L+RTApkS1/q+Nb/9ebIzZ4kntLSIC6q4LiwslA0bNggEHnzK5EYsmPwQdLt4Ka737sqVBR2bqWfjvDYNJP/XTZ6gCbO4xr3izTfflPPOO09tyURftAaKaysN+3/7TlxDUEPwQuxed9116gUHWK+99pps3bo1Yc2XL18uLVu2lO+//15w3NONN94oX3/9ddzV6/fee0+uuuoqmTp1qlpRve+++2LmD3Plfv36KTPy559/XjZv/nMGF+UZMGCAdOvWTa655p/KxBzm5slCjx495PDDD5eFCxcmi+rr78HNavq9fv16ad68uXJWhlm06ADz/QsvvFAaNGigZtjgVXzx4sWlRHh0Oj+8D6q4xvYG/H5wfBp+p7feeqvcdttt0r59e7X9YdSoUUZvgaC4Nu/XQ3FtXpuwRGYRoLg2qz1ilQbjRIxbsZCCxR48F2+MLC784x//kO7duwtOUIleYIiVT7Y+o7jOFnl3rgvLXOiRjh07SqVKlZTFLBawovscxXVqvH0lrnFUE0zHa9eurQT2mjVr1H7piRMnKodkp512msyZMzcmCXQYDPBff/111Xkw6IdIx40NK2nRAebZyA8CF53wj4g5CoQfTJOjw8CBA5X4njBhguCYKAiInTt3KpNl5IPZyJUrV8q5556r9nUsingkTxQgIuERGyYaQQ2YJHnppZfkscceE4hqBMzgLvh+gYBPrFVNtCFWPCFEsccHK91BcWoWRHG9d99e6dWrV2QirL18OP5DweQWZkU3btwoq1atki+/nCr33nuvtG7dWvBbNjFQXJvXKhTX5rUJS2QWAYprs9rDWhpYMs76epayiHz630+r7YkY8+G5iLFQzvIcgcjp0KGDYGy5a9cua3Jj/qa4NqYpHBcE4++ePXtKxYoVldYoU6aMWrSK5euJ4toxXpXAF+IaogritFmzZnLggQfGdJ4A0QVnV9iPi9mY6NkXDN7hCRxC1xreeustgQODdevWqTQQdVixhrCOHvCPHDlSrZRb0+PGB7MYPMzQCRs2bKhmgLC6OmnyJGtUJcAhml955ZUSn8d6c+mllyoxj3oFMXwaMfs++uijFStYB/z+++9BrKbtOgVJXOO3B6/v9erVkzfeeCPmRIkVDOp+1llnyfjx442bLKG4traUGX9TXJvR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" } }, "cell_type": "markdown", "id": "5c8f8950", "metadata": {}, "source": [ "### 1.3 Quantum Solution \n", "\n", "Using a quantum computer, we can solve this problem with 100% confidence after only one call to the function $f(x)$, provided we have the function $f$ implemented as a quantum oracle, which maps the state $\\vert x\\rangle \\vert y\\rangle $ to $ \\vert x\\rangle \\vert y \\oplus f(x)\\rangle$, where $\\oplus$ is addition modulo $2$. Below is the generic circuit for the Deutsh-Jozsa algorithm.\n", "\n", "![image.png](attachment:image.png)\n", "\n", "Now, let's go through the steps of the algorithm:\n", "\n", "
    \n", "
  1. \n", " Prepare two quantum registers. The first is an $n$-qubit register initialised to $|0\\rangle$, and the second is a one-qubit register initialised to $|1\\rangle$:\n", " \n", "\n", "$$\\vert \\psi_0 \\rangle = \\vert0\\rangle^{\\otimes n} \\vert 1\\rangle$$\n", "\n", "\n", "
  2. \n", " \n", "
  3. \n", " Apply a Hadamard gate to each qubit:\n", " \n", "\n", "$$\\vert \\psi_1 \\rangle = \\frac{1}{\\sqrt{2^{n+1}}}\\sum_{x=0}^{2^n-1} \\vert x\\rangle \\left(|0\\rangle - |1 \\rangle \\right)$$\n", "\n", "\n", "
  4. \n", " \n", "
  5. \n", " Apply the quantum oracle $\\vert x\\rangle \\vert y\\rangle$ to $\\vert x\\rangle \\vert y \\oplus f(x)\\rangle$:\n", " $$\n", " \\begin{aligned}\n", " \\lvert \\psi_2 \\rangle \n", " & = \\frac{1}{\\sqrt{2^{n+1}}}\\sum_{x=0}^{2^n-1} \\vert x\\rangle (\\vert f(x)\\rangle - \\vert 1 \\oplus f(x)\\rangle) \\\\ \n", " & = \\frac{1}{\\sqrt{2^{n+1}}}\\sum_{x=0}^{2^n-1}(-1)^{f(x)}|x\\rangle ( |0\\rangle - |1\\rangle ) \n", " \\end{aligned}\n", " $$\n", " \n", "since for each $x,f(x)$ is either $0$ or $1$.\n", "
  6. \n", "\n", "
  7. \n", " At this point the second single qubit register may be ignored. Apply a Hadamard gate to each qubit in the first register:\n", " $$\n", " \\begin{aligned}\n", " \\lvert \\psi_3 \\rangle \n", " & = \\frac{1}{2^n}\\sum_{x=0}^{2^n-1}(-1)^{f(x)}\n", " \\left[ \\sum_{y=0}^{2^n-1}(-1)^{x \\cdot y} \n", " \\vert y \\rangle \\right] \\\\\n", " & = \\frac{1}{2^n}\\sum_{y=0}^{2^n-1}\n", " \\left[ \\sum_{x=0}^{2^n-1}(-1)^{f(x)}(-1)^{x \\cdot y} \\right]\n", " \\vert y \\rangle\n", " \\end{aligned}\n", " $$\n", " \n", "where $x \\cdot y = x_0y_0 \\oplus x_1y_1 \\oplus \\ldots \\oplus x_{n-1}y_{n-1}$ is the sum of the bitwise product.\n", "
  8. \n", "\n", "
  9. \n", " Measure the first register. Notice that the probability of measuring $\\vert 0 \\rangle ^{\\otimes n} = \\lvert \\frac{1}{2^n}\\sum_{x=0}^{2^n-1}(-1)^{f(x)} \\rvert^2$, which evaluates to $1$ if $f(x)$ is constant and $0$ if $f(x)$ is balanced. \n", "
  10. \n", "\n", "
\n", "\n", "\n" ] }, { "cell_type": "markdown", "id": "76cd5545", "metadata": {}, "source": [ "Remember the action of Hadamard gate on a state is defined as:\n", "$$\n", "|x\\rangle \\xrightarrow{H^{\\otimes n}} \\frac{1}{\\sqrt{2^n}} \\sum_{y\\in \\{0,1\\}^n} (-1)^{x\\cdot y}|y\\rangle.\n", "$$\n", "\n", "
\n", " Explain Equation (Click to Expand)\n", "We remember the Hadamard performs the following transformations on one qubit:\n", "\n", "$$\n", "H|0\\rangle = \\tfrac{1}{\\sqrt{2}}(|0\\rangle + |1\\rangle)\n", "$$ $$\n", "H|1\\rangle = \\tfrac{1}{\\sqrt{2}}(|0\\rangle - |1\\rangle)\n", "$$\n", "\n", "Using summation notation, we could rewrite it like this:\n", "\n", "$$\n", "H|a\\rangle = \\frac{1}{\\sqrt{2}}\\sum_{x\\in \\{0,1\\}} (-1)^{a\\cdot x}|x\\rangle.\n", "$$\n", "\n", "For two qubits, applying a Hadamard to each performs the following transformations:\n", "\n", "$$\n", "H^{\\otimes 2}|00\\rangle = \\tfrac{1}{2}(|00\\rangle + |01\\rangle + |10\\rangle + |11\\rangle)\n", "$$ $$\n", "H^{\\otimes 2}|01\\rangle = \\tfrac{1}{2}(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle)\n", "$$ $$\n", "H^{\\otimes 2}|10\\rangle = \\tfrac{1}{2}(|00\\rangle + |01\\rangle - |10\\rangle - |11\\rangle)\n", "$$ $$\n", "H^{\\otimes 2}|11\\rangle = \\tfrac{1}{2}(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle)\n", "$$\n", "\n", "We can express this using the summation below:\n", "\n", "$$\n", "H^{\\otimes 2}|a\\rangle = \\frac{1}{2}\\sum_{x\\in \\{0,1\\}^2} (-1)^{a\\cdot x}|x\\rangle\n", "$$\n", "\n", "You will hopefully now see how we arrive at the equation above.\n", "
\n" ] }, { "cell_type": "markdown", "id": "3b70bfad", "metadata": {}, "source": [ "### Exercise 1\n", "\n", "What are the results of the following binary dot products?\n", "\n", "- $ 01 \\cdot 10 = ?$ \n", "- $ 100 \\cdot 010 = ?$\n", "- $ 000 \\cdot 101 = ?$\n", "- $ 111 \\cdot 011 = ?$\n", "- $ 10101 \\cdot 01110 = ? $" ] }, { "cell_type": "markdown", "id": "11fc7d31", "metadata": {}, "source": [ "### Answer \n", "\n", "?" ] }, { "cell_type": "markdown", "id": "8daa9ba2", "metadata": {}, "source": [ "### Exercise 2\n", "\n", "Using the formula above, explicitly write down the result of applying $H^{\\otimes n}$ to the following states:\n", "\n", "- $| a \\rangle = H| 0 \\rangle $\n", "- $| b \\rangle = H^{\\otimes 2}| 01 \\rangle $\n", "- $| c \\rangle = H^{\\otimes 3}|101 \\rangle $\n", "- $| d \\rangle = H^{\\otimes 3}|111 \\rangle $" ] }, { "cell_type": "markdown", "id": "b666b4c8", "metadata": {}, "source": [ "### Answer\n", "?" ] }, { "cell_type": "markdown", "id": "a1a4b9a9", "metadata": {}, "source": [ "### 1.4 Why Does This Work? \n", "\n", "- **Constant Oracle**\n", "\n", "When the oracle is *constant*, it has no effect (up to a global phase) on the input qubits, and the quantum states before and after querying the oracle are the same. Since the H-gate is its own inverse, in Step 4 we reverse Step 2 to obtain the initial quantum state of $|00\\dots 0\\rangle$ in the first register.\n", "\n", "$$\n", "H^{\\otimes n}\\begin{bmatrix} 1 \\\\ 0 \\\\ 0 \\\\ \\vdots \\\\ 0 \\end{bmatrix} \n", "= \n", "\\tfrac{1}{\\sqrt{2^n}}\\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ \\vdots \\\\ 1 \\end{bmatrix}\n", "\\quad \\xrightarrow{\\text{after } U_f} \\quad\n", "H^{\\otimes n}\\tfrac{1}{\\sqrt{2^n}}\\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ \\vdots \\\\ 1 \\end{bmatrix}\n", "= \n", "\\begin{bmatrix} 1 \\\\ 0 \\\\ 0 \\\\ \\vdots \\\\ 0 \\end{bmatrix} \n", "$$\n", "\n", "- **Balanced Oracle**\n", "\n", "After step 2, our input register is an equal superposition of all the states in the computational basis. When the oracle is *balanced*, phase kickback adds a negative phase to exactly half these states:\n", "\n", "$$\n", "U_f \\tfrac{1}{\\sqrt{2^n}}\\begin{bmatrix} 1 \\\\ 1 \\\\ 1 \\\\ \\vdots \\\\ 1 \\end{bmatrix} \n", "= \n", "\\tfrac{1}{\\sqrt{2^n}}\\begin{bmatrix} -1 \\\\ 1 \\\\ -1 \\\\ \\vdots \\\\ 1 \\end{bmatrix}\n", "$$\n", "\n", "\n", "The quantum state after querying the oracle is orthogonal to the quantum state before querying the oracle. Thus, in Step 4, when applying the H-gates, we must end up with a quantum state that is orthogonal to $|00\\dots 0\\rangle$. This means we should never measure the all-zero state. " ] }, { "cell_type": "markdown", "id": "0812f21e", "metadata": {}, "source": [ "## 2. Worked Example \n", "\n", "Let's go through a specific example for a two bit balanced function: \n", "\n", "
    \n", "
  1. The first register of two qubits is initialized to $|00\\rangle$ and the second register qubit to $|1\\rangle$ \n", " \n", "(Note that we are using subscripts 1, 2, and 3 to index the qubits. A subscript of \"12\" indicates the state of the register containing qubits 1 and 2)\n", " \n", "\n", "$$\\lvert \\psi_0 \\rangle = \\lvert 0 0 \\rangle_{12} \\otimes \\lvert 1 \\rangle_{3} $$\n", "\n", " \n", "
  2. \n", " \n", "
  3. Apply Hadamard on all qubits\n", " \n", "\n", "$$\\lvert \\psi_1 \\rangle = \\frac{1}{2} \\left( \\lvert 0 0 \\rangle + \\lvert 0 1 \\rangle + \\lvert 1 0 \\rangle + \\lvert 1 1 \\rangle \\right)_{12} \\otimes \\frac{1}{\\sqrt{2}} \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{3} $$\n", "\n", " \n", "
  4. \n", " \n", "
  5. The oracle function can be implemented as $\\text{Q}_f = CX_{13}CX_{23}$, \n", " $$\n", " \\begin{align*}\n", " \\lvert \\psi_2 \\rangle = \\frac{1}{2\\sqrt{2}} \\left[ \\lvert 0 0 \\rangle_{12} \\otimes \\left( \\lvert 0 \\oplus 0 \\oplus 0 \\rangle - \\lvert 1 \\oplus 0 \\oplus 0 \\rangle \\right)_{3} \\\\\n", " + \\lvert 0 1 \\rangle_{12} \\otimes \\left( \\lvert 0 \\oplus 0 \\oplus 1 \\rangle - \\lvert 1 \\oplus 0 \\oplus 1 \\rangle \\right)_{3} \\\\\n", " + \\lvert 1 0 \\rangle_{12} \\otimes \\left( \\lvert 0 \\oplus 1 \\oplus 0 \\rangle - \\lvert 1 \\oplus 1 \\oplus 0 \\rangle \\right)_{3} \\\\\n", " + \\lvert 1 1 \\rangle_{12} \\otimes \\left( \\lvert 0 \\oplus 1 \\oplus 1 \\rangle - \\lvert 1 \\oplus 1 \\oplus 1 \\rangle \\right)_{3} \\right]\n", " \\end{align*}\n", " $$\n", "
  6. \n", " \n", "
  7. Simplifying this, we get the following: \n", " $$\n", " \\begin{aligned}\n", " \\lvert \\psi_2 \\rangle & = \\frac{1}{2\\sqrt{2}} \\left[ \\lvert 0 0 \\rangle_{12} \\otimes \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{3} - \\lvert 0 1 \\rangle_{12} \\otimes \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{3} - \\lvert 1 0 \\rangle_{12} \\otimes \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{3} + \\lvert 1 1 \\rangle_{12} \\otimes \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{3} \\right] \\\\\n", " & = \\frac{1}{2} \\left( \\lvert 0 0 \\rangle - \\lvert 0 1 \\rangle - \\lvert 1 0 \\rangle + \\lvert 1 1 \\rangle \\right)_{12} \\otimes \\frac{1}{\\sqrt{2}} \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{3} \\\\\n", " & = \\frac{1}{\\sqrt{2}} \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{1} \\otimes \\frac{1}{\\sqrt{2}} \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{2} \\otimes \\frac{1}{\\sqrt{2}} \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{3}\n", " \\end{aligned}\n", " $$\n", "
  8. \n", " \n", "
  9. Apply Hadamard on the first register\n", " \n", "\n", "$$ \\lvert \\psi_3\\rangle = \\lvert 1 \\rangle_{1} \\otimes \\lvert 1 \\rangle_{2} \\otimes \\left( \\lvert 0 \\rangle - \\lvert 1 \\rangle \\right)_{3} $$\n", "\n", "\n", "
  10. \n", " \n", "
  11. Measuring the first two qubits will give the non-zero $11$, indicating a balanced function.\n", "
  12. \n", "
\n", "\n", "You can try out similar examples using the widget below. Press the buttons to add H-gates and oracles, re-run the cell and/or set `case=\"constant\"` to try out different oracles." ] }, { "cell_type": "code", "execution_count": 2, "id": "7919aa12", "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "93703e3af2be4a2eb1936b0965900019", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(Button(description='H⊗ⁿ', style=ButtonStyle()), Button(description='Oracle', style=ButtonStyle(…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "aaa839d0fe0a453788e89c267711e5c7", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HTMLMath(value='$$ |00\\\\rangle = |00\\\\rangle $$')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c8a233166690452db57f82d81bf83e03", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Image(value=b'\\x89PNG\\r\\n\\x1a\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x00\\xce\\x00\\x00\\x00\\xcc\\x08\\x06\\x00\\x00\\x00;\\xd7\\x9c…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from qiskit_textbook.widgets import dj_widget\n", "dj_widget(size=\"small\", case=\"balanced\")" ] }, { "attachments": { "image-2.png": { "image/png": "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" }, "image.png": { "image/png": "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" } }, "cell_type": "markdown", "id": "21eec6d6", "metadata": {}, "source": [ "## 3. Creating Quantum Oracles \n", "\n", "Let's see some different ways we can create a quantum oracle. \n", "\n", "For a constant function, it is simple:\n", "\n", "$\\qquad$ 1. if f(x) = 0, then apply the $I$ gate to the qubit in register 2. \n", "$\\qquad$ 2. if f(x) = 1, then apply the $X$ gate to the qubit in register 2.\n", "\n", "For a balanced function, there are many different circuits we can create. One of the ways we can guarantee our circuit is balanced is by performing a CNOT for each qubit in register 1, with the qubit in register 2 as the target. For example:\n", "\n", "![image.png](attachment:image.png)\n", "\n", "In the image above, the top three qubits form the input register, and the bottom qubit is the output register. We can see which input states give which output in the table below:\n", "\n", "| Input states that output 0 | Input States that output 1 |\n", "|:--------------------------:|:--------------------------:|\n", "| 000 | 001 |\n", "| 011 | 100 |\n", "| 101 | 010 |\n", "| 110 | 111 |\n", "\n", "\n", "We can change the results while keeping them balanced by wrapping selected controls in X-gates. For example, see the circuit and its results table below:\n", "\n", "![image-2.png](attachment:image-2.png)\n", "\n", "| Input states that output 0 | Input states that output 1 |\n", "|:--------------------------:|:--------------------------:|\n", "| 001 | 000 |\n", "| 010 | 011 |\n", "| 100 | 101 |\n", "| 111 | 110 |" ] }, { "cell_type": "markdown", "id": "204c60ba", "metadata": {}, "source": [ "### Exercise 3\n", "\n", "Let's say our oracle function is described as follows:\n", "\n", "| Input states that output 0 | Input states that output 1 |\n", "|:--------------------------:|:--------------------------:|\n", "| 000 | 001 |\n", "| 011 | 010 |\n", "| 101 | 100 |\n", "| 110 | 111 |\n", "\n", "- Design and draw the circuit.\n", "- Print the unitary transformation\n", "\n", "Don't forget about the little-endian representation!" ] }, { "cell_type": "markdown", "id": "9942bd1f", "metadata": {}, "source": [ "### Answer\n", "\n", "?" ] }, { "cell_type": "markdown", "id": "41efac54", "metadata": {}, "source": [ "## 4. Qiskit Implementation \n", "\n", "We now implement the Deutsch-Jozsa algorithm for the example of a three-bit function, with both constant and balanced oracles. First let's do our imports:" ] }, { "cell_type": "code", "execution_count": 32, "id": "df9c8e2f", "metadata": { "tags": [ "thebelab-init" ] }, "outputs": [], "source": [ "# initialization\n", "import numpy as np\n", "\n", "# importing Qiskit\n", "from qiskit import IBMQ, Aer\n", "from qiskit.providers.ibmq import least_busy\n", "from qiskit import QuantumCircuit, assemble, transpile\n", "\n", "# import basic plot tools\n", "from qiskit.visualization import plot_histogram" ] }, { "cell_type": "markdown", "id": "e298dd07", "metadata": {}, "source": [ "Next, we set the size of the input register for our oracle:" ] }, { "cell_type": "code", "execution_count": 33, "id": "9e44e090", "metadata": {}, "outputs": [], "source": [ "# set the length of the n-bit input string. \n", "n = 3" ] }, { "cell_type": "markdown", "id": "299eb492", "metadata": {}, "source": [ "### 4.1 Constant Oracle \n", "Let's start by creating a constant oracle, in this case the input has no effect on the ouput so we just randomly set the output qubit to be 0 or 1:" ] }, { "cell_type": "code", "execution_count": 34, "id": "5ce59116", "metadata": { "scrolled": true, "tags": [ "thebelab-init" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# set the length of the n-bit input string. \n", "n = 3\n", "\n", "const_oracle = QuantumCircuit(n+1)\n", "\n", "output = np.random.randint(2)\n", "if output == 1:\n", " const_oracle.x(n)\n", "\n", "const_oracle.draw()" ] }, { "cell_type": "markdown", "id": "65b20939", "metadata": {}, "source": [ "### Exercise 4 \n", "\n", "Which of the following gates can we use to implement a constant function? Explain your reasoning qualitatively.\n", "\n", "- H\n", "- Z\n", "- Y" ] }, { "cell_type": "markdown", "id": "71d50230", "metadata": {}, "source": [ "### Answer\n", "\n", "?" ] }, { "cell_type": "markdown", "id": "73817fa8", "metadata": {}, "source": [ "### 4.2 Balanced Oracle " ] }, { "cell_type": "code", "execution_count": 35, "id": "525436aa", "metadata": {}, "outputs": [], "source": [ "balanced_oracle = QuantumCircuit(n+1)" ] }, { "cell_type": "markdown", "id": "ea94f8a5", "metadata": {}, "source": [ "Next, we create a balanced oracle. As we saw in section 1b, we can create a balanced oracle by performing CNOTs with each input qubit as a control and the output bit as the target. We can vary the input states that give 0 or 1 by wrapping some of the controls in X-gates. Let's first choose a binary string of length `n` that dictates which controls to wrap:" ] }, { "cell_type": "code", "execution_count": 36, "id": "1661bbb1", "metadata": { "scrolled": true }, "outputs": [], "source": [ "b_str = \"101\"" ] }, { "cell_type": "markdown", "id": "8a5f9d84", "metadata": {}, "source": [ "Now we have this string, we can use it as a key to place our X-gates. For each qubit in our circuit, we place an X-gate if the corresponding digit in `b_str` is `1`, or do nothing if the digit is `0`." ] }, { "cell_type": "code", "execution_count": 37, "id": "3390c25f", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "balanced_oracle = QuantumCircuit(n+1)\n", "b_str = \"101\"\n", "\n", "# Place X-gates\n", "for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " balanced_oracle.x(qubit)\n", "balanced_oracle.draw()" ] }, { "cell_type": "markdown", "id": "cdeb0b30", "metadata": {}, "source": [ "Next, we do our controlled-NOT gates, using each input qubit as a control, and the output qubit as a target:" ] }, { "cell_type": "code", "execution_count": 38, "id": "f1d0d0bc", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "balanced_oracle = QuantumCircuit(n+1)\n", "b_str = \"101\"\n", "\n", "# Place X-gates\n", "for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " balanced_oracle.x(qubit)\n", "\n", "# Use barrier as divider\n", "balanced_oracle.barrier()\n", "\n", "# Controlled-NOT gates\n", "for qubit in range(n):\n", " balanced_oracle.cx(qubit, n)\n", "\n", "balanced_oracle.barrier()\n", "balanced_oracle.draw()" ] }, { "cell_type": "markdown", "id": "307d413c", "metadata": {}, "source": [ "Finally, we repeat the code from two cells up to finish wrapping the controls in X-gates:" ] }, { "cell_type": "code", "execution_count": 39, "id": "cf5111d0", "metadata": { "tags": [ "thebelab-init" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "balanced_oracle = QuantumCircuit(n+1)\n", "b_str = \"101\"\n", "\n", "# Place X-gates\n", "for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " balanced_oracle.x(qubit)\n", "\n", "# Use barrier as divider\n", "balanced_oracle.barrier()\n", "\n", "# Controlled-NOT gates\n", "for qubit in range(n):\n", " balanced_oracle.cx(qubit, n)\n", "\n", "balanced_oracle.barrier()\n", "\n", "# Place X-gates\n", "for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " balanced_oracle.x(qubit)\n", "\n", "# Show oracle\n", "balanced_oracle.draw()" ] }, { "cell_type": "markdown", "id": "81c3ace0", "metadata": {}, "source": [ "We have just created a balanced oracle! All that's left to do is see if the Deutsch-Joza algorithm can solve it.\n", "\n", "### 4.3 The Full Algorithm \n", "\n", "Let's now put everything together. This first step in the algorithm is to initialise the input qubits in the state $|{+}\\rangle$ and the output qubit in the state $|{-}\\rangle$:" ] }, { "cell_type": "code", "execution_count": 40, "id": "5c80016c", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dj_circuit = QuantumCircuit(n+1, n)\n", "\n", "# Apply H-gates\n", "for qubit in range(n):\n", " dj_circuit.h(qubit)\n", "\n", "# Put qubit in state |->\n", "dj_circuit.x(n)\n", "dj_circuit.h(n)\n", "dj_circuit.draw()" ] }, { "cell_type": "markdown", "id": "8ef9f899", "metadata": {}, "source": [ "Next, let's apply the oracle. Here we apply the `balanced_oracle` we created above:" ] }, { "cell_type": "code", "execution_count": 41, "id": "d8e429f2", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":12: DeprecationWarning: The QuantumCircuit.__iadd__() method is being deprecated. Use the compose() (potentially with the inplace=True argument) and tensor() methods which are more flexible w.r.t circuit register compatibility.\n", " dj_circuit += balanced_oracle\n", "/opt/conda/lib/python3.8/site-packages/qiskit/circuit/quantumcircuit.py:876: DeprecationWarning: The QuantumCircuit.extend() method is being deprecated. Use the compose() (potentially with the inplace=True argument) and tensor() methods which are more flexible w.r.t circuit register compatibility.\n", " return self.extend(rhs)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dj_circuit = QuantumCircuit(n+1, n)\n", "\n", "# Apply H-gates\n", "for qubit in range(n):\n", " dj_circuit.h(qubit)\n", "\n", "# Put qubit in state |->\n", "dj_circuit.x(n)\n", "dj_circuit.h(n)\n", "\n", "# Add oracle\n", "dj_circuit += balanced_oracle\n", "dj_circuit.draw()" ] }, { "cell_type": "markdown", "id": "17eb03f5", "metadata": {}, "source": [ "Finally, we perform H-gates on the $n$-input qubits, and measure our input register:" ] }, { "cell_type": "code", "execution_count": 42, "id": "32de52e0", "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dj_circuit = QuantumCircuit(n+1, n)\n", "\n", "# Apply H-gates\n", "for qubit in range(n):\n", " dj_circuit.h(qubit)\n", "\n", "# Put qubit in state |->\n", "dj_circuit.x(n)\n", "dj_circuit.h(n)\n", "\n", "# Add oracle\n", "dj_circuit += balanced_oracle\n", "\n", "# Repeat H-gates\n", "for qubit in range(n):\n", " dj_circuit.h(qubit)\n", "dj_circuit.barrier()\n", "\n", "# Measure\n", "for i in range(n):\n", " dj_circuit.measure(i, i)\n", "\n", "# Display circuit\n", "dj_circuit.draw()" ] }, { "cell_type": "markdown", "id": "e1423196", "metadata": {}, "source": [ "Let's see the output:" ] }, { "cell_type": "code", "execution_count": 43, "id": "79b30462", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# use local simulator\n", "qasm_sim = Aer.get_backend('qasm_simulator')\n", "shots = 1024\n", "qobj = assemble(dj_circuit, qasm_sim)\n", "results = qasm_sim.run(qobj).result()\n", "answer = results.get_counts()\n", "\n", "plot_histogram(answer)" ] }, { "cell_type": "markdown", "id": "738636f7", "metadata": {}, "source": [ "### Exercise 5\n", "\n", "Above, we didn't measure the 3rd qubit. Design the same circuit as above, but measure the 3rd qubit too and plot the counts you have obtained, just like above. Afterwards, answer the following questions?\n", "\n", "- Did you get 1111 or 0111 or both ? ( Hint: you should get both ) \n", "- If you got both of them, why do you think this happened? \n", "- If you got both of them, what can you add to the above circuit so that you always get the same result?" ] }, { "cell_type": "markdown", "id": "663598dd", "metadata": {}, "source": [ "### Answer \n", "\n", "?" ] }, { "cell_type": "markdown", "id": "b0308a80", "metadata": {}, "source": [ "We can see from the results above that we have a 0% chance of measuring `000`. This correctly predicts the function is balanced. \n", "\n", "### 4.4 Generalised Circuits \n", "\n", "Below, we provide a generalised function that creates Deutsch-Joza oracles and turns them into quantum gates. It takes the `case`, (either `'balanced'` or '`constant`', and `n`, the size of the input register:" ] }, { "cell_type": "code", "execution_count": 44, "id": "7dad46d4", "metadata": { "tags": [ "thebelab-init" ] }, "outputs": [], "source": [ "def dj_oracle(case, n):\n", " # We need to make a QuantumCircuit object to return\n", " # This circuit has n+1 qubits: the size of the input,\n", " # plus one output qubit\n", " oracle_qc = QuantumCircuit(n+1)\n", " \n", " # First, let's deal with the case in which oracle is balanced\n", " if case == \"balanced\":\n", " # First generate a random number that tells us which CNOTs to\n", " # wrap in X-gates:\n", " b = np.random.randint(1,2**n)\n", " # Next, format 'b' as a binary string of length 'n', padded with zeros:\n", " b_str = format(b, '0'+str(n)+'b')\n", " # Next, we place the first X-gates. Each digit in our binary string \n", " # corresponds to a qubit, if the digit is 0, we do nothing, if it's 1\n", " # we apply an X-gate to that qubit:\n", " for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " oracle_qc.x(qubit)\n", " # Do the controlled-NOT gates for each qubit, using the output qubit \n", " # as the target:\n", " for qubit in range(n):\n", " oracle_qc.cx(qubit, n)\n", " # Next, place the final X-gates\n", " for qubit in range(len(b_str)):\n", " if b_str[qubit] == '1':\n", " oracle_qc.x(qubit)\n", "\n", " # Case in which oracle is constant\n", " if case == \"constant\":\n", " # First decide what the fixed output of the oracle will be\n", " # (either always 0 or always 1)\n", " output = np.random.randint(2)\n", " if output == 1:\n", " oracle_qc.x(n)\n", " \n", " oracle_gate = oracle_qc.to_gate()\n", " oracle_gate.name = \"Oracle\" # To show when we display the circuit\n", " return oracle_gate" ] }, { "cell_type": "markdown", "id": "06eef102", "metadata": {}, "source": [ "Let's also create a function that takes this oracle gate and performs the Deutsch-Joza algorithm on it:" ] }, { "cell_type": "code", "execution_count": 45, "id": "d738b13a", "metadata": { "scrolled": true, "tags": [ "thebelab-init" ] }, "outputs": [], "source": [ "def dj_algorithm(oracle, n):\n", " dj_circuit = QuantumCircuit(n+1, n)\n", " # Set up the output qubit:\n", " dj_circuit.x(n)\n", " dj_circuit.h(n)\n", " # And set up the input register:\n", " for qubit in range(n):\n", " dj_circuit.h(qubit)\n", " # Let's append the oracle gate to our circuit:\n", " dj_circuit.append(oracle, range(n+1))\n", " # Finally, perform the H-gates again and measure:\n", " for qubit in range(n):\n", " dj_circuit.h(qubit)\n", " \n", " for i in range(n):\n", " dj_circuit.measure(i, i)\n", " \n", " return dj_circuit" ] }, { "cell_type": "markdown", "id": "6905d9af", "metadata": {}, "source": [ "Finally, let's use these functions to play around with the algorithm:" ] }, { "cell_type": "code", "execution_count": 46, "id": "dfb1682b", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAegAAAExCAYAAAC3YTHrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAtjUlEQVR4nO3deVRTZ+I+8CcJe0FRKaIiKCIqKKBQpWobUOu+79ihLrRQxFZrx6pT7bdWyyil1rajdRyrjLXVDohLXeqohbjQahFRUUfcEaUjihuVNcnvD4f8jCAJNHDfwPM5554T3tzkPkkuPNwliUyr1WpBREREQpFLHYCIiIgqYkETEREJiAVNREQkIBY0ERGRgFjQREREAmJBExERCYgFTUREJCAWNBERkYBY0ERERAJiQRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJiAVNREQkIBY0ERGRgFjQREREAmJBExERCYgFTUREJCAWNBERkYBY0ERERAJiQRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJiAVNREQkIAupA4guKQ24cVeaZbdqAowOlGbZojv/E/DwltQpaoeDM9ChT+0uw1zX61mzZiEjI8OkeYzh7++PFStW1PlyqWFjQRtw4y5wqZ4WgTl7eAu4lyN1CvNlrut1RkYGVCqV1DGI6gR3cRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJiAVNREQkIL7NiojqJVtbW/Tq1QuBgYFo164dLC0tcf/+fZw8eRK//PILzp49W+E2zs7O2L59O959912kpqZKkJro/2NBE1G94uLigj//+c+YOnUqmjZt+sz5jh07hi+++ALfffcdtFotnJ2d8dNPP8HHxwdxcXHo2bNnHaYmqkjoXdwajQZxcXFo3749bGxs4OfnB5VKhQ4dOiAiIkLqeJVKXBKMY9uWGD1OpqXWqLFm5xyM/fB5DF/ggEX/HIP7v9+WOpbZM5f1+tVXX8WZM2fw7rvvomnTpjhx4gS+/PJLvPnmm5g6dSree+89bN68Gfn5+ejevTs2btyI/fv3IzAwUFfOmZmZGDFihNQPhUjsLejw8HAkJSVh4cKFCAgIQGpqKkJDQ5GXl4fZs2dLHY8EtDl5KVLPbMeXbx1FI7tmiPvXNCzbFIaY1/dIHY1qWUxMDObPnw8A2LNnDxYuXIjjx49XOq+NjQ1effVVxMTEoE+fPvj5559hYWGBzMxM9OnTB3l5eXUZnahSwhb0pk2bEB8fj5SUFCiVSgBASEgI0tPTkZSUhG7dukmckES0+5c1+NMrH6BFMw8AwBtDYjF5mSf+e/camjdxlzgd1ZY5c+Zg/vz5KC0txfTp07F27doq5y8qKsLXX3+N1NRUHD16FA4ODigrK8PkyZNZziQMYXdxx8TEYODAgbpyLufp6QlLS0v4+voCAK5evQqlUgkvLy906dIFhw4dkiIuCaCg8B5u3ctG+1YBurGWTu1gZ9MIl26elDAZ1SY/Pz98/PHHAIDQ0FCD5VzO2dkZCQkJcHBwwMOHD2FhYYHY2FjIZLLajEtkNCG3oHNycpCZmYl33nmnwnXZ2dnw8fGBtbU1ACAyMhITJkzA9OnTkZqainHjxuHKlSuwsrKqchnG/hKOeT8Zrp2Cq5X/2PaPcXx3nN5YaVEB3Dr3q9b9qFQpeLt/SLVu01DEvZkMv3bBemOPih8CAJ6zbaw3bm/jiEdFD+oq2h+mUqXghdDafd3r03q9evVqWFpa4ssvv8SWLVuMus2TJ4RlZmZi3LhxOHjwIPr27YtJkybh22+/fSqzisVNJqPVao2aT9iCBh6fjfmkwsJCqFQqDBo0CABw+/ZtHD58GDt27AAA9OzZEy1btkRycjIGDBhQt6Gf0H3E++g+coHeWOKSYGnCNCB21g4AgN8L7+uNFxTdg51NIyki1SsirtcvvPACgoKCcOfOHd3xZ0OeLufyY87z58/H2rVr8dZbb1UoaCIpCLmL28nJCQCQlZWlNx4bG4vc3FwEBDzehZmdnY3mzZvrtqYBoG3btrh27ZrBZWi1WqMmpTLYdA+smpTKYKNzNrSpstfF3tYRzo5uuHgjXTeWe+cyHhU9gEcL3zp85f6YunjdzXW9fvqQ15QpUwAA69evx++//25w2c8qZwD47rvvkJ+fjx49eqBTp05PZVZKvs5zqj+TsYTcgvbw8ICvry9iYmLQtGlTtGrVComJidi9ezcA6Aqa6GmDgyLwfcoy+HmGoJFdM/xj91wEeg2AS9M2UkejWhAUFAQA2L59u8F5qypn4PEeuv3792P8+PHo0aMHzp07V2u5iYwh5Ba0XC5HQkICfHx8EBUVhalTp8LJyQnR0dFQKBS6E8Tc3Nzw3//+F8XFxbrbXrlyBe7uPFu3oZoYMg9BnYZhxucvIHRJK2g0asybtFHqWFQL5HI5OnfuDADIyMiocl5D5VwuPf3x3hd/f39TxyWqNiG3oAHAy8sLycnJemNhYWHw9vaGra0tgMe7wnv16oWvv/5ad5LYjRs3EBIi3YlVYxekVGucTEshVyByWBwih8UZnpmMJuJ6bWFhgd27d0Mul6OgoOCZ8ykUCuzbt89gOQOPi37Xrl24cOFCbcUmMpqwBV2ZtLQ03S6tcqtXr8aUKVOwYsUKWFlZYdOmTQbP4CYi81dSUoJRo0YZnE+tVuOvf/0r5s6di/79+1f5Pue9e/di7969poxJVGNmU9AFBQXIysrC9OnT9cY9PDxw8OBBiVIRkTnYvHkzEhISoFarpY5CZDSzKWh7e3v+chFRjfHvB5kbIU8SIyIiauhY0ERERAJiQRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJyGzeBy2VVk0a5rKpfjPX9bomn5F9OTsXAODh1kLvcm0vl+iPkmmr891XRIJI2wzcy5E6Re1wdAUCJ0qdov6Yt2wNAGDp3Ai9y0Si4y5uIiIiAbGgiYiIBMSCJiIiEhALmoiISEAsaCIiIgGxoImIiATEgiYiIhIQC5qIiEhALGgiIiIBsaCJiIgExIImIiISEAuaiIhIQCxoIiIiAfHrJg1ISgNu3JVm2a2aAKMDpVk21W9cr+vOrFmzkJGRIcmy/f39sWLFCkmWTX8cC9qAG3eBS7ekTkFkWlyv605GRgZUKpXUMcgMcRc3ERGRgFjQREREAmJBExERCYgFTUREJCAWNBERkYBY0ERERALi26yIiATk6uoKR0dHlJWV4dq1aygsLHzmvB4eHmjevDl+/vnnOkxItY1b0EREArCwsMCYMWOwa9cu3L59G9evX8fp06dx7tw5PHz4EKdOnUJMTAzc3d31bufh4YGUlBTs3bsX3bp1kyg91QahC1qj0SAuLg7t27eHjY0N/Pz8oFKp0KFDB0REREgdj4jIJPr374+LFy8iMTERgwcPRrNmzZCXl4fMzExcuHABWq0WXbp0wfz583H58mV89dVXsLe315Vz69atcfLkSWRlZUn9UMiEhC7o8PBwLF68GJGRkdizZw/Gjx+P0NBQXL58GQEBAVLHq1TikmAc27bE6HEyneSMzXhn1UsYsaARBszl0RtT4npdO+RyOVasWIG9e/fC3d0d586dw1tvvQU3Nzc4OzujS5cu8PLygoODA4KDg/HNN9+grKwMb775Js6dO4cjR46gdevWOHz4MAYNGoSCggKpHxKZkLB/xTZt2oT4+HikpKRAqVQCAEJCQpCeno6kpCTuyqEK7G2bYNiL01FSWojPtnAPC4lvzZo1CA8PR3FxMT744AN8+umnUKvVFeYrKiqCSqWCSqXCsmXLsGnTJnTp0gUAkJ6eznKup4Tdgo6JicHAgQN15VzO09MTlpaW8PX1BQB88MEH8PLyglwuR2JiohRRSRAvdBiAPl1D0aKZh9RRiAyKiopCeHg4Hj16hAEDBiA2NrbScn5aYWEhmjRpovu5UaNGRt2OzI+QBZ2Tk4PMzEyMGzeuwnXZ2dnw8fGBtbU1AGDgwIH48ccf8fLLL9d1TCKiGnF3d0dsbCwAYMqUKUZ/mUb5MWdXV1ekpqbizJkz8PT0xJIlPMxQHwlb0ADg4uKiN15YWAiVSqW3e7tnz57w8Kj+FpNMJjNqUqlSqn3fx7Z/jK8iHPWmm1mHq30/KlWK0Tkb2lST18Vc1MXr3pDW63JPX667dbVi+c6ePRv29vZISEhAQkKCUc/bkyeEHT58GAMGDMBrr70GjUaD6OhoNGvWrJLnWiX57yqnZ6+Thgh5DNrJyQkAkJWVhcGDB+vGY2NjkZubK+wJYuW6j3gf3Ucu0BtLXBIsTRgiE+F6bRp2dnaYPHkyABi95ft0OZcfc05PT8fu3bsxdOhQTJs2DZ988kltRqc6JuQWtIeHB3x9fRETE4MNGzbgwIEDiIqKwrp16wDAJAWt1WqNmpTK4D+8rJpSKoONztnQJilfl9pWF697Q1qvyz19ue7WVf3zaIKCgtC4cWMcP34cp06dMvh8Paucy61fvx4AMGDAgEqea6Xkv6ucnr1OGiJkQcvlciQkJMDHxwdRUVGYOnUqnJycEB0dDYVCoTtBjOhJao0aJaVFKC0rAQCUlBahpLSoWr8QRLWtfAPDmE/9MlTOT96P6HsWqfqE3MUNAF5eXkhOTtYbCwsLg7e3N2xtbSVKRSLbf/wbxP1rqu7nIX95vJ58M/8KXJq2kSgVkT43NzcAwPnz56ucz5hyBoDc3Fw8fPgQjo6OaNSoER48eFAruanuCVvQlUlLS0NQUJDe2MKFC7F+/Xrk5eXh9OnTmDVrFlQqFdq1aydJxrELUqo1TqYz4IUpGPDCFKlj1Etcr01n0aJFWLlyJW7dulXlfP7+/mjZsqVRH0LSo0cPlJaW8r3Q9YzZFHRBQQGysrIwffp0vfHFixdj8eLFEqUiIqqe27dv4/bt2wbnS0pKwpAhQ3DkyBGDxXvu3DlTxSOBmE1B29vb8834RNSg7N27V+oIJCEhTxIjIiJq6FjQREREAmJBExERCYgFTUREJCAWNBERkYBY0ERERAJiQRMREQnIbN4HLZVWTQzPUx+XTfUb1+u64+/vX+3bXM7OBQB4uLXQu1wXyyZxsKANGB0odQIi0+N6XXdWrFhR7dvMW7YGALB0boTeZWpYuIubiIhIQCxoIiIiAbGgiYiIBMSCJiIiEhALmoiISEAsaCIiIgGxoImIiATEgiYiIhIQC5qIiEhALGgiIiIBsaCJiIgExIImIiISEAuaiIhIQPw2KwOS0oAbd6VZdqsm/NYhqh1cr6kqs2bNQkZGhiTL9vf3r9E3gNVHLGgDbtwFLt2SOgWRaXG9pqpkZGRApVJJHaPB4y5uIiIiAbGgiYiIBMSCJiIiEhALmoiISEAsaCIiIgGxoImIiATEgiYiIklYWlpKHUFofB80ERH9Ia1bt8Yrr7yCwMBAtGnTBgqFAvn5+Thx4gRSU1Nx+PDhCrfx9/fH1q1b8eqrryI1NVWC1OITegtao9EgLi4O7du3h42NDfz8/KBSqdChQwdERERIHY/IoN/yr+KVOTLk3cuROgqRyQUEBGDbtm24cuUKvv76a0RFRWHQoEHo378/Jk6ciGXLluHQoUM4d+4cIiMjIZc/rhx/f3/s378fbdq0wfTp0yV+FOISegs6PDwcSUlJWLhwIQICApCamorQ0FDk5eVh9uzZUserVOKSYLh17ofuIxcYNU6m849dc3H03E7k3bsOG2t79Og4BK8PWYZGdk1185y9+jO+2bcIZ7N/hkZdhtbOHTGy99voHzhZwuTi43pNT7KwsMBHH32E9957DwqFAiUlJdi+fTtSU1Pxn//8B2VlZWjRogUCAwMxYsQIdOzYEatXr0ZYWBiWLVuG9evXo1mzZtixYwemTp0q9cMRlrAFvWnTJsTHxyMlJQVKpRIAEBISgvT0dCQlJaFbt24SJyTRyOUKzAvdiDYunVFQeA+xm1/DJ99PweKpOwAAaef/jQ/ihyM0ZD7mT/oWVpa2OHpuJ1ZsiUTuncuYPGBRhfssU5fCQsHjZETlrKyskJiYiGHDhkGj0eCzzz7D0qVLcetWxc+OjY+Px8yZMzF27FgsX74cvXr1wrZt2yCXy7Fjxw6MHTsWpaWlEjwK8yBsQcfExGDgwIG6ci7n6ekJS0tL+Pr64u7duwgLC0NWVhZsbW3RvHlzrFq1Cp6enhKlJimFD4rRXXa0fx6jes/Eko3jdWNfbotGiH8owvr/n25M6TceRSWPsDzxdQx4YSo2/PtDqDWlUMgt8cvZHVD6TUDksE+xdNOfcPZqKopLH6GlkydeH7wMAV6v6O7n5CUV4vcuwLXfzkAmk6NHp6F4b2J8pTmPZG7Dt/sX4+adS2jaqAVe7bsAfbu9avonhKgWrF27FsOGDcPt27cxatSoSo8vP0mtVuP777/HzZs3sX//flhZWaG4uBhvv/02y9kAIY9B5+TkIDMzE+PGjatwXXZ2Nnx8fGBtbQ2ZTIZZs2YhKysLJ0+exNChQ7m7hHROXDwAj5Z+AICcvCzcvH0Rfbv9qcJ8fbpOArRapF/YBwA4eCoB3TsOQsKHeYgc9im0Wg16dx6N+LkXsGXRHYT4h+KjDWNwryAPAHD55inMXzsAA18Ix+YPcvHdgusY8MKUSjMdz9qHTxPCETV8BZIW5eO9Cf/E37bNwKnLB2vnSSAyoTFjxiAsLAwFBQXo16+fwXIuV35CmJWVFfLy8mBtbY2VK1fWclrzJ2xBA4CLi4veeGFhIVQqlW73tqOjI/r166e7vmfPnrhy5YpRy5DJZEZNKlVKtfMf2/4xvopw1JtuZhm3Ij9JpUoxOmdDmwy9LodObcHOX1Zj+vDPAUBXpk6NW1WY19LCCo2ec8Ldgse76Dq36Y1g/wlQyBWwsbKDrbU9+gX8CXY2DrBQWGJ88BxYKKxw/vqvAICdv6xGkPcwDHhhCqwsrGFtaQu/dsGV5tp6+HOM6j0TXTxeglwuR0e37ujb7U/Yd3xDnb7uDWm9Lvf0ZZEnqTNX9k1WVlZW+PLLLwEAc+bMwcmTJ416vctPCCs/5hwYGIi7d+9iyJAhGD58eCXrh0ry57+uXl9DhNzF7eTkBADIysrC4MGDdeOxsbHIzc1FQEBApbdbsWIFRo4cWRcRq9R9xPuVnkxDdUN1MgGfb4nER1N2oL3r//6Zs38eAHD7/g24OXfUm7+0rAQPfr8Nx+eex428C2jetI3e9cWlhVizcw6O/Wc3Hvx+GzKZHIXFD3H/98el/9vdq/Bs2dWobL/lX8HJi8nYcnC5bkyjVaNz25dq+nDrDNfrhm306NFo0aIFTp06hb///e9G3ebpci4/5rx48WIsX74c0dHR2LFjRy0nN19CbkF7eHjA19cXMTEx2LBhAw4cOICoqCisW7cOACot6EWLFuHixYuIjY01ahlardaoSakMNuVDqxalMtjonA1tetbr8uOv6x+X89Qf4O8Zohtv5dQeLZp6IPnEdxVuk5KxGZDJ0O1/x5RlMv1fi8SDy3H68kHERh7AtsX3sW3xPdjbNoFWqwUAuDRpgxu3Lxj1mjo3cUdY/w+xbfE93bRjyUPEhO+u09e9Ia3X5Z6+LPIkdeanz/0BgLCwMADAqlWr9HI9y7PKGQDWr1+PR48eoX///hX2lCqVSsmf/7p6fQ0RsqDlcjkSEhLg4+ODqKgoTJ06FU5OToiOjoZCoYCvr6/e/EuWLMHOnTvx448/ws7OTqLUJLWth7/Amp1/xl/f2IvObXvpXSeTyTBj1N9wIH0jvt2/BA8e5aO4tBAHTyXiqx2zMCF4Llo0bVvp/T4qegBLC2s0smuGUnUJvtn3EQqK7umuHxIUiZ/P7sC+49+gpKwYxaWFOHkppdL7Gt17FrYc+gynLx+CWqNGaVkJsnKO4/z1NFM9DUS1onv37gCAPXv2GJy3qnIGgHv37uGXX34BAAQGBtZO4HpAyF3cAODl5YXk5GS9sbCwMHh7e8PW1lY3tmjRIuzevRv79u2Do6NjHackkazaPhMKuQX+vDpEb/yHjwsAAN07DkJs5AF8s+8j/CslFhqNGq2e90LE0DgM7D7tmfc79uXZuHgjHRMXt4S9rSNG954FlyZtdNe3a+mHj8N3I/7HBVi57S1YKCzxovfwSo9DB3boj9lj/4E1u+YgJ+88ZDI52jT3weQBH5nkOSCqDS4uLnByckJ+fj6ys7OrnNdQOZc7ceIE+vTpgy5dumDnzp21Fd2sCVvQlUlLS0NQUJDu5zNnzuDDDz9Eu3btEBwcrBvPyMio+3D/M3ZBSrXGyXT2fWJ411Hntr2xLOLfz7y+srdGNXFojmUR+/TGxgX/We/nrp590HVGxY8rdGnapkKuHp2GoEenIQazioTrdcNWVlaG1atX48GDB1XOZ29vj7179xosZ+DxyWCNGzdGZmZmbUSuF8ymoAsKCpCVlaX3sXA+Pj7V2p9PRETVd/v2bURFRRmcr6CgADNnzsS4ceMwceLEKt/n/MMPP+CHH34wZcx6x2wK2t7eHmq1WuoYRERUhc2bN2Pz5s1Sx6gXhDxJjIiIqKFjQRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJiAVNREQkIBY0ERGRgMzmg0qk0qpJw1w21W9cr6kq/v7+Nbrd5excAICHWwu9y3Wx7PqIBW3AaH7RCtVDXK+pKitWrKjR7eYtWwMAWDo3Qu8y1Qx3cRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJiAVNREQkIBY0ERGRgFjQREREAmJBExERCYgFTUREJCAWNBERkYBY0ERERAJiQRMREQmI32ZlQFIacOOuNMtu1YTfOkS1g+s11UezZs1CRkZGnS/X39+/xt8AVhUWtAE37gKXbkmdgsi0uF5TfZSRkQGVSiV1DJPhLm4iIiIBsaCJiIgExIImIiISEAuaiIhIQCxoIiIiAbGgiYiIBMS3WRERUYPl4OAAHx8fODg4oKSkBFlZWcjNzX3m/MHBwSgtLcWRI0dqPRsLmoiIGhQnJyeEh4fjtddeg7e3d4Xrc3NzsXXrVqxatQpnzpzRjYeEhGDnzp1Qq9UIDAxEVlZWreYUehe3RqNBXFwc2rdvDxsbG/j5+UGlUqFDhw6IiIiQOl6lEpcE49i2JUaPk2mt2/M+wmLaYsSCRhj3oTM+2jAWt+5mSx3L7HG9pvpALpdj5syZuHbtGpYuXQpvb2+UlJQgPT0d+/btw+HDh3Hv3j20aNEC06dPR2ZmJuLj4+Ho6KgrZzs7O3z//fe4cOFCrecVegs6PDwcSUlJWLhwIQICApCamorQ0FDk5eVh9uzZUscjAfULCMOE4PfwnG1jFJU8QvyPC/DxtxPx+YxUqaMRkYQcHByQlJSEfv36AQB27dqFlStXYv/+/SgtLdXNJ5PJ0KVLF0RERGDatGmYPHkyBg8eDHt7e9ja2mLt2rWIiIiAVqut9czCFvSmTZsQHx+PlJQUKJVKAI93L6SnpyMpKQndunWTOCGJyM25o+6yFlrIZHJczzsvYSIikpqtrS327NmDXr164bfffsMbb7yBnTt3VjqvVqvFqVOnMGPGDHz++efYunUrfHx8AACJiYl1Vs6AwAUdExODgQMH6sq5nKenJywtLeHr6wsAGDlyJC5fvgyFQgFLS0vExMTo/kOihumnE9/h86QoPCp6AIXcAm8OWy51JCKSUGxsLHr16oXs7GwolUpcvXrVqNu5urqibdu2up87deoEKysrFBcX11JSfUIWdE5ODjIzM/HOO+9UuC47Oxs+Pj6wtrYGAN3xAQA4ceIEgoODkZ+fD4VCUZeR9Rzb/jGO747TGystKoBbZ/7jUBf6dJ2EPl0nIf/Bb9jz69do26KL1JHqBa7XZI569+6NGTNmoLS0FMOHDze6nJ885hwfH48XX3wRPj4+WLBgARYuXFi7of9HyJPEcnJyAAAuLi5644WFhVCpVHq7t8vLGQDu378PmUxm1O4HmUxm1KRSpVQ7f/cR7yNqzT29qaVX72rfj0qVYnTOhjYZ87o0beSCwT3ewIJ1Q/HgUX61n3+p1MXr3pDW63JPXxZ5MsfMIuSu7Jus5s2bBwBYunQpTp48adQ6+mQ5r127FtOmTcO0adMAAG+//Taee+65p9ZpVY2eJ0OELGgnJycAqHAKe2xsLHJzcxEQEKA3Hh0dDQ8PD4wZMwZbtmyBhYWQOwZIAmp1GYpKfsedBzeljkJEdczd3R2DBg1CUVGR0d/X/HQ5lx9zTk1NxaFDh9CoUSNMmjSpdoP/j5AF7eHhAV9fX8TExGDDhg04cOAAoqKisG7dOgCoUNArV67E5cuXkZSUhDlz5qCgoMDgMrRarVGTUhlcGw/RKEplsNE5G9pU2eui0Wiw7cjfcLfg8Rcd593Lwd+2RsOlSRu4Pd+xwvyiqovXvSGt1+WevizyZI6ZRcj99DlLISEhkMvl2LVrF/LzDe9Fe1Y5l9uwYQMAoG/fvk+t08oaPU+GCFnQcrkcCQkJ8PHxQVRUFKZOnQonJydER0dDoVDoThB7mlKphFwur5NPeCExHfvPbkTEdcawvzyHt77sAWsrOyyL2A+FgntViBqa8o25o0ePGpzXUDk/eT9PbyTWFmH/anl5eSE5OVlvLCwsDN7e3rC1tQUAFBQU4M6dO3B3dwfw+CSxS5cuoVOnTnWet9zYBSnVGifTkcvliAnfLXWMeonrNZmjli1bAgAuXbpU5XzGlDMAXLx4Ue9+a5uwBV2ZtLQ0BAUF6X7+/fffMWHCBBQUFMDCwgI2NjbYuHEj3NzcJExJREQiCA0NhZ2dHR49elTlfM7OzrC2tjb4ISSFhYVo1qwZioqKaiNuBWZT0AUFBcjKysL06dN1Y82bN8cvv/wiYSoiIhJVSUkJSkpKDM73/fff4+rVqzh27JjBY8TGHMs2FbMpaHt7e6jVaqljEBFRPWTMceq6JuRJYkRERA0dC5qIiEhALGgiIiIBsaCJiIgExIImIiISEAuaiIhIQCxoIiIiAZnN+6Cl0qpJw1w21W9cr6k+8vf3r/ZtLmfnAgA83FroXa7t5RqDBW3A6ECpExCZHtdrqo+M/UrJJ81btgYAsHRuhN5lEXAXNxERkYBY0ERERAJiQRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJiAVNREQkIBY0ERGRgFjQREREAmJBExERCYgFTUREJCAWNBERkYD4bVYGvHv+LE4+fCjJsv0cHPBpB+8a3TYpDbhx18SBjNCqCb8piYjIFFjQBpx8+BAH7+ZLHaPabtwFLt2SOgUREdUUd3ETEREJiAVNREQkIBY0ERGRgFjQREREAmJBExERCYgFTUREJCAWNBERkYBY0ERERAISuqA1Gg3i4uLQvn172NjYwM/PDyqVCh06dEBERITU8YiIiGqN0AUdHh6OxYsXIzIyEnv27MH48eMRGhqKy5cvIyAgQOp4ldKWlqL0zRlQ//0feuPqrdtQ+qfJ0BYUSJSsaolLgnFs2xKjx0Wm0Wgw82898cocGfLu5Ugdh4ioRoT9qM9NmzYhPj4eKSkpUCqVAICQkBCkp6cjKSkJ3bp1kzhh5WSWlrCYNwdlb82CrPsLkHf1h/bKFWjW/ROKjz+CzN5e6oj13pZDn8Ha0k7qGEREf4iwW9AxMTEYOHCgrpzLeXp6wtLSEr6+vnrja9asgUwmQ2JiYl3GrJSsjTvk0yZDHfcZtPn5KFv6CeQjhkHu20XqaPVeTl4WfkhdhYihcVJHISL6Q4Qs6JycHGRmZmLcuHEVrsvOzoaPjw+sra11YxcuXMD69esRFBRUlzGrJB85AjK31iiLjAYUCsgnh0kdqd7TaDSI+9c0RAyNg72to9RxiIj+EGELGgBcXFz0xgsLC6FSqfR2b5eVlWHatGn46quv9ErbEJlMZtSUkpJSo8cgk8kg8+0C3L8Ped8+kFlaVvs+UlJSjM759KRSVT/3se0f46sIR73pZtbhat2HSlXzzH/08W09/DmaOrigd5dR1X7sIqmr57ChTOWevizyZI6ZzTW3FJmNJeQxaCcnJwBAVlYWBg8erBuPjY1Fbm6u3gliixcvxqBBg+Dv71/XMaukvXIFmu82Qz5hHDQbv4P8pV6QOTtLHatK3Ue8j+4jF+iNJS4JliZMNd24fRGJBz/FyrfTpI5CRGQSQm5Be3h4wNfXFzExMdiwYQMOHDiAqKgorFu3DgB0BX306FH89NNPmDt3brWXodVqjZqCg4Orf98lpY+PO48eCUX4VMh6vQj1J8uh1WiqdT/BwcFG53x6Uiqrn9sUlMqaZ/4jjy/zymHcL8jDG592xpj/c8L0FY/3skQu98WO1FUSPBM1V1fPYUOZyj19WeTJHDOba24pMhtLyC1ouVyOhIQEREZGIioqCs2aNcPkyZMRHR2Nv/zlL7oTxJKTk3Hp0iW0a9cOAPDbb7/h7NmzuHbtGt59913J8mvWrYfMwgLysFcBAIrpb6IsMhqaLVuhGDdGslz1mdJvPLq176f7Oe9+Dmb+7UX89Y1/w825o4TJiIhqRsiCBgAvLy8kJyfrjYWFhcHb2xu2trYAgHnz5mHevHm664ODgzFjxgyMHTu2TrM+SXMiA5rdP8Ji5ReQWTx+emV2dlDM/TPU8xdAHtgNsrZtJctXX9lY2cHG6v+/tUqtKQMANHVwga0139pGROZH2IKuTFpamlBnaldG3tUf8h1JFcc7+0D+w1YJEhln7IKUao2LzqVpG+z7xPhdSUREojGbgi4oKEBWVhamT5/+zHlqesY1ERGRaMymoO3t7aFWq6WOQUREVCeEPIubiIiooWNBExERCYgFTUREJCAWNBERkYBY0ERERAJiQRMREQmIBU1ERCQgFjQREZGAzOaDSqTi5+Bglstu1cSEQQRcroPY39z5h9Tnx0ZExmNBG/BpB2+pI9TI6ECpE9SuDn2kTkBEVLu4i5uIiEhALGgiIiIBsaCJiIgExIImIiISEAuaiIhIQCxoIiIiAbGgiYiIBMSCJiIiEhALmoiISEAsaCIiIgGxoImIiATEgiYiIhIQC5qIiEhALGgiIiIBsaANiI6OhoUFv5WTqCFKSUmBj48PPD098frrr0OtVksdyaCZM2fC1dXVrP5uXb9+HX379kWnTp3g4+OD+fPnSx3JaP3794e/vz+6dOmCsWPH4sGDBya7bxZ0FQ4dOoSCggKpYxCRBDQaDV5//XUkJCTg4sWLePDgATZu3Ch1LIPGjRuHtLQ0qWNUi4WFBZYtW4Zz587hxIkTOHz4MLZv3y51LKMkJCQgIyMDp0+fhqurK5YvX26y+2ZBP0NxcTHmzZuHuLg4qaMQkQR+/fVXtGzZEt7e3gCA8PBwbNmyReJUhvXu3RsuLi5Sx6iWFi1aIDAwEABgZWWFrl27Ijs7W+JUxmncuDGAx//QFRUVQSaTmey+WdDP8NFHHyE8PBzPP/+81FGISAI5OTlo3bq17mc3Nzdcv35dwkQNQ35+PrZt24ZXXnlF6ihGGzVqFJydnXH+/Hm8++67JrtfmVar1Zrs3uqJU6dOYfbs2di3bx9kMhksLCxQVlYmdSwiMkLW5evYozqm+zn31h0AQAvnZnqXAcDhOVuEje4Py0qO1yYmJmLr1q349ttvAQDnzp3DpEmTcOLECZNnLlOrsXHrPtx/+LvBzADQ/6VAdPJ0r/I+6+Lv1okzF3Dw2Cndz1Xlfr5pY0wc3hfyKrYwS0pKMHDgQAwZMsSkRfekouIS/HPLXhQVlxjMDACj+veGW6vmBu+3pKQE4eHh6Nu3L6ZMmWKSrNyCrsSRI0dw9uxZtG3bFm3atIFarUabNm1MevCfiGpH+7auaGRvh9xbd3R/cAFUuJx76w56BnSutJwBoHXr1npbzNnZ2XB1da2VzBYKBXoFdjYq83O2NujQzq1WclSXb8d2UMjlBnP/Ny8fL3X3rbKc1Wo1Jk2aBH9//1orZwCwsbZCd7+ORj3XzZ2aGFXOwONd8xMnTsTWrVtNlpUFXYmoqCjcvHkTV69exdWrV6FQKHD16lU0atRI6mhEZIBMJsOYQUrY2VhXOV8P/07oWEXRBQYGIicnB2fPngUAfP311xg9erRJsz6pfRtX9AzoXOU8NtZWGDtYWWXR1SWFQo7xQ0NgYaGocr4+PbuhdQvnKueJiIiAg4MDPv30U1NGrJS/tye6dGhb5TyNHZ7DiFd6VTnPw4cPkZubC+DxMegdO3bAx8fHZDlZ0ERU7zSyt8OoAS898/pmjo0wOCSoyvtQKBRYu3Ytxo4di3bt2sHe3h5hYWGmjqpnkLI7nm/q+MzrR/bvDcdG9lXeR2RkJFxdXaFWq+Hq6oro6GgTp9Tn3MwRg4J7PPN61xbPI+TFrlXex5EjR7Bu3TqkpaWha9eu8Pf3xxdffGHqqDoymQwjB7wEB3u7Z84zbnAwbA38k/fw4UMMHz4cvr6+8PX1RVlZGRYsWGC6nDwGXT1ardakZ+kRUe35fmcyTpy5oDcmk8nw5qvD4W7krsu6lpObh1Ubt0Gj0f/T7NvRA6HD+wr590ej1WL9v3bjwtUbeuOWFgq8PWUMnm/mKE0wA85fysb6xB8rjPcK7IxhfXtKkEgft6CrSXX0JL7dtg9lZvCBBUQN3YhXeqGxw3N6Y8FB/sKWM/B4i7NvzwC9MQd7O4zs31vIcgYAuUyGsYODYWNtpTc+OCRI2HIGgA7t3BDU1VtvzLmZIwa+3F2iRPrMvqBPnz6NMWPGwMnJCTY2Nmjfvj3ef//9WllWcXEJDh49iZLSMlgoqj7mQkTSs7G2wvghIbqfWzV3Qt9e3SRMZJzgF/31jtmOG6SEna2NhIkMa+zwHEb176372auta4XyE9Hg4B5wavL4vcxyuQwThvaBpaUYn8Jm1gV9/PhxBAUF4cyZM/jkk0+we/duzJs3D7/99lutLC81/QweFRWjX68AwzMTkRDaubdE78AusFAoHp/QZAb/XCvkckwYGgJLSwsEdfWGl0drwzcSgJ+3J/w6tYOtjTXGDlIKu8X/JCsrS4wfEgyZTIZ+vQLQysVJ6kg6Zn0MOjg4GGfPnsWFCxd0n+ZirHnL1tRSKiIiomdbOjfCqPnMdgv60aNHOHToEEJDQ6tdzkRERKITY0d7Ddy9excajabGHxxg7H8wwONjz8tWb0Lrls6YOm5QjZZHRERUHWZb0E2aNIFcLseNGzcMz1yJmuziPn/5OneNExHRH1Lvd3Hb2dnh5ZdfxqZNm/gRnEREVO+Y9Ulix48fx8svvwx3d3e89957cHd3R3Z2Ng4dOoS1a9eaZBnJP5/A3oO/IjpsJFq3rPqj6oiIiEzFbHdxA0BAQAB+/vlnLFy4EO+88w6KiorQunVrTJw40ST3X1xcgkPHTqGDR2uWMxER1Smz3oKubbm37mDjtn2YOLQPC5qIiOoUC9oAjUYDudxsD9UTEZGZYkETEREJiJuGREREAmJBExERCYgFTUREJCAWNBERkYBY0ERERAJiQRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJiAVNREQkIBY0ERGRgFjQREREAmJBExERCYgFTUREJCAWNBERkYBY0ERERAJiQRMREQmIBU1ERCQgFjQREZGAWNBEREQCYkETEREJiAVNREQkIBY0ERGRgFjQREREAmJBExERCYgFTUREJKD/By7cu5vbFibqAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = 4\n", "oracle_gate = dj_oracle('balanced', n)\n", "dj_circuit = dj_algorithm(oracle_gate, n)\n", "dj_circuit.draw()" ] }, { "cell_type": "markdown", "id": "80f7cdd5", "metadata": {}, "source": [ "And see the results of running this circuit:" ] }, { "cell_type": "code", "execution_count": 47, "id": "e55aa796", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFLCAYAAAC0rNfYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAa+klEQVR4nO3df7SdVX3n8fcXroCYoCRIyM0FMYSlM4kIerSAF4iOKUPsoIJLYKlphkqaqERknKpTpI0VbbUyMHYYJHUBQWup+GusAcKgMS4IN97ERhAnyRRMTQg3pkRjS0ggfuePc5IeD/fHPsnNvSf3vF9rnZVz9t7Pvt/nr0+eX/uJzESSJA3tsNEuQJKkQ4WhKUlSIUNTkqRChqYkSYUMTUmSChmakiQV6hjtAkbTcccdlyeffPJolyFJaiGrV6/elpkv7a+vrUPz5JNPpre3d7TLkCS1kIjYOFCfp2clSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTWkMuvzyyzn++OOZMWNGv/2ZycKFC5k2bRqnnXYaa9as2dd3++23c+qpp3Lqqady++2372tfvXo1r3rVq5g2bRoLFy4kMw/6fkitxtCUxqC5c+dyzz33DNh/9913s2HDBjZs2MAtt9zCggULAHjqqadYtGgRPT09rFq1ikWLFrF9+3YAFixYwOLFi/dtN9j80lhlaEpj0LnnnsuECRMG7P/Wt77FnDlziAjOPPNMfvnLX7JlyxbuvfdeZs2axYQJEzj22GOZNWsW99xzD1u2bGHHjh2ceeaZRARz5szhm9/85sjtkNQiDE2pDW3evJkTTzxx3++uri42b948aHtXV9fz2qV2Y2hKklTI0JTa0JQpU/j5z3++7/emTZuYMmXKoO2bNm16XrvUbgxNqQ1deOGFLFmyhMzkoYce4sUvfjGTJ0/m/PPPZ9myZWzfvp3t27ezbNkyzj//fCZPnswxxxzDQw89RGayZMkS3vrWt472bkgjrmO0C5A0/C677DKWL1/Otm3b6OrqYtGiRTz77LMAzJ8/n9mzZ7N06VKmTZvG0Ucfza233grAhAkT+PjHP87rXvc6AK699tp9NxTddNNNzJ07l507d3LBBRdwwQUXjM7OSaMo2vlZq0qlkr29vaNdhiSphUTE6sys9Nfn6VlJkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYVGNDQj4tyI+N8RsTkiMiLmFmzzqoj4fkTsrG13bUREw5iLI+LRiNhV+/ftB20nJElta6SPNMcBjwAfBHYONTgijgHuA/qA19W2+6/A1XVjzgLuBL4MnF7796sR8TvDXLskqc2N6NqzmbkUWAoQEbcVbPIu4Gjg9zNzJ/BIRLwSuDoirs/qGoBXAd/LzOtq21wXEW+stV82vHsgSWpnrX5N8yzgB7XA3OteoBM4uW7Msobt7gXOPujVSZLaSqu/5eQEYFNDW19d3+O1f/v6GXNCfxNGxDxgHkBnZyfLly8HYOrUqYwfP561a9cCMHHiRKZPn86KFSsA6OjooLu7mzVr1rBjxw4AKpUKfX19/Pm3TzmQfZQkDYNPXLKFdevWAdV3xnZ1ddHT0wPAuHHjqFQqrFy5kl27dgHQ3d3N+vXr2bp1KwAzZszY1zeQUXvLSUT8C/CBzLxtkDHLgE2ZeXld20nARuDszFwZEbuB92bmkroxc4DFmXnkYDUM11tOrrjhgKeQJB2gxVcNzzyH8ltOngQmNbRNqusbbMyTSJI0jFo9NFcC50TEUXVts4AngJ/VjZnVsN0s4MGDXp0kqa2M9HOa4yLi9Ig4vfa3T6r9PqnW/+mIuL9uk78BngZui4gZEXER8FFg752zADcCb4qIj0bEKyPiY8AbgRtGaLckSW1ipI80K8CPap8XAotq3z9R658M7LurJjN/RfWosRPoBf4n8Dng+roxDwKXAnOBHwNzgEsys+fg7ookqd2M9HOay4EYpH9uP20PA+cOMe9dwF0HWJ4kSYNq9WuakiS1DENTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1Jkgo1FZoRcVhEHFb3+4SIeG9EvGH4S5MkqbU0e6T5HeBKgIgYB/QCnwWWR8ScYa5NkqSW0mxoVoDv1r5fBOwAjgeuAD5cMkFEvC8iHo+IZyJidUScM8jY2yIi+/n8a92YmQOMeWWT+yZJ0qCaDc1xwC9r338X+EZmPks1SE8ZauOIuAS4EfgUcAbwIHB3RJw0wCYfBCY3fB4D/q6fsdMbxm0o2iNJkgo1G5r/BLwhIl4EnA/cV2ufADxdsP3VwG2ZuTgzf5qZVwJbgAX9Dc7MX2Xmk3s/VIN5KrC4n+Fb68dm5p4m902SpEE1G5rXA3cAm4DNwIpa+7nAw4NtGBFHAK8FljV0LQPOLvz7VwA/ycwH++nrjYgtEXF/RLyxcD5Jkop1NDM4M78QEauBE4H7MvM3ta5/BD4+xObHAYcDfQ3tfcCbh/rbEfFi4J3Axxq69h6p/hA4AngPcH9EnJeZP+hnnnnAPIDOzk6WL18OwNSpUxk/fjxr164FYOLEiUyfPp0VK6r/L+jo6KC7u5s1a9awY8cOACqVCn19fRScmZYkHWRbtmxh3bp1AEyZMoWuri56enoAGDduHJVKhZUrV7Jr1y4Auru7Wb9+PVu3bgVgxowZ+/oGEpl5EHeh7g9FdFI9Oj0vM1fUtV8LvCszXzHE9u8HPgd0ZuZTQ4xdCjyXmRcONq5SqWRvb2/pLgzoihsOeApJ0gFafNXwzBMRqzOz0l9f04sb1O5+/UlEPB0RU2ttH4mIdw6x6TZgDzCpoX0S8GTBn74C+NpQgVnTA5xaME6SpGLNLm5wFXANcAsQdV1PAB8YbNvM3A2sBmY1dM2iehftYH/39cCr6f8GoP6cTvW0rSRJw6apa5rAfOCKzPxORHyyrn0N1Uc+hnI9cEdErAIeqM3XCdwMEBFLADKzcaGEecCGzFzeOGEtyH8G/ITqNc13A28DLi7cJ0mSijQbmi8DHumn/VnghUNtnJl3RsREqkerk2tzzc7MjbUhz3teMyLGA5cCnxhg2iOorkrUBeykGp5vycylQ9UjSVIzmg3Nx4DXABsb2mcDj5ZMkJk3ATcN0Dezn7ZfU11UYaD5PgN8puRvS5J0IJoNzb8E/ioijqZ6TfOsiHgP8EfA5cNdnCRJraTZ5zRvjYgOqsvgHU11oYMngIWZeedBqE+SpJbR7JEmmbkYWBwRxwGHZebW4S9LkqTW03Ro7pWZ24azEEmSWt2QoRkRP6a6is/2iHgYGHAJocw8bTiLkySplZQcaX4N2FX3fWTW3ZMkqcUMGZqZuaju+58e1GokSWphzS6j992IeEk/7cdExHeHrSpJklpQswu2z6S6Ak+jo4BzDrgaSZJaWNHdsxHxmrqfp0VE/ZtGDgfOp/raL0mSxqzSR056qd4AlMCyfvp3AlcOV1GSJLWi0tB8OdVl8x4DXg/8oq5vN7A1M/cMc22SJLWUotCsewtJ0y+tliRprChZ3OAi4NuZ+Wzt+4Ay8+vDVpkkSS2m5EjzLuAEYGvt+0CS6k1BkiSNSSWLGxzW33dJktqNIShJUqHSa5pFvKYpSRrLSq9plvCapiRpTGvqmqYkSe3MQJQkqZDPaUqSVMjnNCVJKuRzmpIkFTIEJUkq1HRoRsRrImJJRPTWPnc0vG9TkqQxqanQjIh3AT8EJgNLa59JwKqIePfwlydJUusofZ/mXtcBH8/MT9U3RsTHgE8CXxquwiRJajXNnp59KfB3/bR/FTj+wMuRJKl1NRua3wNm9tM+E/j+gRYjSVIra3bB9ruBT0dEBXio1nYmcBHwp8NenSRJLWR/F2yfV/vU+zxw0wFXJElSi3LBdkmSChmIkiQVavaREyLiWOAC4CTgiPq+zPzEMNUlSVLLaSo0I+JM4DvALqqPn2ymutDBLuBngKEpSRqzmj09+1ngy8AU4BngTVSPOHuBvxje0iRJai3NhuZpwF9lZgJ7gCMzsw/4CD5yIkka45oNzd113/uAl9W+/wvQOSwVSZLUopq9EWgN8DpgPbAc+GRETALeDfx4eEuTJKm1NHuk+cfAE7Xv1wC/oLqowbE8f7EDSZLGlKaONDOzt+77L6g+eiJJUlto+jlNgIg4Bfh3tZ+PZuZjw1eSJEmtqdnnNCcCXwQuBH7zb83x98DlmfnPw1yfJEkto9lrmn8NTAPOAY6qfc4FXg4sHt7SJElqLc2G5vnAFZn5QGY+V/s8APxhrW9IEfG+iHg8Ip6JiNURcc4gY2dGRPbzeWXDuIsj4tGI2FX79+1N7pckSUNqNjR/AfxrP+1PA0Oemo2IS4AbgU8BZwAPAndHxElDbDqd6nJ9ez8b6uY8C7iT6kpFp9f+/WpE/M5Q9UiS1IxmQ/MTwA0RMWVvQ+375yhbd/Zq4LbMXJyZP83MK4EtwIIhttuamU/WffbU9V0FfC8zr6vNeR3VZ0ivKt4rSZIKDHkjUEQ8DGRd08uBn0XE5trvvevQHk/1mudA8xwBvBb4y4auZcDZQ5TRGxFHAo8Cn8zM79X1nUX1WdF69wIfGGJOSZKaUnL37F3D9LeOAw6nuvxevT7gzQNss/co9IdUX0P2HuD+iDgvM39QG3PCAHOe0N+EETGP2kIMnZ2dLF++HICpU6cyfvx41q5dC8DEiROZPn06K1asAKCjo4Pu7m7WrFnDjh07AKhUKvT19QGnDLnzkqSDa8uWLaxbtw6AKVOm0NXVRU9PDwDjxo2jUqmwcuVKdu3aBUB3dzfr169n69atAMyYMWNf30Ciuvb6wRcRnVRfJXZeZq6oa78WeFdmvqJwnqXAc5l5Ye33buC9mbmkbswcYHFmHjnYXJVKJXt7ewcbUuSKGw54CknSAVp81fDMExGrM7PSX9/+Lm7wJuDfUz1t+5PMXF6w2Taqb0aZ1NA+CXiyiT/fA1xa9/vJYZhTkqQhNXUjUERMiYhVwH1UXwf2UaqnS3tqR5IDyszdwGpgVkPXLKp30ZY6nepp271WDsOckiQNqdkjzf9B9WhxWmY+DhARU4Ev1freMcT21wN31IL3AWA+1VeK3VybawlAZs6p/b4K+BnwE6rXNN8NvA24uG7OG4EVEfFR4JvA24E3At1N7pskSYNqNjRnATP3BiZAZj4WEQuB+4faODPvrC3Fdw3V5y0fAWZn5sbakMbnNY8APgt0ATuphudbMnNp3ZwPRsSlwCepPvbyj8AlmdnT5L5JkjSo/bmm2d+dQ8V3E2XmTcBNA/TNbPj9GeAzBXPexfDd5StJUr+aXdzgfuDzEXHi3obaaj43UHCkKUnSoazZ0FwIvAh4LCI2RsRGqqdDX1TrkyRpzGr29Ow/A68HZgJ7F03/aWb+n+EsSpKkVlQcmhFxOPAr4NWZeR/Vx04kSWobxadna4ukb6R6R6skSW2n2Wuafwb8eUQcdzCKkSSplTV7TfPDVN9ysjkiNtHwbs3MPG24CpMkqdU0G5p3UX0mMw5CLZIktbSi0IyIo6muzPM24AVUn8m8MjO3HbzSJElqLaXXNBcBc4HvAF+h+v7L/3WQapIkqSWVnp69CPiDzPxbgIj4MvBARBxeu6tWkqQxr/RI80TgB3t/ZOYq4DmqbyiRJKktlIbm4cDuhrbn2M+XWEuSdCgqDb0AvhQRu+rajgIWR8TTexsy88LhLE6SpFZSGpq399P2peEsRJKkVlcUmpn5nw92IZIktbpml9GTJKltGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUqERD82IeF9EPB4Rz0TE6og4Z5CxF0XEsoj4RUT8OiJ6IuLChjFzIyL7+Rx18PdGktRORjQ0I+IS4EbgU8AZwIPA3RFx0gCbnAd8F3hLbfxS4Bv9BO3TwOT6T2Y+M/x7IElqZx0j/PeuBm7LzMW131dGxH8EFgAfaxycmR9saFoUEW8B3gb84LeH5pMHoV5JkvYZsSPNiDgCeC2wrKFrGXB2E1ONB7Y3tL0wIjZGxKaI+PuIOOMASpUkqV8jeaR5HHA40NfQ3ge8uWSCiHg/0AXcUde8DrgcWEs1UD8IPBARr87MDf3MMQ+YB9DZ2cny5csBmDp1KuPHj2ft2rUATJw4kenTp7NixQoAOjo66O7uZs2aNezYsQOASqVCX18fcEpJ+ZKkg2jLli2sW7cOgClTptDV1UVPTw8A48aNo1KpsHLlSnbt2gVAd3c369evZ+vWrQDMmDFjX99AIjMP4i7U/aGITmAzcF5mrqhrvxZ4V2a+YojtL6Yalpdk5rcHGXc48A/A9zJz4WBzViqV7O3tLd+JAVxxwwFPIUk6QIuvGp55ImJ1Zlb66xvJG4G2AXuASQ3tk4BBr0dGxDuoBuacwQITIDP3AL3AqftfqiRJzzdioZmZu4HVwKyGrllU76LtV0S8k2pgzs3Mu4b6OxERwGnAlv2vVpKk5xvpu2evB+6IiFXAA8B8oBO4GSAilgBk5pza70upBuaHgRURcUJtnt2Z+VRtzJ8ADwEbgGOAhVRDc8EI7ZMkqU2MaGhm5p0RMRG4hurzlI8AszNzY21I4/Oa86nWeEPts9f3gZm17y8BbgFOAH4F/Ag4NzNXDfsOSJLa2kgfaZKZNwE3DdA3c7DfA2zzIeBDw1GbJEmDce1ZSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSp0IiHZkS8LyIej4hnImJ1RJwzxPjzauOeiYjHImL+gc4pSdL+GNHQjIhLgBuBTwFnAA8Cd0fESQOMfzmwtDbuDODTwOcj4uL9nVOSpP010keaVwO3ZebizPxpZl4JbAEWDDB+PvBEZl5ZG78YuB348AHMKUnSfhmx0IyII4DXAssaupYBZw+w2Vn9jL8XqETEC/ZzTkmS9stIHmkeBxwO9DW09wEnDLDNCQOM76jNtz9zSpK0XzpGu4CRFhHzgHm1n/8SEetGsx6phRwHbBvtIqT99dcfGrapXjZQx0iG5jZgDzCpoX0S8OQA2zw5wPjnavNFs3Nm5i3ALcVVS20iInozszLadUitbMROz2bmbmA1MKuhaxbVO177s3KA8b2Z+ex+zilJ0n4Z6dOz1wN3RMQq4AGqd8d2AjcDRMQSgMycUxt/M/CBiLgB+ALwBmAucFnpnJIkDZcRDc3MvDMiJgLXAJOBR4DZmbmxNuSkhvGPR8Rs4L9TfYTkCWBhZn6tiTkllfGyhTSEyMzRrkGSpEOCa89KklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUkARETbLaspNctHTiT9log4HCAz94x2LVKr8UhTanMR8YaIWBsR742IIzJzz97AjIiOiDgsqiZERIx2vdJoMjQlzQNmAH8GPB0R90TE7wFk5nOZ+Ruq76f9G6qv4pPalqEp6WSqy1D+LvCHtbavRsSOiPhiRLwauBTozMznRqlGqSV44V9qYxHRCWwAnsrMhyPiUeDrwDTgPwAXA6uAFwBvHbVCpRbhjUBSm6u98ODozPx5Q3sHcCxwJdUXJbxkFMqTWoqhKWlQEfFNYE9mXjzatUijzdOzkgYUEeOA7cCNo12L1Ao80pQ0qIg4MjN3jXYdUivw7lmpDUXEpIh4T0RMGGLcUZm5y+czpSpDU2pP1wC3A/8vIr4aEbMj4sj6ARFxEvCB2pGmp6QkDE2pXVWAvwD+C9U7ZL8BPB4Rn4+I19TGXAHM99Ss9G+8EUhqM7VnMzcBj2fmrRFxB9XnMt8KXAa8r/a85lTgv41epVLr8UYgqc1ExIuANwFbM7Onoe9oqkvqfRi4CBifmTtHvkqpNRmaUpuLiGi8ZhkRtwGnZOY5o1OV1Jq8pim1mb1vLdn7u5/AfCHQCVw/0rVJrc4jTUm/JSJeAFQyc+Vo1yK1GkNTahO1MHw5sNE7YqX94+lZqX28H/gRcHNE/KeIOCEifuv9mBFxTES8JSKOGJ0SpdbmkabUJiJiJfAM1UfNzgb+ierzmV8HHs7MX0XEfGBuZp45epVKrcsjTakNRMRLgWeBxbU7Yl8GfBH4PWAF8N2I+AhwFdAz0DxSu/NIU2oDETEZuBR4NDPvbeg7A3hvrf9Y4MTM3DzyVUqtz9CU2kTtUZLMzGf6e+QkIq4DZmfmGaNVo9TqXEZPahOZuXNvWPbzbObRwMXAraNRm3So8EhTGuMi4hjg14O9qSQijgIuAb6SmbtHrDjpEGNoSmNcRHwBWFX7bMzMHf2MeUlm/nKka5MONYamNIZFxGXAl4EdwFPAfcA9wI+BJ2qnbF8I/C3wx5n5yKgVKx0CDE1pDIuIxcAe4DNU31ry+8ApwDpgKXA/8Argxsx0QQNpCIamNEZFRAfwR8AxmfnRuvbpVF8w/Q7gKOAlwO2Z+QejUad0KDE0pTEsIo4FJmXm/60tjfds/Q1BEXEJ8BXgNZn5D6NUpnTI8JETaQzLzO3A9tr33VB9NRjV/zDvAY4BnjEwpTKGptRmMvM3dT/HA38yWrVIhxpPz0ptrPa6sD0NQSppAIamJEmFfMuJJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqdD/B+9WjO+l4SoCAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "transpiled_dj_circuit = transpile(dj_circuit, qasm_sim)\n", "qobj = assemble(transpiled_dj_circuit)\n", "results = qasm_sim.run(qobj).result()\n", "answer = results.get_counts()\n", "plot_histogram(answer)" ] }, { "cell_type": "markdown", "id": "ede6d574", "metadata": {}, "source": [ "## 5. Experiment with Real Devices \n", "\n", "We can run the circuit on the real device as shown below. We first look for the least-busy device that can handle our circuit." ] }, { "cell_type": "code", "execution_count": 48, "id": "300ec9a2", "metadata": { "tags": [ "uses-hardware" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "ibmqfactory.load_account:WARNING:2021-05-17 14:44:37,503: Credentials are already in use. The existing account in the session will be replaced.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "least busy backend: ibmq_lima\n" ] } ], "source": [ "# Load our saved IBMQ accounts and get the least busy backend device with greater than or equal to (n+1) qubits\n", "IBMQ.load_account()\n", "provider = IBMQ.get_provider(hub='ibm-q')\n", "backend = least_busy(provider.backends(filters=lambda x: x.configuration().n_qubits >= (n+1) and\n", " not x.configuration().simulator and x.status().operational==True))\n", "print(\"least busy backend: \", backend)" ] }, { "cell_type": "code", "execution_count": 49, "id": "7421f7ef", "metadata": { "tags": [ "uses-hardware" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":7: DeprecationWarning: Passing a Qobj to Backend.run is deprecated and will be removed in a future release. Please pass in circuits or pulse schedules instead.\n", " job = backend.run(qobj)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Job Status: job has successfully run\n" ] } ], "source": [ "# Run our circuit on the least busy backend. Monitor the execution of the job in the queue\n", "from qiskit.tools.monitor import job_monitor\n", "\n", "shots = 1024\n", "transpiled_dj_circuit = transpile(dj_circuit, backend, optimization_level=3)\n", "qobj = assemble(transpiled_dj_circuit, backend)\n", "job = backend.run(qobj)\n", "job_monitor(job, interval=2)" ] }, { "cell_type": "code", "execution_count": 50, "id": "746170e9", "metadata": { "tags": [ "uses-hardware" ] }, "outputs": [ { "data": { "image/png": "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CB599FF69erFBRdcQNeuXdmwYcNhf7xTcaxzc3NZtWoV69evp7y8nBkzZlSrFSZDIkN8JkyYwJo1axg/fny1oSVlZWUMGTKEPn36kJ+fT1ZWFtdee21Syy11Q0kzhFQ012RlZbFp06YDxkxUKs70AXbu3MmDDz7IoEGDWL16dVJrsXfeeSc5OTk0bdo06TXkxYsXc9ttt/Hiiy8mtePV3r17efTRR/nTn/7E97//fQoLC/nd736X9ON91113JaW80VLRGpGqY92qVSseffRRRowYQe/evXnjjTd44403klru3r17c/PNN3POOeewZs0a7rzzTsAP8amscVYO8VmzZg2LFi2iS5cuANx11118/fXXFBcXVy3t2rXjqKOOYvHixXzwwQesWLGChx9+mIyMjKQcE6lbSpohpKK55rjjjqNly5a8++67mBkTJ07kwgsvTGq5U3GmD3D33XczZswY7rvvPk444YSk1mIvuOACFixYwJ49e5JeQx49ejR33303AwYMqOp4FesJUE0qb7HlnCMnJ4dLLrmEd955J6nH+6c//SnNmjU74H7xSFVrRKqONfi/kXfeeYc9e/bw05/+lOuvvz6p5VbnPDkQJc0QUtFcA/DII49wzTXXkJuby4knnsi5555bb58xrOLiYv75z3+SlZXFCSecQOPGjZNaiz311FPZuHEjjRo1SmoNubLj1VVXXcXq1as555xzmD59ekwnQLXJyspi5cqVbN++HfDDjHr06BHmcB5U5fFO1b0uU9EakcpjDbB161YWLVrECSecwNSpU7n++uuTWu6Ddc5L157KUjc0I1BI8c7Ictddd9XarFZQUMDy5cuTW9AIyZroO9KCBQsoKipi2LBhfPPNN+zdu5fBgwczatQoFi5cWG3f2mpVldO41aakpKTaD2d2dnbCsSs7XlWeAF1//fVs27aNn//85zHdVaZTp05s376dPXv2MGPGDF577TV69uzJPffcw/jx4yktLWXw4ME888wzPPHEE0k73p06daK8vJytW7cyePBg5s6de8BjGFZNrRHpfqxvueUW3nrrLXbu3Mljjz1Gt27dklruyGORis550rApaR7CIpuVs7KymDx5Mi+88EK1fSrP9AcMGBDqTH/06NGMHj2aadOmMXXqVFasWMHcuXMb1JizoUOH8sILL/DAAw9Uu15V6UB3lam8Lhbt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\n", "text/plain": [ "
" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get the results of the computation\n", "results = job.result()\n", "answer = results.get_counts()\n", "\n", "plot_histogram(answer)" ] }, { "cell_type": "markdown", "id": "53b79d98", "metadata": {}, "source": [ "As we can see, the most likely result is `1111`. The other results are due to errors in the quantum computation. " ] }, { "cell_type": "markdown", "id": "c96cf855", "metadata": {}, "source": [ "## 7. References \n", "\n", "1. David Deutsch and Richard Jozsa (1992). \"Rapid solutions of problems by quantum computation\". Proceedings of the Royal Society of London A. 439: 553–558. [doi:10.1098/rspa.1992.0167](https://doi.org/10.1098%2Frspa.1992.0167).\n", "2. R. Cleve; A. Ekert; C. Macchiavello; M. Mosca (1998). \"Quantum algorithms revisited\". Proceedings of the Royal Society of London A. 454: 339–354. [doi:10.1098/rspa.1998.0164](https://doi.org/10.1098%2Frspa.1998.0164)." ] }, { "cell_type": "code", "execution_count": 22, "id": "c962db66", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'qiskit-terra': '0.16.1',\n", " 'qiskit-aer': '0.7.2',\n", " 'qiskit-ignis': '0.5.1',\n", " 'qiskit-ibmq-provider': '0.11.1',\n", " 'qiskit-aqua': '0.8.1',\n", " 'qiskit': '0.23.2'}" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import qiskit\n", "qiskit.__qiskit_version__" ] }, { "cell_type": "markdown", "id": "5754d2f4", "metadata": { "tags": [ "remove_cell" ] }, "source": [ "# Bernstein-Vazirani Algorithm" ] }, { "cell_type": "markdown", "id": "df94909f", "metadata": {}, "source": [ "In this section, we first introduce the Bernstein-Vazirani problem, its classical solution, and the quantum algorithm to solve it. We then implement the quantum algorithm using Qiskit and run it on both a simulator and a device.\n", "\n", "## Contents\n", "\n", "1. [The Bernstein-Vazirani Algorithm](#algorithm) \n", " 1.1 [Bernstein-Vazirani Problem](#bvproblem) \n", " 1.2 [The Classical Solution](#bclassical-solution) \n", " 1.3 [The Quantum Solution](#quantum-solution) \n", "2. [Example](#example)\n", "3. [Qiskit Implementation](#implementation) \n", " 3.1 [Simulation](#simulation) \n", " 3.2 [Device](#device) \n", "4. [Problems](#problems)\n", "5. [References](#references)" ] }, { "attachments": { "image.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAARcAAACbCAYAAABI1t/DAAARH0lEQVR4Ae2dW+jcxB7H+0ffBPVFFCtabX0QRIu+CL5YLy8V0eLBSxWxpR6pKFiroLYWRalX0B4vqCiKSFXqFevBf/XBg4jWAxZpQVA5XkDFW33w8uCxndPvHqbNZrLJZrKz+8vmEwi7O5lMZj6/ySeTbHYzxzFBAAIQSEBgToIyKRICEICAQy50AghAIAkB5JIEK4VCAALIhT4AAQgkIYBckmClUAhAALnQByAAgSQEkEsSrBQKAQggF/oABCCQhABySYKVQiEAAeRCH4AABJIQQC5JsFIoBCCAXOgDEIBAEgLIJQlWCoUABJALfQACEEhCALkkwUqhEIAAcqEPQAACSQgglyRYKRQCEEAu9AEIQCAJAeSSBCuFQgACyIU+AAEIJCGAXJJgpVAIQAC50AcgAIEkBJBLEqwUCgEIIBf6AAQgkIQAckmClUIhAAHkQh+AAASSEEAuSbBSKAQggFzoAxCAQBICyCUJVgqFAASQC30AAhBIQgC5JMFKoRCAAHKhD0AAAkkIIJckWCkUAhBALvQBCEAgCQHkkgQrhUIAAsiFPgABCCQhgFySYKVQCEAAudAHIACBJASQSxKsFAoBCCAX+gAEIJCEAHLZg/Wzzz7rzUkIRxS6fv16t2LFCrdmzZqk8/XXX++WLl0aUUNWgUA1gc7LZePGjW5mZsbp1cq0du1at2HDBvfhh/9OOm/ZssWdffbZVprdV4+tW7e6JUuWuJ9//rkvnQ/tIdBpuSxbtszNmTPHvfnmm6Yidu+997rZ2dnkdfrxxx/dJZdcknw7sRs477zz3MEHH+wkGqb2EeisXDRSkVhuv/12c1FDLvtCIsFoZIlg9jFpy7tOykVDbXXYgw46yGSckMu+sChWitO8efM4RdqHpRXvOimXhx9+2OyoRb0GufTvOxpdWh1l9teUT1kCnZTLiSeeaPJaiw8McvEk/v+qb/MkF11/YWoPgU7KRcNsddai6csvv3Tbt2+Pnrdt2+beeuut6PW17euuu8699tprRdUbaZou6C5evLhRXd977z2nuQmzHTt2VLZL8dLMt0eVqMxkKN7DzFQvTUV8Ry0q/bHHHnOrVq2KnleuXOnOPPPM6PW17VNPPdU9+eSTRdUbaZrksmDBgkZ1vfDCC53mJsx0v03VZH20WVX/Li5HLgajzmlRGBTkEjKxnoJcDEYIuYRBQS4hE+spyMVghJBLGBTkEjKxnoJcDEYIuYRBQS4hE+spyMVghJBLGJT58+f3vi3atGlTuJAUkwSQi8GwIJcwKP4bPos/1whrS4oIIBeD/QC5hEFBLiET6ynIxWCEkEsYlLlz53JaFGIxnYJcDIYHuYRB4YJuyMR6Siflst9++w28/d9CwJBLGAUu6IZMrKd0Ui7+/N1qcJBLGBlGLiET6ynIxWCEkEsYFOQSMrGeglwMRgi5hEFBLiET6ynIxWCEkEsYlEMPPbR3nWwcvxYPt05KDAHkEkMt8TrIJQTsr5NxE13IxmoKcjEYGeQSBoXTopCJ9RTkYjBCyCUMCnIJmVhPQS65CO3cudN999130fM333zjPv300+j1te1169a5zZs352o2+o/6Jzo9eKxJe/W3oJqblPH9999XNg65VCIylwG55EJyzz33uMsuuyx6vuCCC9xJJ50Uvb62rR1Jf7eZepJcjjjiiEZ1Peuss5zmJswuv/zyyqYil0pE5jIgF3Mh4dEiRSFBLkVUbKchF4PxaXLNRf+Or29Uhnn2tUYulh/nmg0NcsnSaMd75GIwTk3kctRRRzk950fP+Kl6BjZyMRj8KapS5+SiHU73TJx22mlmwxgrFz1PWXLRpNFL1TN+2iSXZcuW9eKmZzoxtYNA5+Sizim56JGuVqdYuahtenD7sFOb5KLTPMWtTvuG5UC+NAQ6Jxc9bdHqA+h9iGPlotFYnSN7m+QiNorbzMyMx8SrcQKdkosftej0wfJUVy66xuLbpiO73ledEqn9bZOLH71YHnVa7lfjrtvY5aIde/ny5W716tW9V33WrM+aU/12RB3S+umQD35dufj11L5hpOLzt00uqrfkqdFLnXb69vrXSfVBv/2uvI5dLh6sOsnChQv9x94F1qpvN/ZmrvlGRzwNqdWp2jDFyEXs6p7utVEuip/6zrx58xoJJluO7xM6rUzVB/02uvQ6MbkIsu5d8PdkpNzxVbZ2vGHu/bAQ/Bi5iKN41pnaKhe1Uad+o/jGT8xUlvpGyj5YJy7TkneictHQVkP5VKdC2SCp40zzaZG+qtVOUmdqq1z8Ke4oZDDOPlgnNtOQd+Jy0U6hUUWTc+hhAyGJSTDWRzAxIxcdgeu2q41y8TEchVjUb9Tv1AebXscZtg92Kd9E5eKPtOow2esvKQMgkenu1XHILLYdMXKRNPWtUZ2pbXLxN0D6flOnrYPySiya1Ad1HYdpdAQmIhftBIsWLeo70mqn18//U0/qTNZPj+rKRUdx8as7tU0uOigodqM4MKgM9bfsaE93N4+jD9aNU1vzj10u/p4MHX38/QrZtFEelYqC4o9+dS9+FpWVKm1Yuehoq/aIYwy3NsnFx03fFDWdsv1tEn2waf3bsv7Y5TJpMDpi6ein2eo0rFx0pNWRV9+axBzN2yQXyVMxk1CZ2kHA7h6WkN+0yMUfgfUaM7VJLhppKm4awTC1gwByycVp9+7dbteuXY3mv/76q9H6+je82dnZXM1G/1FyWbp0aaO6qq1N2yvmVRNyqSJkbzlyycVk7dq1bvHixdHzGWec4Y455pjo9bXtBQsWuEceeSRXs9F/lFwOOeSQRnU9+eSTe3/r2YTZOeecU9k45FKJyFwG5GIuJPzNZVFIkEsRFdtpyMVgfIa9oNu06lxzaUqQ9csIIJcyOhNahlxC8IxcQibWU5CLwQghlzAoyCVkYj0FuRiMEHIJg7L//vv3vop+4IEHwoWkmCSAXAyGBbmEQTnggAOQS4jFdApyMRge5BIGhdOikIn1FORiMELIJQwKcgmZWE/ppFz0C+KYXxGPK5jIJSSNXEIm1lM6KZdp+W1R087Vpvtcjj766N41l5deeqlps1l/TASQy5hA19kMI5eQFiOXkIn1FORiMELIJQzK/PnzeyOXTZs2hQtJMUkAuRgMC3IJg+JPZfk/l5CN1RTkYjAyyCUMCnIJmVhPQS4GI4RcwqDMnTuX06IQi+kU5GIwPMglDAoXdEMm1lOQi8EIIZcwKMglZGI9BbkYjBByCYOCXEIm1lOQSy5Cd955p7v44oujZz364oQTToheX9s+/vjj3aOPPpqr2eg/6ia6ww8/vFFd9eQBzU2YXXrppZWNQy6ViMxl6KRc9EgOfftQ9K/5v/76a+8xHXpUR8ysHfbrr7+OWtdv77bbbnNvvPHP5J1FdT3//L81quu3337rNPu6x7zu3Lmzsq3IpRKRuQydlIuOtJKL1cdUcFoU7id61KpiJnkxtYNAJ+Wip+ypo/rnBFsLFXLpj4iEonhZ/rFpf435JAKdlEuv4Xs668zMjMlegFz6w+IPBjGPrO0viU/jJNBZufhnD1vssMilfxcY5QPo+0vmU0oCnZWLoPojon8YeUrQdcpGLvto+WdEW70+tq+mvMsT6LRcBEOdVufylgSzevVqd8stt7iXX3556Pmpp55yD/7jwaHzq+ynn37anX766fk+YebzHXfc0bvWsnHjRjN1oiLDE+i8XIRKFwyLvpYeHuNoc0oU+vWvHuk67HzNNdc4PRZ12PzKp3/Sv/HGG0db+RGVtnXr1t79M5biMqKmdaYY5DIloX777bfdXXfdNSWtoRnTQAC5TEMU97QBuUxJIKeoGchlSoK5efNmt27duilpDc2YBgLIpeVRfPHFF93KlSvdcccd5w488MDe+8cff9z99NNPLW9ZN6uvi9cLFy7szcMS0PWp2dlZc3cvI5dhI2gs32+//eauvvpq9+yzz7rPP/9872nRL7/84rZs2dJb9tFHHxmrNdUZhoAEozuSqyZ9EaGv6vWNp77t1Leelv4GtLoFVS2MXC4wuv1eMATI4s1skU1LvprEsmLFCvf777/v3VbRNZdVq1a5HTt27M3Dm3YQ8Dd4VtU2v8/49fRqYZqYXPTjwSwEBDN8d7j22muDIXCRXFSi7pf54j9f6C1TSwh4SVRVVz9f0V98ZCeNePLSyS4f5/uJyEX3LuSHfTpv5Idp1aF//fXXeze/5XMOkou43nffffnsrfqs/qJhv04Xmt73oh1X5WjWpHI1ayQ9aNJy3djo82ldvfcHR1+m8hSVo3uKlF+z4lE0Pffcc3vrNaxcNOr37fBldl4ugqL/58hPAjMIfj5vVz/rprePP/44aP4guSjjueee63bt2hWs04YE7WjZX68vWrQoutraEX3/0n/6qFzJQBdQy472Epryah1/TUPr+WscXjIqX2VlJ33221S6RhqSjJ9UjkbxPo//nD/4+vxlr15KvqyyvONYNpGRiwI5SC4+UONofNE23nnnX+7555+Pnp955hmnP3tqUkbZukceeaTTHbz5PGvWrHEXXXRRkK58+me79evXFy7Ll1P384YNG5zmuutl87/wwgtFoeilqZ/4o7N2mvxpQHZFSUA7Z9Gk9OxOrXK9KFT+oPV8WX7H9Z/1qjKy4lMZWSloexJHdlIenc74EZjWz7epaFvZMga9l8iybRyUb1zp5uTiO9K4AOS3o8A+8cQT0bOCK3k2KaNs3cMOO8w99NBDQfnapjpp0brHHnusu/nmmwuXFeWvk6YdVL8BqrNOPq9kOWjSzqedUSMWnV6UTcqX3dmr8tY5wqtf5A+I+pwf8WTlUrRcdVIe38/1i+98GTFyWbJkiSmx9NpZFoBUywQzH6heZfZAF1imwQQkie3btwcZyk6L9P+2f/7532CdtiRI2BKndko/2iiqu3ZYPyIoWu7TJJWsBHx62euo5eLboXo0lYv4WBqxeI7mRi7IxYem+PWVV17p3duSXzpILtu2bXN33313PnsrPuto7I/wqrAfFTatvHbs7OlKdhuDyo6Ri4SYP+Xxp05+1KR65Edb2taw8isSixXRTEQuCmYenoeuV6ZyAldddZX7448/+jINksutt97qPvnkk768bfmgC6Z+J1SdtaMOMzIpal92tJw9XVF/G2ZnVJ/Nj7az5Wibvg/77etzvg0SW1Y4ap9OjbL9Xsvz+4cvM/uqdfXfwvqWys/Lly8fqj3ZclK9n4hc1BjBy3aUouClanTby/3hhx/clX+/sq8ZRXK56aab3Pvvv9+Xr00f1Ce042uH1JwVTd12qCyNEFSO+p12YL0fRizKo/xZmXhZaeSh5RptqHzl0avv29ltaXv5UyC1Q+3y9VEezdo/suUUtVfb1vbycxNORduJTZuYXHywZWzNAuQDEtuYLq2n3w5dccUV7tVXX3WSjZfLn3uurXzwwQfuhhtucO+++26XkNBWYwQmJhdxkEz80SM7LDTGyHR19G9yeqjYKaec4vQ1tY52999/v/vqq69M15vKTT+Bicpl+vGOr4V6MJlkvXv37vFtlC1BoIQAcimBwyIIQCCeAHKJZ8eaEIBACQHkUgKHRRCAQDwB5BLPjjUhAIESAsilBA6LIACBeALIJZ4da0IAAiUEkEsJHBZBAALxBJBLPDvWhAAESggglxI4LIIABOIJIJd4dqwJAQiUEEAuJXBYBAEIxBNALvHsWBMCECghgFxK4LAIAhCIJ4Bc4tmxJgQgUEIAuZTAYREEIBBPALnEs2NNCECghAByKYHDIghAIJ4Acolnx5oQgEAJAeRSAodFEIBAPAHkEs+ONSEAgRICyKUEDosgAIF4Asglnh1rQgACJQT+B0wQ4nx6Sx7vAAAAAElFTkSuQmCC" } }, "cell_type": "markdown", "id": "596622c8", "metadata": {}, "source": [ "## 1. The Bernstein-Vazirani Algorithm\n", "\n", "The Bernstein-Vazirani algorithm, first introduced in Reference [1], can be seen as an extension of the Deutsch-Josza algorithm we covered in the last section. It showed that there can be advantages in using a quantum computer as a computational tool for more complex problems than the Deutsch-Josza problem.\n", "\n", "### 1.1 The Bernstein-Vazirani Problem \n", "\n", "We are again given a black-box function $f$, which takes as input a string of bits ($x$), and returns either $0$ or $1$, that is:\n", "$$f(\\{x_0,x_1,x_2,...\\}) \\rightarrow 0 \\textrm{ or } 1 \\textrm{ where } x_n \\textrm{ is }0 \\textrm{ or } 1 $$ \n", "\n", "Instead of the function being balanced or constant as in the Deutsch-Josza problem, now the function is guaranteed to return the bitwise product of the input with some string, $s$. In other words, given an input $x$, $f(x) = s \\cdot x \\, \\text{(mod 2)}$. We are expected to find $s$. As a classical reversible circuit, the Bernstein-Vazirani oracle looks like this:\n", " \n", "![image.png](attachment:image.png)\n", "\n", "\n", "### 1.2 The Classical Solution \n", "\n", "Classically, the oracle returns:\n", "$$f_s(x) = s \\cdot x \\mod 2$$ \n", "given an input $x$. Thus, the hidden bit string $s$ can be revealed by querying the oracle with the sequence of inputs:\n", "\n", "|Input(x)|\n", "|:-----:|\n", "|100...0|\n", "|010...0|\n", "|001...0|\n", "|000...1|\n", "\n", "Where each query reveals a different bit of $s$ (the bit $s_i$). For example, with `x = 1000...0` one can obtain the least significant bit of $s$, with `x = 0100...0` we can find the next least significant, and so on. This means we would need to call the function $f_s(x)$, $n$ times. " ] }, { "attachments": { "image.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAACMCAYAAADGFpQvAAAZSElEQVR4Ae1dC6wVRZqGGRONxld24ysYjUh8BkFAjS9EeQQ1PpgFCQ9FjYkoPtEVUB5GZAgqkBEJyiYSF1SCCjHORBQ1kahxhsmKsshVsnsFxY2DiCu76oxSu1+PP7dP3+ru6qquOt33fJX06T7d9fjr+6u++uvv6u5uioEIEAEiUBMEutVETopJBIgAEVAkLDYCIkAEaoMACas2qqKgRIAIkLDYBogAEagNAiSs2qiKghIBIkDCYhsgAkSgNgiQsGqjKgpKBIgACYttgAgQgdogQMKqjaooKBEgAiQstgEiQARqgwAJqzaqoqBEgAiQsNgGiAARqA0CJKzaqIqCEgEiQMJiGyACRKA2CJCwaqMqCkoEiAAJi22ACBCB2iBAwqqNqigoESACJCy2ASJABGqDAAnLQVXr1q1TgwcPVpMmTfK2XX/99eqaa65xkJJJiyKwYcMGddFFF3nTKdrLjTfeqK644oqiorV8fBKWQxN488031a233qra2tq8ba+//roaP368g5RMWhSBP/7xTwoDhU+9rl+/Xo0cObKoaC0fn4Tl0ATeeecdNXPmTIcc8pNu3bpVTZw4MT8iY5SGwAcffKAmT55cWn66jL744gs1YcIE3aVSzj3xxBPq008/LSWvKmXScoT19ddfl6bIViKsm266SS1YsEAtXLjQ63bfP9+nnn322ab2ka5CWN27d286lmUrsqUI69VXX1VlKrGVCKt///5q9erV6uWXX/a6wbKZM2dO2e28UH5dgbBQYVhZ3bp1i/aFAKhw5JYhrIceeqh05ZkQFszytWvXNmyw8hCS599///1OTaUqU8JLL71U/fTTT53kK/vEc889p5YuXVp2toXyMyEs6DCpP5mCJc/r9Op7SigVvuqqq6J2r5NB4tRp3xKEhSkGRhqQVpnBlLBg2aF83HnCsRAWjqVBQUZdoyJhlakxs7xMCUssdhu9hiIskCja3vHHH29W+YrH6vKEBXLANPDQQw8tXRUmhIVCpdHofDNo7GeccUaqbCSsVGi8XTAhLBSOtgUy0OkVA9Fxxx2XKmMowoIAaGOQUzcgpgpY0QtdnrBkKli2dQV9mhKW+BJ0bQBkevfdd+suRedIWKnQeLtgSlhiuYvFHBfosMMOi5ZGxM/Fj0MSFtoXCCurncVlq/JxlycsWC++RhdTwsJoq7OiMOJBNkwt0gIJKw0Zf+dNCQtrtXRWVJZFLVKHJCwZMNEO6x66PGGBELDpwvfff6/27NljvWGl+wMPPKDLuuEcRlvd6CYNqSFy4g8aP1ZFu8i5a9cutXv3bqc8hg0bFsTpvmLFiuiulkt9d+7c6VTX9957T915550JTXT+C78QSCsZsiwviQvCGjdunJOcwMjkRggGRPQB3aAp8tRlr+/JdZHeQM4swrrnnnvU1Vdfbb1dcMEF6rLLLsuUQkZbjG4grfgGv1peI9q4caPq0aOHtYyoX79+/dTAgQOd8jjyyCONOkcmGAYXp0+frnr37u0ka8+ePdWVV15pncegQYMivLLEFf9Vml51llc8v/b2dnX00Udbyyjt9q233opnqz0mYWlhqebJLMJyldhkSphlReX5ryAfp4SuWiqe3mRKmGVF5fmvIFHIKSEJq3gbaFqKZhOWi/8KoJGwwjcdE8Jy8V+hRiQsO7229JTQDrKOVCYWlov/CiWRsDrwDnVkQlhp/iuxqHV3DuPyk7DiaJgfk7DMseoUM4+wxH+luwuYt/5KCiNhCRLh9nmEJf4rm/VXUgsSliBRbE/CKoZXQ+w0wkKDxiMmcN5iSnrDDTfsW7SHpQyLFy+OFrP26dMniteQaeIPCSsBSIC/WYQFvcLhndQrBifRK6xqxMuyskIS1qpVqyJ5cTOi7oGE5aDBNMJClrCqQE5oyDjGHkH+ozHjvM76iiL+8kPCiqMR5jiLsMrSa0jCwhs2QLA+nvYIo5GOUkhYHVgUPsoirMKZpSQgYaUA4/F0FmGVVWxIwgLJgrDyltCUVTef+ZCwHNAlYTmAl5K0Lm9rSBHf+DQJyxiqhogkrAY4iv0hYRXDyyQ2CcsEpWJxaGEVw6upsWEKY/MRVq5cGTnWlyxZonxtM2bMUBdeeKEP8Qvl2Urvw8J79M855xxvOkVbmT17thowYEAhHdhGptPdFrkmpPNJWPPmzVOHHHKIwiM6vjY8pnLEEUc0AbnGIluJsJYtW6YOOuggbzpFW+nbt28wJzgtrMa2XOl/PgmLU8LyVc8pYfmYkrDKx9RbjiSscqBtJQuLdwnLaTM+cvHj3PEhqWWeJCxL4BLJSFgJQBz/8i6hHYAkLDvcolScEjqAl5KUU8IUYBxOc0roAF7opM22sNBY8A4sPIaD5wdxLKvecYy3OeAanv7Hg7PJwIWjSUT8/zeZEkKHSb3KO9NN9BrSwoJc0sb8o+e3hC5vYeH2NDYfoYiFBeLUERKIKuuRCRKWD81l52lCWJID3mmm+14ASAs6TwshCYsWVpoWKni+2RYWIJEGI5ZVHCa8pgRWVlogYaUh4++8KWHBckH7EssqLhEeg4FFnRZIWGnIZJ9PHwKy09XmahUIC6OtzoqS15ToLC8BmIQlSITbmxKWfJFJJxnanc7ykrgkLEGi2J6EVQyvhtimU0KMtjorKsvykoJIWIJEuL0pYcGC0llRoled5SW1IGEJEsX2LU1YeLRm0aJF1ttdd92lrrvuulzEMdrC6Tl58uSGDed0llc8w82bN6tzzz3XWkbUDx/bmDVrllMep556apCPUMyfP1+NHj3aSVZ8Zejx3z1unceUKVPUiBEj4mrQHsN/laZX6DwrbNu2TfXv399aRmm3bW1tWcVE14RA+baGXKiaHyFrSogvjqxZs8Z6mzt3rrr55pszKymNxcZ/hYy3bNmihg4dai0j6ocXy+FxE5e64ss7Jp+UygTD4CKmx7fccouTrHPmzFGrV6+2zmPBggVq7NixmdK6+K+Q8fbt2yPrzEUnSIt88oK0QRKWBildx9RE23eqaPx9CQ0PsgjLMIvUaCZTQhf/FQrmlDAVfm8XTKaELv4rCN4KU8KsN67aKi/bbrXItSiL63wAFsWmJmk2YaX5r+QzUXmETcJKVa23CyaE5eK/guB1JCwMvkWCj74dhLAwGqGDwtxPvrgf65CynJNFANLFbTZhoXzdXcC89VdSl65AWGjo2ODDywt1Weluu/5K6h+SsDAooh1CZpdQlLB89G3vhAWh4ySFu2Xx/wATcXwE8TMUtfpMZcmbEqKeaCjwISRD3voriV93wgIG0HnWFErqin0dCEt8Qml6NWlvIQkLuOJL1GiLeRY94qaFOGHtVd+oF5/+bdR3r756gnrxrfZOyXz0ba+EJcwerwmUjK+KxIOJguPxTY9h2UBJvggxjbAwd4c5LJYFjqVxSwfGNcilW+4Qr1/dCQt1B1kBE5POUnXCgr6gN+gPdRPrGfoVnYtes3w4oQmrjL4ghAWymnzRQVHfQv+S7b6n/hxvutFx2X3bK2EBJJ3ASaZHvLjV1anWlifQgJJlWWalTZZGWNrIlifrTlgYnISsTSCoOmGZ1MEkTmjCgkzoi5gWZhFpluxCWP+1aUXUr8ZMeUb95X/+V2396AV1crfuav9f3ai++bkxh7L7tlfCQgXTCCveiMUiaayq2z+x7vIsGJdSSFjp6GE6vnbt2qhhY2/qpyRhpWPqegX9DAM4vqtoE5KEtfzdb/dl884zt6oTz364E2GV3bcrQVioNYjFlvn3oRY7wII+zNvLzDOWfXRIwkoi0vEfBIWpIBbGYnAiYXVgg6NmWFgoF/0B/cKGtJKE1b1bD/XA75arjZ/8BVmnhjL7dmUIC40aDbyMAGX4JivIScLK1hYaOKblRQItrCJo2cXF7ANTQ9NBREoRwoIP6+Fr/iGy1sR/9evu/dWKP/ynRG3Yl9m3K0NYAK8M5zhID9NQn5aVaGP69Olqv/32U7169fK2HXPMMerAAw+UIpu2t3njKEZWaeSmgleBsOST8z712qNHD7X//vubwlJaPPQzkBV8S0VDUpfbN61Xjz98m/rHX3XfR17vfvZTp2xBkGW5ZrwSFkBJ3hEEkegc4SArk7tIndBInIBCYF2ZrPlJJC38F76ZcePGqbffftvbhpsRNuZ74crkJLAhLCzdiPsqc4qILleBsN59993oWUKfen3ppZfU8OHDTSApLY6Qle1MRgir7U//qmY+tFTt2dsh2qvLxkf9es2//XfHyV+OUF7RdtApk19OeCUscXzHrR10QBBKMuic88k4pv+lXN8dnVPCbI3oBqbsFPVYh5VXB5ProX1Y6IMwHnR9z0RexBHCWvfklRE5vbnlb/uStr0+Ozr34nsdjni5WGbf9kpYUsk4ow8aNKgT24LEbExUAUS3R37oMD6WS0h5JCxBovMeoznwLxqqYGGZPJpTtF7J+KEJC2QDfbj0MyEsWdYAp/uif3lRLX7s9ijv/bqfp7Z+17iuAe1A0iUxsPlfvEXllKJjU5AGSAsbKpAMZd5FiOeNO1Qu607ieemOSVg6VP5+Dh2jqMMdKUlY6Zi6XIF1BcKKz3aK5tdBPN+rFb+9LMoPecq2/M32Tlmib5fh6pGMgxCWFKbbozJlOeSS+cMv5jqqJPOM/zchLNQPvq74Jo0mfg7HOjKv68JRYB+3rOO4ZR3XhbCgw6T+pGMmz+v0GtLCQvnoBy7TQeisg7D+rsFvvvh3tfnT7eo/Pvro/xeQxhxavygYGJXdt5tOWGjUZTnkfsFp3w75QlE2I/2+TDIOTAkrLgeOhbBwDIVCRlihuoZdJ8JCh4WjXfZSzwwIO12qE2FBf7Dg0b6K6jUkYUE2tDHd7KeTAjJOJAkrI2p0CVa2yxRUl3/TCcsVRF2l5JyMLGhUPoIJYaFcdGA0GDScZEBjz8KgToQFvFEXF59kXQgLegQhy2CT1CsGoiyLphUIy4ehUDph6TplUpnx/z6d4igHDQqbj2BKWBhl0mQAmWaNXHUiLGAMctZZiqb414mw0HahV50lCZ9R1rrCOhJW0b5dtnWFNuSnJ5u2zgDxqkBYGG11VpRYgFkNoW6E5arSOhEWCElnRYlFnTUY15GwXHVbRvqWJqxvv/1W7dq1y3oD0UybNi1XDxhtdVYU/HdplpdkisaPjuEi544dO9RXX33llMeQIUOCvNN9+fLlauHChU6y4j3nLnitX79e3XHHHaKC1D38dTorSixqneUlmYGwxowZ4yQn6vjjjz9Klql7tFO0M92gmZqoohdamrCmTp0afaEFX2mx2S6++GJ1+eWXZ6pWRltYWSCt+IZlF3mNaOPGjdEobiOfpMFXd0A48t9mf9RRRwUhrBkzZqgzzzzTSdaTTz5ZjRo1yjoPfPQjz/8i/qs0veosr3hDaW9vV3g8x0YX8TRYjZ8XSFh5CFXoerOnhDLa6iDJ818hDaeEOuT8njNZOOriv4L0nBLa6bClLSw7yDpSmTjdXfxXKImE1YF3qCMTwnLxX6EeJCw7bZKw7HCLUpkQlov/CoWQsBwUZJnUhLBc/FcQKyRhbdiwIXqAHh/UrXsgYTloMI+wxH+luwuYt/5KxCJhCRLh9nmEJf4r3V1AWNR5/ivUJCRh0YcVru04l9QMHxYa9OzZsxUe9Eb5eGuEkBYaOV59A/8VRmnEywokrCx0/FzLIqykXoW0sERF9AqrGsd5dwknTJjgpwKJXElYCUCq/LcZhAU8YF3FgzTe5Pnk/3gaHJOwkoj4/59FWEl9yX/Zi3TJ/3Je9rSwBIlie04Ji+HVEDtvStgQ2fIPCcsSOIdkWYTlkG1DUhJWAxzGf0hYxlB1jkjC6oyJ65k6rXR3qWtIwlq1alXkmujZs6eLyJVIS8JyUAMJywG8lKQkrBRgHE7Th+UAXuikPn1Yzz//vDr//PPVY4895m279957FVaqNzvYvNPdRuYqEBbeZ9WvXz9vOkV7uf/++1Xfvn1tICqchoRVGLLmJfBJWPPmzVOHH364uuSSS7xteEwFj8U0O7QSYT3zzDPq4IMP9qZTtJezzjorajsh9ErCCoFySWX4JCxOCUtSUiybKlhYdLrHFFKxQ/qwHBRCwnIALyUpCSsFGIfT8lYQfEOz7oGE5aBBEpYDeClJSVgpwDic5pTQAbzQSTklLAfxVvJhcUpYTpvxkQstLAdUTSwsjG54B1afPn2idyzhWFZB4xjPnuEanv7XvVKWC0cdFGSZ1ISwoMOkXuXV0JiC5ek15DosWliWDaEZyapiYUEOHSGBqPAiv7RAwkpDxt95E8KS0qFXEFQygMxwLS2QsNKQyT6fjmh2utpcrQJhyQgnllUcPDwAjdE4LZCw0pDxd96UsOSd/GJZxSXCm2Sz3lpKwoqjZX5MwjLHqlNMkykhEmG01VlR8poSneUlhZGwBIlwe1PCkrtvOsnSLC+JS8ISJIrtSVjF8GqIbUpYGG11VpS8ZldneUlBJCxBItzelLBgQemsKLGodZaX1IKEJUgU27c0Ya1YsULNnz/fervtttvU+PHjcxHHaAvHOt6RFN9wTmd5xTPctGmTOvvss61lRP1uv/326FEQl7qecsopQT5C8eijj6qRI0c61Rc6weMvtvWFjnQDTFwvOMY7zdL0muW/Qtpt27ZFH9uwlVHSffzxx8guM8jAqPvCT2bCCl5sacKChfT73//BekPnmjhxYqZaZbTVWVF5/itkvGXLFjV8+HBrGVG/pUuXRl9jdqlr//79gxDW4sWLFQYCF1lBVq+88op1HosWLcodiFz8V9ArPkWGR3Rc6om0sNTygtwA0N0cyEtbtetdnrDwulqMdjrCcFWGyZTQxX8F+TgldNVS8fQmU0IX/xUkCjklxMDoqw8UR9ctRZcnLJj2UFaWY9sWQhPCcvFfQS4Slq127NOZEJaL/wqShSIssQR1vjZ7hJqXsssTFiwrEJYPhZkQVhpZ5q2/kiZBwhIkwu1NCAv+K90US6ZfedKGIiz42NAG5RXdeXJV/XqXJywoQKws+JPKDHmEJc5OXbkw001IlIRVpsbM8sojLPFLpuk172vekCIEYeHjJyCrrLuVZohUJ1ZLEBbghi8LJFHmSJNGWCgDI218k8YNEoufx3FWIGFloePnWhZhJXUHfSLo9JrV1nwTFix4tHkfvls/qJvl2jKEhcYDiwakVdaIk0ZYZtCbxaoKYQ0bNkzt3r1b7dmzx+u2bNkytWTJEjNwPMXKIqyyivRNWGW18bLqW1Y+LUNYAhhGQrF25JztvpUIq1evXtHUGtMM0+3EE0+MBgnT+IiHNWdTpkyxVUkp6boCYZUCRAUzaTnCKlMHrURYNrhNmzatNGvWpnzbNCQsW+T8pyuFsDBPlrm8rci6Oy62eYVKR8LKRpqElY6P7ylhesn1vlIKYWGKlec8zoMJhOVKenlllH39hRdeUKeffrrCJ8d9bTJNKlt2n/l98sknCo899ejRQ1177bXqtddeU3v37vVZZKl5v/HGG+qkk07yplO0lVGjRqnevXuXKncrZFYZwoJT3OT5rSop5YcfflCfffaZ+vzzz71teITjyy+/rFK1M2V58MEH1fTp09XKlSvV0KFD1dy5c6NtzJgxas2aNZlpq3Lxr3/9m2pvb/emU7QX6HXHjh1VqXJt5KgMYQEx3MXLuhVcG1RbUFB0cliDGzZs2Ff75JTwqaeeUvjmHwMRsEWgUoSFKaGPR2hswWE6cwSw7ue7775rSJAkLFzEWwbwAVoGImCDQKUICxUwWSVsU1Gm8YfAk08+GU0BkyXoCAtxRo8erXbu3JmMzv9EIBeByhEWRuqutjo3Vws1jgBn+m9+808KU8JkSCMsfMrr6aefTkbnfyKQi0DlCAsrdEFaDPVA4MMPP9Q+BAzp0wirra1NzZgxox4VpJSVQsALYcFxPmjQoOhtjHhaPG1LIyaTh4LLQHHSpEkKj5yE3E444QQ1cODAoGWedtppasCAAV7KxGr2Aw44QJv3scceqy33vPPOix7K9YU7llMMGTJEK5OvMvEkAOrlK/+0fNetW1dGV6hNHl4Iy6X2dVze4FLfuqe1sbCwTosWVt013xz5K0dYuEtYtwWkzVFdNUqFD2vEiBGFfVh4yJmBCBRFoHKEFWo6WBQoxk9HgHcJ07HhlXIRqBRh0eFernJD5sZ1WCHRbt2yKkVYXNJQ34aIZQ2YGnKle311WAfJK0VYXDRahyaTLeOsWbPUzJkzo4Wk+DzZI488oubNm6fGjh1bm2cJs2vIq81EoDKExcdymtkMyi178+bN0dsaBg8erKZOnRo9P/jzzz+XWwhza0kEKkNYeFMDH3xuyTbIShMBYwRKISzj0hiRCBABIuCAAAnLATwmJQJEICwCJKyweLM0IkAEHBAgYTmAx6REgAiERYCEFRZvlkYEiIADAiQsB/CYlAgQgbAIkLDC4s3SiAARcECAhOUAHpMSASIQFgESVli8WRoRIAIOCJCwHMBjUiJABMIiQMIKizdLIwJEwAEBEpYDeExKBIhAWARIWGHxZmlEgAg4IEDCcgCPSYkAEQiLAAkrLN4sjQgQAQcESFgO4DEpESACYREgYYXFm6URASLggAAJywE8JiUCRCAsAiSssHizNCJABBwQ+D89fPQ9pfQiqwAAAABJRU5ErkJggg==" } }, "cell_type": "markdown", "id": "cd80774f", "metadata": {}, "source": [ "### 1.3 The Quantum Solution \n", "\n", "Using a quantum computer, we can solve this problem with 100% confidence after only one call to the function $f(x)$. The quantum Bernstein-Vazirani algorithm to find the hidden bit string is very simple: \n", "\n", "1. Initialise the inputs qubits to the $|0\\rangle^{\\otimes n}$ state, and output qubit to $|{-}\\rangle$.\n", "2. Apply Hadamard gates to the input register\n", "3. Query the oracle\n", "4. Apply Hadamard gates to the input register\n", "5. Measure\n", "\n", "![image.png](attachment:image.png)\n", "\n", "To explain the algorithm, let’s look more closely at what happens when we apply a H-gate to each qubit. If we have an $n$-qubit state, $|a\\rangle$, and apply the H-gates, we will see the transformation:\n", "\n", "$$\n", "|a\\rangle \\xrightarrow{H^{\\otimes n}} \\frac{1}{\\sqrt{2^n}} \\sum_{x\\in \\{0,1\\}^n} (-1)^{a\\cdot x}|x\\rangle.\n", "$$\n", "\n", "\n", "\n", "\n", "\n", "In particular, when we start with a quantum register $|00\\dots 0\\rangle$ and apply $n$ Hadamard gates to it, we have the familiar quantum superposition:\n", "\n", "$$\n", "|00\\dots 0\\rangle \\xrightarrow{H^{\\otimes n}} \\frac{1}{\\sqrt{2^n}} \\sum_{x\\in \\{0,1\\}^n} |x\\rangle\n", "$$\n", "\n", "In this case, the phase term $(-1)^{a\\cdot x}$ disappears, since $a=0$, and thus $(-1)^{a\\cdot x} = 1$. \n", "\n", "The classical oracle $f_s$ returns $1$ for any input $x$ such that $s \\cdot x\\mod 2 = 1$, and returns $0$ otherwise. If we use the same phase kickback trick from the Deutsch-Joza algorithm and act on a qubit in the state $|{-}\\rangle$, we get the following transformation:\n", "\n", "$$\n", "|x \\rangle \\xrightarrow{f_s} (-1)^{s\\cdot x} |x \\rangle \n", "$$\n", "\n", "The algorithm to reveal the hidden bit string follows naturally by querying the quantum oracle $f_s$ with the quantum superposition obtained from the Hadamard transformation of $|00\\dots 0\\rangle$. Namely,\n", "\n", "$$\n", "|00\\dots 0\\rangle \\xrightarrow{H^{\\otimes n}} \\frac{1}{\\sqrt{2^n}} \\sum_{x\\in \\{0,1\\}^n} |x\\rangle \\xrightarrow{f_a} \\frac{1}{\\sqrt{2^n}} \\sum_{x\\in \\{0,1\\}^n} (-1)^{a\\cdot x}|x\\rangle\n", "$$\n", "\n", "Because the inverse of the $n$ Hadamard gates is again the $n$ Hadamard gates, we can obtain $a$ by\n", "\n", "$$\n", "\\frac{1}{\\sqrt{2^n}} \\sum_{x\\in \\{0,1\\}^n} (-1)^{a\\cdot x}|x\\rangle \\xrightarrow{H^{\\otimes n}} |a\\rangle\n", "$$" ] }, { "cell_type": "markdown", "id": "80617e45", "metadata": {}, "source": [ "## 2. Example \n", "\n", "Let's go through a specific example for $n=2$ qubits and a secret string $s=11$. Note that we are following the formulation in Reference [2] that generates a circuit for the Bernstein-Vazirani quantum oracle using only one register. \n", "\n", "
    \n", "
  1. The register of two qubits is initialized to zero:\n", " \n", "\n", "$$\\lvert \\psi_0 \\rangle = \\lvert 0 0 \\rangle$$\n", "\n", " \n", "
  2. \n", "\n", "
  3. Apply a Hadamard gate to both qubits:\n", " \n", "\n", "$$\\lvert \\psi_1 \\rangle = \\frac{1}{2} \\left( \\lvert 0 0 \\rangle + \\lvert 0 1 \\rangle + \\lvert 1 0 \\rangle + \\lvert 1 1 \\rangle \\right) $$\n", "\n", " \n", "
  4. \n", "\n", "
  5. For the string $s=11$, the quantum oracle performs the operation:\n", "$$\n", "|x \\rangle \\xrightarrow{f_s} (-1)^{x\\cdot 11} |x \\rangle. \n", "$$\n", "\n", "$$\\lvert \\psi_2 \\rangle = \\frac{1}{2} \\left( (-1)^{00\\cdot 11}|00\\rangle + (-1)^{01\\cdot 11}|01\\rangle + (-1)^{10\\cdot 11}|10\\rangle + (-1)^{11\\cdot 11}|11\\rangle \\right)$$\n", "\n", "$$\\lvert \\psi_2 \\rangle = \\frac{1}{2} \\left( \\lvert 0 0 \\rangle - \\lvert 0 1 \\rangle - \\lvert 1 0 \\rangle + \\lvert 1 1 \\rangle \\right)$$\n", "\n", " \n", "
  6. \n", "\n", "
  7. Apply a Hadamard gate to both qubits:\n", " \n", "\n", "$$\\lvert \\psi_3 \\rangle = \\lvert 1 1 \\rangle$$\n", "\n", " \n", "
  8. \n", "\n", "
  9. Measure to find the secret string $s=11$\n", "
  10. \n", "\n", "\n", "
\n", "\n", "Use the widget `bv_widget` below. Press the buttons to apply the different steps, and try to follow the algorithm through. You can change the number of input qubits and the value of the secret string through the first two positional arguments." ] }, { "cell_type": "code", "execution_count": 51, "id": "e533167a", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9fd7104582f04ceb93f1a0137d1c5511", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(Button(description='H⊗ⁿ', style=ButtonStyle()), Button(description='Oracle', style=ButtonStyle(…" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2611176ac64244a198f4d6791fcaeae4", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HTMLMath(value='$$ |00\\\\rangle = |00\\\\rangle $$')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6d9df333faa24381a7d2e2dc5e67af7a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Image(value=b'\\x89PNG\\r\\n\\x1a\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x00\\xce\\x00\\x00\\x00\\xcc\\x08\\x06\\x00\\x00\\x00;\\xd7\\x9c…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from qiskit_textbook.widgets import bv_widget\n", "bv_widget(2, \"11\")" ] }, { "cell_type": "markdown", "id": "e137bf5c", "metadata": {}, "source": [ "## 3. Qiskit Implementation \n", "\n", "We'll now walk through the Bernstein-Vazirani algorithm implementation in Qiskit for a three bit function with $s=011$." ] }, { "cell_type": "code", "execution_count": 52, "id": "5ad0d9cf", "metadata": {}, "outputs": [], "source": [ "# initialization\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "# importing Qiskit\n", "from qiskit import IBMQ, Aer\n", "from qiskit.providers.ibmq import least_busy\n", "from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister, transpile, assemble\n", "\n", "# import basic plot tools\n", "from qiskit.visualization import plot_histogram" ] }, { "cell_type": "markdown", "id": "113296bf", "metadata": {}, "source": [ "We first set the number of qubits used in the experiment, and the hidden bit string $s$ to be found by the algorithm. The hidden bit string $s$ determines the circuit for the quantum oracle. " ] }, { "cell_type": "code", "execution_count": 53, "id": "59b40181", "metadata": {}, "outputs": [], "source": [ "n = 3 # number of qubits used to represent s\n", "s = '011' # the hidden binary string" ] }, { "cell_type": "markdown", "id": "cca16d68", "metadata": {}, "source": [ "We then use Qiskit to program the Bernstein-Vazirani algorithm." ] }, { "cell_type": "code", "execution_count": 54, "id": "d205efdf", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# We need a circuit with n qubits, plus one auxiliary qubit\n", "# Also need n classical bits to write the output to\n", "bv_circuit = QuantumCircuit(n+1, n)\n", "\n", "# put auxiliary in state |->\n", "bv_circuit.h(n)\n", "bv_circuit.z(n)\n", "\n", "# Apply Hadamard gates before querying the oracle\n", "for i in range(n):\n", " bv_circuit.h(i)\n", " \n", "# Apply barrier \n", "bv_circuit.barrier()\n", "\n", "# Apply the inner-product oracle\n", "s = s[::-1] # reverse s to fit qiskit's qubit ordering\n", "for q in range(n):\n", " if s[q] == '0':\n", " bv_circuit.i(q)\n", " else:\n", " bv_circuit.cx(q, n)\n", " \n", "# Apply barrier \n", "bv_circuit.barrier()\n", "\n", "#Apply Hadamard gates after querying the oracle\n", "for i in range(n):\n", " bv_circuit.h(i)\n", "\n", "# Measurement\n", "for i in range(n):\n", " bv_circuit.measure(i, i)\n", "\n", "bv_circuit.draw()" ] }, { "cell_type": "markdown", "id": "1aee1272", "metadata": {}, "source": [ "### 3a. Experiment with Simulators \n", "\n", "We can run the above circuit on the simulator. " ] }, { "cell_type": "code", "execution_count": 55, "id": "68aecbf5", "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFCCAYAAACTo4YQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAaJ0lEQVR4nO3df9jVdZ3n8edbGSwDS3BE4NYMcXUGMq1jo3ar1BXLiLtW2o65GctastommVezU1fphKPWVuPoNsO0Mrsp1uw42kxtGypORXQpYje0lNoCuyobeAMyUlQqqPPeP74HOnt7//gcONz3gfN8XNe5OOfz+Xw/9/v7h76u76/PNzITSZI0tENGugBJkg4UhqYkSYUMTUmSChmakiQVMjQlSSo0aqQLGElHHXVUHn/88SNdhiSpjaxatWpbZv52f30dHZrHH388PT09I12GJKmNRMSGgfo8PStJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUDkKXXXYZRx99NNOnT++3PzOZP38+U6dO5ZRTTmH16tV7+u644w5OPPFETjzxRO6444497atWreKNb3wjU6dOZf78+WTmft8Pqd0YmtJBaO7cudx3330D9t97772sX7+e9evXc9ttt3HllVcC8Oyzz7JgwQJWrlzJI488woIFC9i+fTsAV155JYsWLdqz3WDzSwcrQ1M6CJ1zzjmMGzduwP5vfvObzJkzh4jgjDPO4Oc//zm9vb3cf//9zJw5k3HjxnHkkUcyc+ZM7rvvPnp7e9mxYwdnnHEGEcGcOXP4xje+MXw7JLUJQ1PqQJs2beLYY4/d87urq4tNmzYN2t7V1fWKdqnTGJqSJBUyNKUONHnyZH72s5/t+b1x40YmT548aPvGjRtf0S51GkNT6kAXXHABixcvJjN5+OGHee1rX8vEiROZNWsWS5cuZfv27Wzfvp2lS5cya9YsJk6cyBFHHMHDDz9MZrJ48WLe9a53jfRuSMNu1EgXIKn1LrnkEpYtW8a2bdvo6upiwYIFvPjiiwBcccUVzJ49myVLljB16lQOP/xwvvKVrwAwbtw4rr32Wk4//XQArrvuuj03FC1cuJC5c+fy/PPPc95553HeeeeNzM5JIyg6+VmrWq2WPT09I12GJKmNRMSqzKz11+fpWUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhYY1NCPinIj47xGxKSIyIuYWbPPGiPh+RDxf3+66iIg+Yy6KiMcjYmf93/fst52QJHWs4T7SHAM8CnwUeH6owRFxBPAAsAU4vb7dHwLXNIw5E7gL+Bpwav3fuyPi91pcuySpww3r2rOZuQRYAhARtxds8n7gcODfZObzwKMRcTJwTUTcnNUagFcD38vMG+vb3BgRb6+3X9LaPZAkdbJ2v6Z5JvCDemDudj8wCTi+YczSPtvdD5y136uTJHWUdn/LyTHAxj5tWxr6nqz/u6WfMcf0N2FEzAPmAUyaNIlly5YBMGXKFMaOHcuaNWsAGD9+PNOmTWP58uUAjBo1iu7ublavXs2OHTsAqNVqbNmyhc9964R92UdJUgtcf3Eva9euBap3xnZ1dbFy5UoAxowZQ61WY8WKFezcuROA7u5u1q1bx9atWwGYPn36nr6BjNhbTiLiV8BHMvP2QcYsBTZm5mUNbccBG4CzMnNFROwCPpSZixvGzAEWZeZhg9XQqrecXH7LPk8hSdpHi65uzTwH8ltONgMT+rRNaOgbbMxmJElqoXYPzRXA2RHxqoa2mcDTwFMNY2b22W4m8NB+r06S1FGG+znNMRFxakScWv/bx9V/H1fv/2xEfKdhk78GngNuj4jpEXEh8Alg952zALcC74iIT0TEyRHxSeDtwC3DtFuSpA4x3EeaNeBH9c+rgQX179fX+ycCe+6qycxfUB01TgJ6gL8A/hS4uWHMQ8D7gLnAj4E5wMWZuXL/7ookqdMM93Oay4AYpH9uP20/Ac4ZYt57gHv2sTxJkgbV7tc0JUlqG4amJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBVqKjQj4pCIOKTh9zER8aGIeFvrS5Mkqb00e6T5beAqgIgYA/QAXwCWRcScFtcmSVJbaTY0a8B3698vBHYARwOXAx8vmSAiPhwRT0bECxGxKiLOHmTs7RGR/Xx+3TBmxgBjTm5y3yRJGlSzoTkG+Hn9+z8H/j4zX6QK0hOG2jgiLgZuBW4CTgMeAu6NiOMG2OSjwMQ+nyeAv+1n7LQ+49YX7ZEkSYWaDc3/C7wtIl4DzAIeqLePA54r2P4a4PbMXJSZP83Mq4Be4Mr+BmfmLzJz8+4PVTBPARb1M3xr49jMfLnJfZMkaVCjmhx/M3An8CtgA7C83n4O8JPBNoyI0cBbgC/26VoKnFX49y8HHsvMh/rp64mIw4DHgRsy83sD1DEPmAcwadIkli1bBsCUKVMYO3Ysa9asAWD8+PFMmzaN5curXRw1ahTd3d2sXr2aHTt2AFCr1diyZQsFB9mSpP2st7eXtWvXAjB58mS6urpYuXIlAGPGjKFWq7FixQp27twJQHd3N+vWrWPr1q0ATJ8+fU/fQCIzmyoqImrAscADmfmretv5wM8z88FBtpsEbALOzczlDe3XAe/PzJOG+LuvpToq/WRm3trQfhLwduCHwGjgA8AV9b/zg8HmrNVq2dPTM9iQIpffss9TSJL20aKrWzNPRKzKzFp/fc0eaZKZPVR3zTa2fXsva2vGpVSnk+/s87fXAmsbmlZExPHAHwKDhqYkSc1oenGD+t2vj0XEcxExpd72RxHxB0Nsug14GZjQp30CsLngT18OfD0zny0YuxI4sWCcJEnFml3c4Grg08BtQDR0PQ18ZLBtM3MXsAqY2adrJtVdtIP93bcCb6L/G4D6cyrVqVxJklqm2dOzVwCXZ+a3I+KGhvbVVI98DOVm4M6IeAR4sD7fJODLABGxGCAz+y6UMA9Yn5nL+k5YD/KngMeormleCrwbuKhwnyRJKtJsaL4eeLSf9heBVw+1cWbeFRHjqY5WJ9bnmp2ZG+pDXvG8ZkSMBd4HXD/AtKOpViXqAp6nCs/zM3PJUPVIktSMZkPzCeDNVI+bNJpN9ajHkDJzIbBwgL4Z/bT9kmpRhYHm+zzw+ZK/LUnSvmg2NL8I/HlEHE51TfPMiPgA8B+Ay1pdnCRJ7aSp0MzMr0TEKKpl8A6nevzjaWB+Zt61H+qTJKlt7M1zmouARRFxFHBIZm5tfVmSJLWfpkNzt8zc1spCJElqd0OGZkT8mGpJuu0R8RNgwHX3MvOUVhYnSVI7KTnS/Dqws+F7c4vVSpJ0kBgyNDNzQcP3z+zXaiRJamPNLqP33Yh4XT/tR0TEd1tWlSRJbajZBdtnUK3A09ergLP3uRpJktpY0d2zEfHmhp+nRETjm0YOBWZRvStTkqSDVukjJz1UNwAlsLSf/ueBq1pVlCRJ7ag0NN9AtWzeE8BbgWca+nYBWzPz5RbXJklSWykKzYa3kDT90mpJkg4WJYsbXAh8KzNfrH8fUGb+XcsqkySpzZQcad4DHANsrX8fSFLdFCRJ0kGpZHGDQ/r7LklSpzEEJUkqVHpNs4jXNCVJB7PSa5olvKYpSTqoNXVNU5KkTmYgSpJUyOc0JUkq5HOakiQV8jlNSZIKGYKSJBVqOjQj4s0RsTgieuqfO/u8b1OSpINSU6EZEe8HfghMBJbUPxOARyLi0taXJ0lS+yh9n+ZuNwLXZuZNjY0R8UngBuCrrSpMkqR20+zp2d8G/raf9ruBo/e9HEmS2lezofk9YEY/7TOA7+9rMZIktbNmF2y/F/hsRNSAh+ttZwAXAp9peXWSJLWRvV2wfV790+hLwMJ9rkiSpDblgu2SJBUyECVJKtTsIydExJHAecBxwOjGvsy8vkV1SZLUdpoKzYg4A/g2sJPq8ZNNVAsd7ASeAgxNSdJBq9nTs18AvgZMBl4A3kF1xNkD/MfWliZJUntpNjRPAf48MxN4GTgsM7cAf4SPnEiSDnLNhuauhu9bgNfXv/8KmNSSiiRJalPN3gi0GjgdWAcsA26IiAnApcCPW1uaJEntpdkjzU8BT9e/fxp4hmpRgyN55WIHkiQdVJo60szMnobvz1A9eiJJUkdo+jlNgIg4Afid+s/HM/OJ1pUkSVJ7avY5zfHAfwEuAP7pN83xP4DLMvMfW1yfJElto9lrmn8FTAXOBl5V/5wDvAFY1NrSJElqL82G5izg8sx8MDNfqn8eBP5dvW9IEfHhiHgyIl6IiFURcfYgY2dERPbzObnPuIsi4vGI2Fn/9z1N7pckSUNqNjSfAX7dT/tzwJCnZiPiYuBW4CbgNOAh4N6IOG6ITadRLde3+7O+Yc4zgbuoVio6tf7v3RHxe0PVI0lSM5oNzeuBWyJi8u6G+vc/pWzd2WuA2zNzUWb+NDOvAnqBK4fYbmtmbm74vNzQdzXwvcy8sT7njVTPkF5dvFeSJBUY8kagiPgJkA1NbwCeiohN9d+716E9muqa50DzjAbeAnyxT9dS4KwhyuiJiMOAx4EbMvN7DX1nUj0r2uh+4CNDzClJUlNK7p69p0V/6yjgUKrl9xptAd45wDa7j0J/SPUasg8A34mIczPzB/Uxxwww5zH9TRgR86gvxDBp0iSWLVsGwJQpUxg7dixr1qwBYPz48UybNo3ly5cDMGrUKLq7u1m9ejU7duwAoFarsWXLFuCEIXdekrR/9fb2snbtWgAmT55MV1cXK1euBGDMmDHUajVWrFjBzp07Aeju7mbdunVs3boVgOnTp+/pG0hUa6/vfxExiepVYudm5vKG9uuA92fmSYXzLAFeyswL6r93AR/KzMUNY+YAizLzsMHmqtVq2dPTM9iQIpffss9TSJL20aKrWzNPRKzKzFp/fXu7uME7gN+lOm37WGYuK9hsG9WbUSb0aZ8AbG7iz68E3tfwe3ML5pQkaUhN3QgUEZMj4hHgAarXgX2C6nTpyvqR5IAycxewCpjZp2sm1V20pU6lOm2724oWzClJ0pCaPdL8T1RHi1Mz80mAiJgCfLXe994htr8ZuLMevA8CV1C9UuzL9bkWA2TmnPrvq4GngMeormleCrwbuKhhzluB5RHxCeAbwHuAtwPdTe6bJEmDajY0ZwIzdgcmQGY+ERHzge8MtXFm3lVfiu/TVM9bPgrMzswN9SF9n9ccDXwB6AKepwrP8zNzScOcD0XE+4AbqB57+T/AxZm5ssl9kyRpUHtzTbO/O4eK7ybKzIXAwgH6ZvT5/Xng8wVz3kPr7vKVJKlfzS5u8B3gSxFx7O6G+mo+t1BwpClJ0oGs2dCcD7wGeCIiNkTEBqrToa+p90mSdNBq9vTsPwJvBWYAuxdN/2lm/kMri5IkqR0Vh2ZEHAr8AnhTZj5A9diJJEkdo/j0bH2R9A1Ud7RKktRxmr2m+SfA5yLiqP1RjCRJ7azZa5ofp3rLyaaI2Eifd2tm5imtKkySpHbTbGjeQ/VMZuyHWiRJamtFoRkRh1OtzPNu4Leonsm8KjO37b/SJElqL6XXNBcAc4FvA/+N6v2Xf7mfapIkqS2Vnp69EPhgZv4NQER8DXgwIg6t31UrSdJBr/RI81jgB7t/ZOYjwEtUbyiRJKkjlIbmocCuPm0vsZcvsZYk6UBUGnoBfDUidja0vQpYFBHP7W7IzAtaWZwkSe2kNDTv6Kftq60sRJKkdlcUmpn5b/d3IZIktbtml9GTJKljGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUqFhD82I+HBEPBkRL0TEqog4e5CxF0bE0oh4JiJ+GRErI+KCPmPmRkT283nV/t8bSVInGdbQjIiLgVuBm4DTgIeAeyPiuAE2ORf4LnB+ffwS4O/7CdrngImNn8x8ofV7IEnqZKOG+e9dA9yemYvqv6+KiN8HrgQ+2XdwZn60T9OCiDgfeDfwg/9/aG7eD/VKkrTHsIVmRIwG3gJ8sU/XUuCsJqYaC2zv0/bqiNgAHAr8T+DazPzRAHXMA+YBTJo0iWXLlgEwZcoUxo4dy5o1awAYP34806ZNY/ny5QCMGjWK7u5uVq9ezY4dOwCo1Wps2bIFOKGJ8iVJ+0Nvby9r164FYPLkyXR1dbFy5UoAxowZQ61WY8WKFezcuROA7u5u1q1bx9atWwGYPn36nr6BRGbux11o+EMRk4BNwLmZubyh/Trg/Zl5UsEc/x74HDA9MzfU284E/hmwhipQPwrMBt6UmesHm69Wq2VPT89e7tFvXH7LPk8hSdpHi65uzTwRsSoza/31Dffp2b0WERcBXwAu3h2YAJm5AljRMO4hqqPNq4D5w1ymJOkgNpw3Am0DXgYm9GmfAAx6PTIi3gvcCczJzG8NNjYzXwZ6gBP3vlRJkl5p2EIzM3cBq4CZfbpmUt1F26+I+AOqwJybmfcM9XciIoBTgN69r1aSpFca7tOzNwN3RsQjwIPAFcAk4MsAEbEYIDPn1H+/jyowPw4sj4hj6vPsysxn62P+GHgYWA8cQXVK9hSqO3IlSWqZYQ3NzLwrIsYDn6Z6nvJRYHbDNcq+z2teQVXjLfXPbt8HZtS/vw64DTgG+AXwI+CczHyk5TsgSepow34jUGYuBBYO0DdjsN8DbPMx4GOtqE2SpMG49qwkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklRo2EMzIj4cEU9GxAsRsSoizh5i/Ln1cS9ExBMRccW+zilJ0t4Y1tCMiIuBW4GbgNOAh4B7I+K4Aca/AVhSH3ca8FngSxFx0d7OKUnS3hruI81rgNszc1Fm/jQzrwJ6gSsHGH8F8HRmXlUfvwi4A/j4PswpSdJeGbbQjIjRwFuApX26lgJnDbDZmf2Mvx+oRcRv7eWckiTtlVHD+LeOAg4FtvRp3wK8c4BtjgH+oZ/xo+rzRbNzRsQ8YF79568iYm1J8VIHOArYNtJFSHvrrz7WsqleP1DHcIZmW8jM24DbRroOqd1ERE9m1ka6DqmdDWdobgNeBib0aZ8AbB5gm80DjH+pPl/sxZySJO2VYbummZm7gFXAzD5dM6nueO3PigHG92Tmi3s5pyRJe2W4T8/eDNwZEY8AD1LdHTsJ+DJARCwGyMw59fFfBj4SEbcA/xl4GzAXuKR0TknFvGwhDWFYQzMz74qI8cCngYnAo8DszNxQH3Jcn/FPRsRs4M+oHiF5GpifmV9vYk5JBerX+yUNIjJzpGuQJOmA4NqzkiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1MSETEqIvz/gTQE/yOROlhEdANk5kuZ+U/1NgNUGoD/YUgdKiJOBpZHxC8j4m8i4m3wmwCNyuiI+JcR0Xd9Z6kjGZpS57oQWAPcBEwGvh8RmyPiixFxQlYrn7wO+CYweuTKlNqHKwJJHSoi/gJI4Lp603Tg94H3ACdRLUm5DZiQmdNGpEipzRiaUgeKiEOBWcDxmbmwoX001cvfTwHeBXwQ+GBmfmVECpXajKEpiYg4ZPeNQA1ts4B7gTGZ+dzIVCa1F69pSh2ofpPPnv/++wZm3ZnAAwam9BseaUrqV0TMAJ7JzMdGuBSpbRiaUoeJiFdn5vMjXYd0IPL0rNRBIuJIYG1E/GVEvC0ioqGv8fvvRMTrRqJGqZ0ZmlJnuRSYALwFWA7874i4PiJOqj+XSUQcC/w1MG7kypTak6dnpQ4SEYuAl6mezTwGuAR4LzAF+CHwX4HxwKcyc8xI1Sm1q1EjXYCk4RERhwGPA4dn5lZgK/DjiPgccDrwr4HPUIXpH49UnVI780hT6iD14DwyMzfXFzjIxsdN6nfMfhc4LjM3jkyVUvvymqbUISIiMnMncHhETMjMlxvebLL7JqBzgKcMTKl/np6VOkBEHA18ICKuoTot+1JE9AJ3A3+Xmb+uB+dmYP4Iliq1NU/PSh0gIm4HpgHfAp6lujP2NOBkYCPwhcxcOmIFSgcIQ1M6yNWPIH8JzM7M5Q1tXcAZwOXA64FLMnP1iBUqHQC8pikd/H4XeBLYtbshKz/LzLuBf0EVqv9qhOqTDhiGpnTwe4LqOuafRcSJjQu1A2TmLuAO4LyRKE46kBia0kGuvs7sp4BXA4uBORFxbESMAYiIw4FzqV46LWkQXtOUOkRETAeuBS4Afg2sAJ4B3gn0Ah/KzJ+MXIVS+zM0pQ5Tf/zkfODdwAtUR5h3Z+b/Gsm6pAOBoSl1sIg4ZIAXUEvqh6EpSVIhbwSSJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFfp/WR5Kv0K8M2sAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# use local simulator\n", "qasm_sim = Aer.get_backend('qasm_simulator')\n", "shots = 1024\n", "qobj = assemble(bv_circuit)\n", "results = qasm_sim.run(qobj).result()\n", "answer = results.get_counts()\n", "\n", "plot_histogram(answer)" ] }, { "cell_type": "markdown", "id": "720097e2", "metadata": {}, "source": [ "We can see that the result of the measurement is the hidden string `011`. " ] }, { "cell_type": "markdown", "id": "82b1d363", "metadata": {}, "source": [ "### 3b. Experiment with Real Devices \n", "\n", "We can run the circuit on the real device as below." ] }, { "cell_type": "code", "execution_count": 56, "id": "53720280", "metadata": { "tags": [ "uses-hardware" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "ibmqfactory.load_account:WARNING:2021-05-17 14:59:29,839: Credentials are already in use. The existing account in the session will be replaced.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "least busy backend: ibmq_lima\n" ] } ], "source": [ "# Load our saved IBMQ accounts and get the least busy backend device with less than or equal to 5 qubits\n", "IBMQ.load_account()\n", "provider = IBMQ.get_provider(hub='ibm-q')\n", "provider.backends()\n", "backend = least_busy(provider.backends(filters=lambda x: x.configuration().n_qubits <= 5 and\n", " x.configuration().n_qubits >= 2 and\n", " not x.configuration().simulator and x.status().operational==True))\n", "print(\"least busy backend: \", backend)" ] }, { "cell_type": "code", "execution_count": null, "id": "9882cea6", "metadata": { "tags": [ "uses-hardware" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ":7: DeprecationWarning: Passing a Qobj to Backend.run is deprecated and will be removed in a future release. Please pass in circuits or pulse schedules instead.\n", " job = backend.run(qobj)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Job Status: job is queued (11) " ] } ], "source": [ "# Run our circuit on the least busy backend. Monitor the execution of the job in the queue\n", "from qiskit.tools.monitor import job_monitor\n", "\n", "shots = 1024\n", "transpiled_bv_circuit = transpile(bv_circuit, backend)\n", "qobj = assemble(transpiled_bv_circuit, shots=shots)\n", "job = backend.run(qobj)\n", "\n", "job_monitor(job, interval=2)" ] }, { "cell_type": "code", "execution_count": null, "id": "8ce76036", "metadata": { "tags": [ "uses-hardware" ] }, "outputs": [], "source": [ "# Get the results from the computation\n", "results = job.result()\n", "answer = results.get_counts()\n", "\n", "plot_histogram(answer)" ] }, { "cell_type": "markdown", "id": "9735268c", "metadata": {}, "source": [ "As we can see, most of the results are `011`. The other results are due to errors in the quantum computation. " ] }, { "cell_type": "markdown", "id": "29a0d693", "metadata": {}, "source": [ "## 5. References \n", "1. Ethan Bernstein and Umesh Vazirani (1997) \"Quantum Complexity Theory\" SIAM Journal on Computing, Vol. 26, No. 5: 1411-1473, [doi:10.1137/S0097539796300921](https://doi.org/10.1137/S0097539796300921).\n", "2. Jiangfeng Du, Mingjun Shi, Jihui Wu, Xianyi Zhou, Yangmei Fan, BangJiao Ye, Rongdian Han (2001) \"Implementation of a quantum algorithm to solve the Bernstein-Vazirani parity problem without entanglement on an ensemble quantum computer\", Phys. Rev. A 64, 042306, [10.1103/PhysRevA.64.042306](https://doi.org/10.1103/PhysRevA.64.042306), [arXiv:quant-ph/0012114](https://arxiv.org/abs/quant-ph/0012114). " ] }, { "cell_type": "code", "execution_count": 12, "id": "284ce274", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'qiskit-terra': '0.16.1',\n", " 'qiskit-aer': '0.7.2',\n", " 'qiskit-ignis': '0.5.1',\n", " 'qiskit-ibmq-provider': '0.11.1',\n", " 'qiskit-aqua': '0.8.1',\n", " 'qiskit': '0.23.2'}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import qiskit\n", "qiskit.__qiskit_version__" ] }, { "cell_type": "code", "execution_count": null, "id": "8afcbe50", "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.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }