Skip to content

Instantly share code, notes, and snippets.

@IvanIsCoding
Created January 2, 2020 07:42
Show Gist options
  • Save IvanIsCoding/089dc60e14775f2eca548e2f14930d94 to your computer and use it in GitHub Desktop.
Save IvanIsCoding/089dc60e14775f2eca548e2f14930d94 to your computer and use it in GitHub Desktop.
Grover's algorithm in Qiskit
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Grover's Algorithm\n",
"\n",
"Grover's Algorithm is an algorithm to solve the unstructured search problem. That is, we have a function $f(x)$ where $f(x) = 1$ if $x$ is a solution, and $f(x) = 0$ if $x$ is not a solution.\n",
"\n",
"Classicaly, if the search space (i.e. possible $x$) has $N$ elements, we need $O(N)$ queries to discover the solution because no guarantees are made about $f(x)$.\n",
"\n",
"Grover's algorithm manages to solve the problem with $O(\\sqrt N)$, despite not knowing nothing about $f(x)$. That quadratic speedup can be widely applied to many brute-force algorithms.\n",
"\n",
"In real life, the search problem might be:\n",
"\n",
"* Travelling salesman problem\n",
"* Finding the password for an encrypted file\n",
"* Boolean satisfiability problem\n",
"\n",
"In this notebook, we will solve the \"Needle in a Haystack\" problem: we will try to find a single solution string $s$ among a big search space.\n",
"\n",
"We will cover the 3 steps of Grover's algorithm:\n",
"\n",
"### Step 1\n",
"\n",
"Generate the superposition state:\n",
"\n",
"$$\n",
"|\\psi\\rangle = \\frac{1}{\\sqrt 2 ^ {n}}\\sum_{x \\in \\{0, 1\\}^{n}}|x\\rangle\n",
"$$\n",
"\n",
"And initialize the ancilla qubit to $\\frac{|0\\rangle - |1\\rangle}{\\sqrt 2}$.\n",
"\n",
"### Step 2\n",
"\n",
"Apply Grover's iteration $K$ times:\n",
"\n",
"* Query the oracle. This is sometimes also called reflection around the solution.\n",
"* Invert about the mean. This is sometimes also called reflection around the superposition state.\n",
"\n",
"### Step 3\n",
"\n",
"Measure the qubits. $s$ will be the measurement with a high probability."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"from math import pi, sqrt\n",
"from qiskit import *"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"solution_string = \"10101\"\n",
"n = len(solution_string)\n",
"N = 2**n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Multi-qubit Toffoli gate\n",
"\n",
"To implement, the inversion about the mean, we need a Multi-qubit Toffoli gate. In Qiskit, that gate is available through:\n",
"\n",
"```Python\n",
"circuit.mct(controls, target, ancillas, mode)\n",
"```\n",
"\n",
"Notice that the mode influences how the circuit is built. For more information, read Qiskit's documentation. This time, we have opted to use the *noancilla* mode in order to have a circuit with no extra qubits. Notice that depending on the mode, more gates might be used (it is a trade-off after all).\n",
"\n",
"For the curious, here is what a multi-qubit Toffoli gate looks like when decomposed into CNOTs and single qubit gates."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 712.08x603.72 with 1 Axes>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ex_c = QuantumRegister(n-1, name=\"c\")\n",
"ex_t = QuantumRegister(1, name=\"t\")\n",
"ex_circuit = QuantumCircuit(\n",
" ex_c,\n",
" ex_t,\n",
")\n",
"\n",
"ex_circuit.mct(ex_c, ex_t[0], None, mode=\"noancilla\")\n",
"\n",
"ex_circuit.draw(output=\"mpl\", scale=0.3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Querying the oracle\n",
"\n",
"To query the oracle, we need a working qubit to store $f(x)$. Thus, the oracle acts as $|x\\rangle|0\\rangle \\rightarrow |x\\rangle|f(x)\\rangle$ and $|x\\rangle|1\\rangle \\rightarrow |x\\rangle|1 \\oplus f(x)\\rangle$.\n",
"\n",
"On this implementation, we have opted to choose to implement the \"Needle in a Haystack\" problem. That is, there is a single solution $s$ among a big search space.\n",
"\n",
"Mathematically, we will implement a function such that $f(x) = 1 \\iff x = s$ and $f(x) = 0$ if $x \\neq s$.\n",
"\n",
"To implement $f$, we will use a multi-controlled Toffoli gate. We will $NOT$ all the bits that are 0 in $s$, apply the Toffoli gate, and then $NOT$ again to reverse the change in $x$. That circuit implements $f(x)$ as we described before, because the AND is only true when $x = s$. The following code does exactly that:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def oracle(circuit, solution_string):\n",
" \n",
" N = len(solution_string)\n",
" controls = QuantumRegister(N)\n",
" target = QuantumRegister(1)\n",
" classical = ClassicalRegister(N)\n",
" toffoli_circuit = QuantumCircuit(\n",
" controls,\n",
" target,\n",
" classical,\n",
" name=\"U_ω\",\n",
" )\n",
" \n",
" for index, digit in enumerate(solution_string):\n",
" if digit == \"0\":\n",
" toffoli_circuit.x(index)\n",
" \n",
" toffoli_circuit.mct(controls, target[0], None, mode=\"noancilla\")\n",
" \n",
" for index, digit in enumerate(solution_string):\n",
" if digit == \"0\":\n",
" toffoli_circuit.x(index)\n",
" \n",
" circuit.append(\n",
" toffoli_circuit.to_instruction(),\n",
" range(N+1)\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Inversion about the mean\n",
"\n",
"The inversion about the mean step is the crucial step in Grover's algorithm.\n",
"\n",
"The idea of inversion about the mean is to amplify the amplitude of the solution, and to minimize the amplitude of nonsolutions. It can be seen as a process distributing the amplitudes from nonsolutions to the solution.\n",
"\n",
"To implement the inversion about the mean in a quantum circuit, we:\n",
"\n",
"* Apply Hadamard gates to all qubits\n",
"* Apply a multi-qubit Toffoli gate, with all qubits NOTed\n",
"* Apply again Hadamard gates to all qubits"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def inversion_about_mean(circuit, N):\n",
" \n",
" controls = QuantumRegister(N)\n",
" target = QuantumRegister(1)\n",
" classical = ClassicalRegister(N)\n",
" inversion_circuit = QuantumCircuit(\n",
" controls,\n",
" target,\n",
" classical,\n",
" name=\"U_s\",\n",
" )\n",
" \n",
" # Apply Hadamards\n",
" inversion_circuit.h(range(N))\n",
" \n",
" # Apply N-Qubit Toffoli Gate with NOTed Controls\n",
" inversion_circuit.x(range(N))\n",
" inversion_circuit.mct(controls, target[0], None, mode=\"noancilla\")\n",
" inversion_circuit.x(range(N))\n",
" \n",
" # Apply Hadamards again\n",
" inversion_circuit.h(range(N))\n",
" \n",
" \n",
" circuit.append(\n",
" inversion_circuit.to_instruction(),\n",
" range(N+1)\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def grover_iteration(circuit, solution_string, K):\n",
" \n",
" N = len(solution_string)\n",
" for k in range(K):\n",
" oracle(circuit, solution_string)\n",
" inversion_about_mean(circuit, N)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Number of steps\n",
"\n",
"The number of queries needed to guess the solution by Grover's algorithm is:\n",
"\n",
"$$\n",
"K \\approx \\frac{\\pi \\sqrt N}{4}\n",
"$$\n",
"\n",
"The value of $K$ can be derived by the geometric and algebraic proofs of Grover's algorithm, that we will not discuss here. \n",
"\n",
"One important remark is: do not do more than $K$ iterations! Later on, we will see that it decreases the probability of finding the solution."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4\n"
]
}
],
"source": [
"K = round(pi*sqrt(N)/4)\n",
"print(K)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Bringing it all together"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 276.92x445.48 with 1 Axes>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Generate superposition state and initialize ancilla qubit\n",
"circuit = QuantumCircuit(n+1, n)\n",
"circuit.x(n) # Working qubit must start as |1>\n",
"circuit.h(range(n+1))\n",
"circuit.draw(output=\"mpl\")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 758.52x445.48 with 1 Axes>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Apply the Grover iteration K times\n",
"grover_iteration(circuit, solution_string, K)\n",
"\n",
"circuit.draw(output=\"mpl\")"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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GzR8+HCNHDlSGRkZio+PN3s8t8v79bBO5marYfOODvvHfs5QUcEJRUR3MWmyS8Pqrf8nf986Zo/hMuSxNvJYG3mszdPyAKiZ6dOna9q0aSouLtb48eM1ePBg7d+//6LHlZSU6N///re6deumY8eOyc/PTyUlJbr99ts9rnxKFNAKVqxYoWXLlmnt2rV64IEH1KdPH02fPl09evRQcXGxOnfubPaIbpeTkSabl7fCoto57B/N3KU6IREKDmtq0mSeL+tIut799DlNGDzH7FFcgjzWRh5rI4+1eVoeADXTo0cPPfHEEyopKdGIESO0ZMmSix90juDgYL366qsKCQlRfn6+vL299eSTT1Z6caLajgJaTkpKigYOHKiEhASH/ZiYGPn6+iouLs5hf/HixbLZbFq1apWRY7pVTkaaGkS2lo+f4wemj2TuUqOWnP10l9LSUs15805NGDxHQYH1zR6nxshjbeSxNvJYm6flAVAzfn5+Wrp0qby8vDR79mytXr26SseXv+BQjx499NNPPykhIUETJ05009TmoYCeIysrS7t379att95a4b7MzEzFxsbK39+/bG/Pnj166aWX1L17dyPHlCTZbDanVnXkZKQpN2evFt0d7rB2rJuliOiubp33UlqpqVscnqO3Pv6XQoMj1av9zdV6jmsiNXULechDHvJ4XB5XZPHEPDVZZ5W/XVsXeay9rJinMsOGDdMVV1yhH374QY8//niV/l6XL5+9e/fWrl27NGnSJEnSQw89JB+fir+4xOznwZnn5Xz4NSznyMo6cwGByMhIh/38/HylpqZq0KBBZXvFxcW688479fzzz2vy5MmGzuluOfu3q9stj+nKXn9y2H/tofaK4AyoWxw+ulerPpqrZ/+y3exRXII81kYeayOPtXlaHgA1d7YszpkzR4WFhU4fV1n5PPuZzzVr1uj777/XFVdcoSFDhmjNmjVumd0MnAE9R3h4uCQpPT3dYX/27NnKzs52uADRjBkzNGjQIHXs6HihHqPY7XanVlXl/rRXhSd/U/O4AQoOiypbJacLVHgqt9pnQJ2d91JaCQm9y56f3fs/1rG8Ixo/t52G/j1cE+ef+axx0rw4rf30uWo951WRkNCbPOQhD3k8Lo8rsnhinpqss8rfrq2LPNZeVsxTXmRkpHr27Km8vDz9+9//dvrv84XK51mLFi2SJA0d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x80eqdoOHTqkvn376sorr1RsbKweeughs0eqsXvvvVdRUVEe8b0mSVu2bFFsbKxiYmJ01113qaSkxOyRqowCiip57733tHPnTu3cuVPt27c3exwAAFALbd26VXl5eWaP4RIrV67Uzp079fXXXysqKkrz5s0ze6Rq8/Hx0axZs/Tdd9/pyy+/1Mcff6x33nnH7LFq5NZbb9X27dvNHsMlSktLddddd2nlypXau3evjh8/rldffdXssarMM/4pAAAAAC5VdLpYR387Vul9P/78S6W3JSm8QYj8fM//I2ZhYaGmTp2qt99+W6+99pprhnVCYWGRfjl2otL7LpSnUWh9+fh4n/frhoSESDpTDgoKCmSz2Vww7cUVFBbp12rkiQhrIG/vys9BXXbZZbrsssskSX5+furUqZMyMzNdNPGFncovUO6Jk5Xed6E8kQ1D5XWB57xXr16uGbCK8k7l63jeqUrvO18em87kOd/3UFpamho3bqy2bdtKkhITE/Xss89q7NixrhvcADa73W43ewjUDi1atFCDBg1kt9t1ww036LHHHpOvr6/ZYwEAADcoLinR/KWrdPTXyktoZRqGhmjynbeet+BI0vTp09WqVSvdeeed8vHxUXFxsSvGvaii08Wa+8IbOnaeklOZJpHhmvSnmy9YcCTp5ptv1tatW9W+fXu9++67CgoKqum4F5VfUKg5i9/QyfwCp49p2fQyTRg52KmS/Ouvv6pjx47auHGjrrjiipqM6pQTJ09pzuI3VFh02uljroxpprFDBzr1WCO/1yTp12MnNO+FN1VchbfIdoqN0W2Drzvv/atXr9aaNWvK/uHmu+++06hRo/Tll1/WeF4j8RZcOG3r1q368ssv9cknn+iHH37QnDlzzB4JAAC4iY+3twZf16NKx9xwXY8Lls+vvvpK27Zt07hx42o6XpX5+fpoUO9uVTrmxr49L1o+Jemtt97Sjz/+qKioKK1ataq6I1ZJYIC/+l/bxenH2yTd2LeHU+WzqKhIw4YN07333mtI+ZSk4Lp1dF3PTk4/3tvLSzf0qdr3p5FCQ4J1zVVxTj/e19dHA6+96oKP8ZTzhhRQOK1p06aSpLp16+quu+7Sp59+avJEAADAndpEN9XlLaKcemzrllFqE930go/55JNP9O2336ply5Zq0aKFSkpK1KJFC8Mu3NPhylZq1riRU4+N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\n",
"text/plain": [
"<Figure size 1210.88x509.12 with 1 Axes>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Measure the state; the measurement will be the solution with high probability\n",
"circuit.measure(\n",
" list(range(n)),\n",
" list(reversed(range(n))),\n",
") # Qiksit measurements are done in reverse, so we reverse it to obtain the normal version \n",
"circuit.draw(output=\"mpl\", scale=0.8)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Simulating\n",
"\n",
"Now it is time to run the algorithm! Notice that Grover's algorithm finds the solution with high probability, so sometimes non-solutions show up.\n",
"\n",
"However, it is very easy to deal with the case where it is not a solution: we just need to plug $f(x)$ to check if it is a solution. If it is not, we run the algorithm again."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 504x360 with 1 Axes>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"simulator = Aer.get_backend(\"qasm_simulator\")\n",
"job = execute(circuit, backend=simulator, shots=2**15)\n",
"result = job.result()\n",
"counts = result.get_counts()\n",
"visualization.plot_histogram(counts)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Most Frequent Solution: 10101\n",
"Grover's algorithm found the solution!\n"
]
}
],
"source": [
"most_frequent_solution = max(counts.items(), key=lambda x: x[1])[0]\n",
"print(\"Most Frequent Solution: {}\".format(most_frequent_solution))\n",
"if most_frequent_solution == solution_string:\n",
" print(\"Grover's algorithm found the solution!\")\n",
"else:\n",
" print(\"Grover's algorithm did not find the solution\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Doing more than K iterations\n",
"\n",
"It is important to notice that at exactly $K$ Grover iterations, the solution's amplitude has reached its maximum value. Thus, if we apply more iterations, it starts to decrease. We can verify that computationally.\n",
"\n",
"Eventually, if more iterations are applied, the state will become $H^{\\otimes n}|000...0\\rangle$ again. Hence, it is important to find the right value of $K$, otherwise the probability of failing increases by a considerable margin."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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65E0duTIkVZcXGxt2rTZa/M7aWzc6ZzrZTTutEs6v1PjePDBB1tq3c6MTTn3VrPjznvSmuUXWH7z1jZywr61fvfr189KS0utefPmdvTRR1tFRYV1797diouLd6nznXfeaW3btrWhQ4da165drVmzZtavXz+bMmWKDRs2zLZs2WLLli2zkpIS++STT2zixInWrl07KywstL59+1pJSYldddVVe2VdSZV98MEH24QJE2qc32ZmlZWVduihh1bF1gSYa9Xkjb2euPbmp6akWVlZaSUlJfbWW29ZRUWFDRs2zBYuXLhLzJ133mkXXHCBmZk98sgj1qZNG3vrrbfstddes5YtW9prr71WtcBVVlZWxd90001WUFBgXbt2tYqKChs4cKANHDhwlwX09ttvtwsuuMB69eplXbp0sfHjx9caW1lZaW3btrUePXrYCSecUGNs79697e67745V57Zt29rq1autW7du+2w9ksSamX3ta1+z/Px8O/roo/fa/E4Sm2Q657LOSaZd0vndu3dv+81vfmMTJ040M7OFCxfutuGvrKw0M7Nzbqm0gtadrdeQE63nwSdYpx771vptZnb88cdby5YtbcKECbZw4ULr3r27XXvttbvU+bjjjrPu3bvb6tWrraSkxDp06GBbtmyx7t272+WXX141LY477jj79re/bd/4xjesd+/esedJLtcVM7PTTz/devXqVTWO1c1vM7NbbrnFTjvttD1OmmqercacOXPo378/JSUltGjRgsmTJzN16tRdYqZOncpZZ50FQHFxMVu3bqVv37489dRTjB07lqeeeoq+ffvSv39/5syZw9SpUznhhBP4wx/+wNChQ/noo49o3rw5ffr0oU+fPhQUFFTFP/TQQ5x11lls3bqVIUOGMHv27Fpjn3zySZo3b86mTZsIIdQYC1BUVBSrzm3btqWsrIzhw4fvs/VIElteXs6bb76JmdGqVau9Nr+TxCaZzrmsc5Jpl3R+A5x44on885//xMyYOnUqkydP3iV2zpw5AKxc+CRgDB03hRCaUXLYvrV+l5eXs3LlSrZv3141LY488kjWrFmzS51XrVpFXl4eZWVl9O/fn06dOrFx40b69OnDu+++WzUtevbsyXPPPce4ceNo3bo1eXl5PPPMM1x00UUUFxfvlXWlvLyc8vJyPvroo1rnd3l5Of/4xz8499xz9zg3KGlWY9WqVRQXF1d979mzJ6tWrao2Zs2aNbRs2ZK1a9eyatUq+vbtWxWfGnbVqlXcc889fPWrX6WwsJDmzZuzdu1aduzYwY4dO3b5rffee4/i4mK2b9/OggUL2LhxI7feemuNsTfccANjx46lbdu2bNu2rcbYEAKXXnop27dv59Zbb62xzvn5+Vx88cWUlZURQqi1zk2xHklip0yZwqRJkygoKGDbtm17bX4niU0ynXNZ5yTTLun8DiEwfvz4qnrUtA6//twNdC85EoJvAtscsG+t31OmTOHMM8+kefPmVdO5U6dOWadFCIGLL76YeWljSI0AACAASURBVPPmsWHDBgDatm3L+vXrd5ke69ato0uXLixevJjS0lJ69+5NXl4ey5Yt2yvrypQpU7j55purpkdN83vKlCnceOONNGu25ylPSbMBbdy4kS5dutCvX7/Yw/zkJz/h5JNP5sADD+T+++/fbUFOee655zjggAPo0qVLrHJnzpzJTTfdROvWrbn//vt32avM9Le//Y2bbrqJ448/ng0bNvDKK69UG9sU65E0tlu3brHmYS7nd9LYuNM518to3GkHyeY3+DiWlZVV1aO6cXzyySdp0eoACtrEW0bjaizrd2o6jx07lu3bt1d1X7duHUVFRbvEFhUVceedd3LTTTdx3HHHsX79ehYuXEjHjh3ZtGlTVVx5eTn5+fkceOCBdOrUiW7dugF+ZJ9KtNXVIxfrSqrsww8/vNbYJ598MnZsHEqa1SgqKmLlypVV38vLy7MucKmYwsJCtmzZQufOnSkqKmL58uVV8alh8/LyeOqpp7j00kt57rnn+PTTT7n88stp1qzZLntA5eXlHHjggaxcuZJhw4bxzjvvsGnTJk499VQ2btyYNfb555+nrKyMRx55hPfee4+XXnqJBQsWVFtuUVERhYWFVFRUcOqpp7Jly5asdS4qKqKyspKioiI++OAD8vLyWLx4cbV1bor1SBr7+OOPc8kll/Dpp5/y0ksvMXPmzAaf30lj407nXC+jcadd0vmdGsfKysqqemzZsiXrOvzyyy/zYXkZb817hBcenMy7S5/njRdv2WfW79R0njRpEhUVFUyfPp0ZM2bw0ksvcdJJJ+1S55NOOolp06ZRVFTEwoULGTRoEK+++io9evRgxYoVVFRUsHz5cpYuXUr//v2pqKigR48evPnmm3z8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\n",
"text/plain": [
"<Figure size 504x360 with 1 Axes>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"alt_circuit = QuantumCircuit(n+1, n)\n",
"alt_circuit.x(n)\n",
"alt_circuit.h(range(n+1))\n",
"\n",
"grover_iteration(alt_circuit, solution_string, K+1)\n",
"\n",
"alt_circuit.measure(\n",
" list(range(n)),\n",
" list(reversed(range(n)))\n",
")\n",
"\n",
"visualization.plot_histogram(\n",
" execute(alt_circuit, backend=simulator, shots=2**15)\n",
" .result()\n",
" .get_counts()\n",
")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment