Created
December 29, 2019 08:14
-
-
Save IvanIsCoding/b1b1c57d275e19823fc5a1156d7e5008 to your computer and use it in GitHub Desktop.
Bernstein-Vazirani's algorithm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Bernstein-Vazirani\n", | |
"%matplotlib inline\n", | |
"from random import randint\n", | |
"from qiskit import *" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Step 0: Generate a secret string\n", | |
"secret_string = bin(randint(0, 2**7 - 1))[2:]\n", | |
"N = len(secret_string)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 337.12x565.88 with 1 Axes>" | |
] | |
}, | |
"execution_count": 31, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Step 1: Prepare the state with superpositions\n", | |
"prep_circuit = QuantumCircuit(N+1, N)\n", | |
"prep_circuit.x(N) # working qubit starts with |1>\n", | |
"prep_circuit.h(range(N+1))\n", | |
"prep_circuit.barrier()\n", | |
"prep_circuit.draw(output=\"mpl\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 517.72x565.88 with 1 Axes>" | |
] | |
}, | |
"execution_count": 32, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Step 2: send the query to the quantum oracle. Here, we prepare the quantum oracle\n", | |
"oracle_circuit = QuantumCircuit(N+1, N, name=\"Blackbox\")\n", | |
"\n", | |
"for index, value in enumerate(secret_string):\n", | |
" if value == \"1\":\n", | |
" oracle_circuit.cx(index, N) # XOR with working qubit\n", | |
"\n", | |
"oracle_circuit.barrier()\n", | |
"oracle_circuit.draw(output=\"mpl\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 33, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 638.12x565.88 with 1 Axes>" | |
] | |
}, | |
"execution_count": 33, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Step 3: Apply Hadamard gates and measure\n", | |
"measure_circuit = QuantumCircuit(N+1, N)\n", | |
"measure_circuit.h(range(N))\n", | |
"measure_circuit.measure(\n", | |
" list(range(N)), \n", | |
" list(reversed(range(N)))\n", | |
")\n", | |
"measure_circuit.draw(output=\"mpl\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 1119.72x565.88 with 1 Axes>" | |
] | |
}, | |
"execution_count": 34, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# We now merge the circuit together\n", | |
"circuit = QuantumCircuit(N+1, N)\n", | |
"circuit += prep_circuit\n", | |
"circuit.append(oracle_circuit.to_instruction(), range(N+1)) # We do this to \"hide\" the oracle from the viewer\n", | |
"circuit.barrier()\n", | |
"circuit += measure_circuit\n", | |
"circuit.draw(output=\"mpl\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 35, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFkCAYAAABCVmA7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAeMklEQVR4nO3dfZidVXnv8e9NhgiYIBI0JBkQQ1A8iQo6tojDWzUi2CKCB+SoMUWhgBIpra2co9jYqudY9cDxSJFo5c1W6guCGiBKibEQgkk0itoktogCYVJqMFYggXD3j+dJuhnmZe1kMntn9vdzXfuavdeznrXv/ddvnre1IjORJEnD263VBUiStKswNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQl2tLqCV9ttvvzzooINaXYYkqY2sWLHiocx8zkDbOjo0DzroIJYvX97qMiRJbSQi7h1sm6dnJUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1pDDrzzDN57nOfy6xZswbcnpnMmzePGTNm8JKXvISVK1du23bVVVdxyCGHcMghh3DVVVdta1+xYgUvfvGLmTFjBvPmzSMzd/rvkNqNoSmNQXPnzuXmm28edPtNN93E2rVrWbt2LVdccQXnnnsuAL/61a+YP38+y5Yt46677mL+/Pls2LABgHPPPZcFCxZs22+o8aWxytCUxqCjjz6afffdd9DtN9xwA3PmzCEiOOKII3j44YdZt24dt9xyC7Nnz2bffffl2c9+NrNnz+bmm29m3bp1bNy4kSOOOIKIYM6cOXzta18bxV8ktQdDU+pA999/PwcccMC2z93d3dx///1Dtnd3dz+tXeo0hqYkSYUMTakDTZs2jV/+8pfbPt93331MmzZtyPb77rvvae1SpzE0pQ500kkncfXVV5OZ3HnnnTzrWc9iypQpHH/88SxatIgNGzawYcMGFi1axPHHH8+UKVPYe++9ufPOO8lMrr76at7whje0+mdIo66r1QVIGnlnnHEGixcv5qGHHqK7u5v58+fz+OOPA3DOOedw4oknsnDhQmbMmMFee+3F5z//eQD23XdfPvCBD/CKV7wCgIsvvnjbDUWXXXYZc+fO5dFHH+WEE07ghBNOaM2Pk1ooOvlZq56enly+fHmry5AktZGIWJGZPQNt8/SsJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRCoxqaEXF0RNwYEfdHREbE3IJ9XhwR34mIR+v9Lo6I6Nfn1Ij4SURsqv++caf9CElSxxrtI80JwN3Ae4BHh+scEXsD3wL6gFfU+70XuLChzyuB64AvAIfVf78UEb870sVLkjrbqM49m5kLgYUAEXFlwS5vAfYC3p6ZjwJ3R8ShwIUR8cms5gC8ALgtMz9c7/PhiDiubj9jpH+DJKlztfs1zVcC360Dc6tbgKnAQQ19FvXb7xbgyJ1enSSpo7T7Kif7A/f1a+tr2HZP/bdvgD77DzRgRJwNnA0wdepUFi9eDMD06dOZOHEiq1atAmDSpEnMnDmTJUuWANDV1UVvby8rV65k48aNAPT09NDX18f//vrBO/IbJUkj4EOnr2P16tVAtWZsd3c3y5YtA2DChAn09PSwdOlSNm3aBEBvby9r1qxh/fr1AMyaNWvbtsG0bJWTiPgP4N2ZeeUQfRYB92XmmQ1tBwL3Akdm5tKI2Ay8MzOvbugzB1iQmc8YqoaRWuXkrEt2eAhJ0g5acMHIjLMrr3LyIDC5X9vkhm1D9XkQSZJGULuH5lLgqIjYo6FtNvAA8POGPrP77TcbuGOnVydJ6iij/ZzmhIg4LCIOq7/7wPrzgfX2j0bErQ27/B3wCHBlRMyKiFOA9wFb75wFuBT4vYh4X0QcGhEXAccBnjSVJI2o0T7S7AG+X7/2BObX7z9Ub58CbLurJjN/TXXUOBVYDnwa+ATwyYY+dwBvBuYCPwTmAKdn5rKd+1MkSZ1mtJ/TXAzEENvnDtD2I+DoYcb9MvDlHSxPkqQhtfs1TUmS2oahKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFmgrNiDgtIl7b8PniiLgvIm6JiCkjX54kSe2j2SPNv9j6JiJeBvxP4P8BuwOfGLmyJElqP82G5vOA1fX7NwJfy8yPARcCry4ZICLOi4h7IuKxiFgREUcN0ffKiMgBXr9t6HPsIH0ObfK3SZI0pGZD8zFgYv3+1cC36/e/bmgfVEScDlwKfAQ4HLgDuCkiDhxkl/cAU/q9/hX4hwH6zuzXb+3wP0eSpHJdTfb/LvCJiPgnoAd4U93+AuCXBftfCFyZmQvqz+dHxOuAc4GL+nfOzF9TBTIAEfEqYDrwtgHGXp+ZD5X+EEmSmtXskea7gc1UYXlOZj5Qt58A3DLUjhExHng5sKjfpkXAkYXffxbw48y8Y4BtyyNiXUTcGhHHFY4nSVKxpo40M/M+4A8GaL+gYPf9gHFAX7/2PuA1w+0cEc8CTuPpR6TrqI5UvweMpzoKvTUijsnM7w4wztnA2QBTp05l8eLFAEyfPp2JEyeyatUqACZNmsTMmTNZsmQJAF1dXfT29rJy5Uo2btwIQE9PD319fcDBw/54SdLOtW7dOlavrm67mTZtGt3d3SxbtgyACRMm0NPTw9KlS9m0aRMAvb29rFmzhvXr1wMwa9asbdsGE5nZVFERsQfw+1RJ8ZnMfDgiDgY2ZOavhthvKnA/cExmLmlovxh4S2a+cJjvfRfVHbpTh/qeuu9C4InMPGmofj09Pbl8+fKhuhQ565IdHkKStIMWlBy+FYiIFZnZM9C2po40I2IG1c0/E4B9gC8BD1Md6e0DvHOI3R8CtgCT+7VPBh4s+PqzgK8MF5i1ZcCbC/pJklSs2Wual1Bdg5wMPNrQfiMw5HXEzNwMrABm99s0m+ou2kFFxO8ALwUWDNWvwWFUp20lSRoxzd49eyRwRGZuiYjG9l8AUwv2/yRwTUTcBdwOnFPvdzlARFwNkJlz+u13NrA2Mxf3HzAiLgB+DvyY6prmW4GTgVNLf5QkSSWaDU2oZv/p70AaHg0ZTGZeFxGTgPdTPUt5N3BiZt7bMM5TRMREqlOtHxpk2PHAXwPdVEe/PwZen5kLh6tHkqRmNBuai6ietXxH/TkjYm9gPvDNkgEy8zLgskG2HTtA22+orqEONt7HgI+VfLckSTui2dC8ELgtIlYDewDXATOoHhs5bYRrkySprTT7nOYDEXEYcAbwMqobia4AvpCZjw65syRJu7imr2nW4fi39UuSpI4xbGhGxCnA1zPz8fr9oDLzqyNWmSRJbabkSPPLwP7A+vr9YJJqmjxJksakYUMzM3cb6L0kSZ2mqRCMiKMj4mlBGxHjIuLokStLkqT20+yR423AvgO071NvkyRpzGo2NIPq2mV/k4Df7ng5kiS1r6JHTiLixvptAtdGROOCY+OAWQwz6bokSbu60uc0/73+G8AGnrrCyWbgnyhfgUSSpF1SUWhm5h8CRMTPgY9npqdiJUkdp9lp9ObvrEIkSWp3JTMC/RA4JjM3RMSPGPhGIAAy8yUjWZwkSe2k5EjzK8DWG3+GmhFIkqQxrWRGoPkDvZckqdM4LZ4kSYVKrmkOeR2zkdc0JUljWekqJ5IkdbymrmlKktTJvKYpSVIhn9OUJKmQz2lKklTI5zQlSSrU1NyzW0XEwcCL6o8/zcx/GbmSJElqT02FZkRMAj4HnAQ8+V/N8Q3gzMz890F3liRpF9fs3bOfBWYARwF71K+jgefjepqSpDGu2dOzxwOvzsylDW23R8QfAd8eubIkSWo/zR5p/hsw0ALUjwCempUkjWnNhuaHgEsiYtrWhvr9J+ptkiSNWdszYfvzgZ9HxP3152nAY8Bzqa55SpI0JjlhuyRJhZywXZKkQk7YLklSoaZCMyLGR8T8iFgTEY9FxJbG184qUpKkdtDskeZfAm+nulv2SeC9wKepHjc5b2RLkySpvTQbmqcB52TmZ4AtwA2ZOQ/4IDB7pIuTJKmdNBuak4Gf1O//A9infn8z8NqRKkqSpHbUbGj+Aphav/8Z1bR6AK8EHh2poiRJakfNhub1wKvr95cC8yPiHuBKnNhAkjTGNTVhe2Ze1PD+yxFxH3AksCYzvzHSxUmS1E62axHqrTLzTuDOEapFkqS21vTkBhHxsoi4OiKW169rIuJlO6M4SZLaSbOTG7wF+B4wBVhYvyYDd0XEW0e+PEmS2kezp2c/DHwgMz/S2BgRFwF/BVw7UoVJktRumj09+xzgHwZo/xLV0mDDiojzIuKeehq+FRFx1BB9j42IHOB1aL9+p0bETyJiU/33jU39KkmSCjQbmrcBxw7QfizwneF2jojTqR5V+QhwOHAHcFNEHDjMrjOpTglvfa1tGPOVwHXAF4DD6r9fiojfHa4eSZKaUbII9SkNH28CPhoRPfzXXbNHAKcAf1HwfRcCV2bmgvrz+RHxOuBc4KLBd2N9Zj40yLYLgNsy88P15w9HxHF1+xkFNUmSVGR7F6E+u341+hRw2WCDRMR44OXAx/ttWkT1rOdQlkfEM6im8PurzLytYdsr6+9udAvw7mHGlCSpKcOens3M3Qpf44YZaj9gHNDXr70P2H+QfdZRHYWeSnU0uxq4td910P2bHFOSpO2yQ5Mb7GyZuZoqKLdaGhEHUS1J9t3tGTMith0lT506lcWLFwMwffp0Jk6cyKpVqwCYNGkSM2fOZMmSJQB0dXXR29vLypUr2bhxIwA9PT309fUBB29PKZKkEbRu3TpWr64iY9q0aXR3d7Ns2TIAJkyYQE9PD0uXLmXTpk0A9Pb2smbNGtavXw/ArFmztm0bTGRmU0VFxOuBPwf+G5BUp0z/T2YuHGa/8cAjwBmZ+aWG9k8DszLzmMLv/yDw5sx8Uf35F8CnMvOvG/q8F3h3Zj5vqLF6enpy+fLlJV87pLMu2eEhJEk7aMEFIzNORKzIzJ6BtjU7ucE7qSZt/xeq4HwfcA9wfUScOdS+mbkZWMHT192cTXUXbanDqE7bbrV0BMaUJGlYzZ6e/XPgwsz8/w1tn4uIFVQB+rfD7P9J4JqIuAu4HTiHaqmxywEi4mqAzJxTf74A+DnwY2A88FbgZKprnFtdCiyJiPcBXwPeCBwH9Db52yRJGlKzoXkg1YLT/d3E0++KfZrMvC4iJgHvp3re8m7gxMy8t2H8RuOBvwa6qdbr/DHw+sZTwZl5R0S8mWpGog9RHQWfnpnLmvlhkiQNp9nQ/AXVqc+f9Wt/LXDv07s/XWZexiCPpmTmsf0+fwz4WMGYX2bgR2MkSRoxzYbmx4FP1auabL1m+CrgbcD5I1mYJEntptlFqD8TEeuBP6F6bhLgp8BpmXnDSBcnSVI7KQ7NiOiiOg27JDOv33klSZLUnoofOcnMJ4CvAhN3XjmSJLWvZlc5WQXM2BmFSJLU7poNzb8APhERJ0fEARGxb+NrJ9QnSVLbaPbu2W/Wf79KNYXeVlF/Hm7SdkmSdlnNhuZxO6UKSZJ2AUWhGRF7Uc3MczKwO/BtYN4QC0NLkjTmlF7TnA/MpTo9+/dUswL9zU6qSZKktlR6evYU4B2Z+UWAiPgCcHtEjMvMLTutOkmS2kjpkeYBNCz6nJl3AU9QrVAiSVJHKA3NccDmfm1P0PyNRJIk7bJKQy+AayNiU0PbHsCCiHhka0NmnjSSxUmS1E5KQ/OqAdquHclCJElqd0WhmZl/uLMLkSSp3TU7jZ4kSR3L0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSCo16aEbEeRFxT0Q8FhErIuKoIfqeEhGLIuLfIuI3EbEsIk7q12duROQArz12/q+RJHWSUQ3NiDgduBT4CHA4cAdwU0QcOMguxwD/CLy+7r8QuH6AoH0EmNL4yszHRv4XSJI6Wdcof9+FwJWZuaD+fH5EvA44F7iof+fMfE+/pvkR8XrgZOC7T+2aD+6MgiVJ2mrUjjQjYjzwcmBRv02LgCObGGoisKFf254RcW9E3BcR34iIw3egVEmSBjSaR5r7AeOAvn7tfcBrSgaIiHcB3cA1Dc2rgTOBVVSB+h7g9oh4aWauHWCMs4GzAaZOncrixYsBmD59OhMnTmTVqlUATJo0iZkzZ7JkyRIAurq66O3tZeXKlWzcuBGAnp4e+vr6gINLypck7UTr1q1j9erVAEybNo3u7m6WLVsGwIQJE+jp6WHp0qVs2rQJgN7eXtasWcP69esBmDVr1rZtg4nM3Ik/oeGLIqYC9wPHZOaShvaLgbdk5guH2f9UqrA8PTO/PkS/ccAPgNsyc95QY/b09OTy5cub+BUDO+uSHR5CkrSDFlwwMuNExIrM7Blo22jeCPQQsAWY3K99MjDk9ciIeBNVYM4ZKjABMnMLsBw4ZPtLlSTp6UYtNDNzM7ACmN1v02yqu2gHFBGnUQXm3Mz88nDfExEBvARYt/3VSpL0dKN99+wngWsi4i7gduAcYCpwOUBEXA2QmXPqz2+mCsw/BZZExP71OJsz81d1nw8CdwJrgb2BeVShee4o/SZJUocY1dDMzOsiYhLwfqrnKe8GTszMe+su/Z/XPIeqxkvq11bfAY6t3+8DXAHsD/wa+D5wdGbetTN+gySpc432kSaZeRlw2SDbjh3q8yD7/DHwxyNRmyRJQ3HuWUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqdCoh2ZEnBcR90TEYxGxIiKOGqb/MXW/xyLiXyPinB0dU5Kk7TGqoRkRpwOXAh8BDgfuAG6KiAMH6f98YGHd73Dgo8CnIuLU7R1TkqTtNdpHmhcCV2bmgsz8aWaeD6wDzh2k/znAA5l5ft1/AXAV8Kc7MKYkSdtl1EIzIsYDLwcW9du0CDhykN1eOUD/W4CeiNh9O8eUJGm7jOaR5n7AOKCvX3sfsP8g++w/SP+uerztGVOSpO3S1eoCRltEnA2cXX/8j4hY3cp6pDayH/BQq4uQttdn/3jEhnreYBtGMzQfArYAk/u1TwYeHGSfBwfp/0Q9XjQ7ZmZeAVxRXLXUISJieWb2tLoOqZ2N2unZzNwMrABm99s0m+qO14EsHaT/8sx8fDvHlCRpu4z26dlPAtdExF3A7VR3x04FLgeIiKsBMnNO3f9y4N0RcQnwGeBVwFzgjNIxJUkaKaMampl5XURMAt4PTAHuBk7MzHvrLgf2639PRJwI/F+qR0geAOZl5leaGFNSGS9bSMOIzGx1DZIk7RKce1aSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCU9DQR8YzCfrGza5HaiaEp6SkiYjJwUUQcGxH7R8S4AfpERHSlD3qrwxiakvr7E+Bi4IvAlcB5EdETEfs29JkGfDYi9m5BfVLLOCOQpKeIiCVUi73/CHgHcBzwG2AxsBD4Xt1+cma+sEVlSi3RcetpShpcROwHrAV+m5k3AjdGxB7A24AzgQXAz4EXUB2RSh3FI01J20TEeOClVKH5k4gYXy/Bt3X7VOAvqVYbmpiZj7SmUqk1PNKUtE0dkN+LiN0iYrfM3FzfITsO2JKZD0TEI1Rr2hqY6jjeCCTpKeqjyycz80mA+g7ZJzMzI2JPqiX4Pt7SIqUW8fSsJAAi4iDgNGAW1ULui4DrM3NtQ5/dgP0yc30rapRazdCURP3oyDeAA4A7gAR6gW7gduBDmXlr6yqU2oPXNCUBnAvsBRyemQ9HxF7ABOB3gT8C/iYi3puZN7SySKnVPNKURERcDzyQme/q1x7AZOATwCuAozKzrwUlSm3BG4EkQXVq9qSIeH5jY1YeBP4M+C1weCuKk9qFoSkJ4GbgXuBLEXFWRLwgInZv2L4ncCiwuiXVSW3C07OSAIiIw4D3Ay+hCtDlwEPAeOA1wLjMPLZlBUptwNCU9BQRcSJwBtVUebsBzwX+DliQmf/aytqkVjM0JRERXQCZ+URD2zOpVjP5GfXlzRaVJ7UNQ1PqYBHx/My8p+HzbsDuVFPmNQZoGJqSNwJJHSsi3gDcFRHXRsTbI2JyPX3epsx8IiLGRcQzI2IfA1OqeKQpdaiIuAF4IfBT4EDgcWAl1ZqZ38rMTRFxEtVUeuNaV6nUPgxNqQPVM/7cClxLFZIvB44EXgw8B9gA/BNwLPBgZv731lQqtRen0ZM60x7At6iuXd4D3BMRXwFmAkdQTZ/3mvrv77SsSqnNeKQpdbCI2D0zH4+Irn43/uwOfBQ4PTMPaF2FUnvxRiCpA9VzypKZj9d/n6jbd2tofxXw1VbVKLUjT89KnWkc8ET/xq0LT0fEM6im1vvcKNcltTVPz0odLCLGUU1c8GSra5F2BZ6elTpIRPRExDci4k319cwtDUeXXVtP20oamKEpdZbzgdcCHwH+OSI+GxHHQHVdMzMzIo6MiC/WR6GSGnh6VuogEbGU6lrlcqpHSY4GZlA9l3kjcA0wDzgmM2e1qk6pXXkjkNQhIuIg4N+B9Zn5zYi4lWr1kpdS3Sl7PPB2qknaT25RmVJb80hT6iARMRl4Zv8lviJiIjAdOI/q2cx9WlGf1O4MTalD1dcso9+kBl8DNmXm6a2rTGpf3ggkdZj6qJL6ztltkxpExD7A3sDHW1mf1M480pQ6QES8CLgQOJxqUelfAD8AvpuZv2zot2dmPtqaKqX2Z2hKY1xEHEy1kkkfcDtwKLA/8AyqAP1sZi5q6O+C09IgDE1pjIuIvwG6gf+Rmb+p2yYDJwBnUi0LNi8znTJPGobXNKWx73nAysz8TUSMi4hxmdmXmVdm5tHA5cBZ9RqbkoZgaEpj3y3AH0bEofXNP1siYnxEjK+3fw6YTLV2pqQhGJrS2Hcj1aQGN0XEmQCZuTkzN9fbd6Oa0GBZi+qTdhle05Q6QP2YyUeBtwC7A4uAbwOzgF7gB5k5p3UVSrsGQ1Maw+pVS3arT8nuAbyYar7Z3wNeBtwDXAt8NTMfbF2l0q7B0JQ6TD0T0JP1iibPysxft7omaVfhNU1pDIqI3SPiBRHxjP7bMnNLw3sDU2qCoSmNTe8Cvg9cHhF/EBH7N66PWR9l7h0RJ0TE7q0rU9q1eHpWGoPqdTMfo1r+70iqafOuB74K/Cgzfx0R5wBzM/OI1lUq7Vo80pTGmIh4DvA4sCAzj6Ka3OBzwO8DS4B/jIg/By7Ax0ykpnikKY0xETEFeDPwk8y8pd+2w4F31tufDRyQmfePfpXSrsnQlMagiNiT6tLlY/VjJ1A31Ns/DJyYmYe3qkZpV9TV6gIkjbzMfHRrWPZfsaSeY/ZU4POtqE3alXmkKY0hEbE38JuhlvaqJzk4Hfj7hqn0JBUwNKUxJCI+A9xVv+7NzI0D9NknMx8e9eKkMcDQlMaIiDgD+AKwEfgV8C3gZuCHwAP1Kds9gS8C/ysz725ZsdIuytCUxoiIWABsAT4GnAK8HTgYWA0sBG4FXghcmpnjBxtH0uAMTWkMiIgu4M+AvTPzfQ3tM4GzgDcBewD7AFdl5jtaUqi0izM0pTEiIp4NTM7Mf64XmH688YagiDgd+HvgZZn5g1bVKe3KfOREGiMycwOwoX6/GSAidqP653gLsDfwmIEpbT9DUxrDMvPJho8TgQ+2qhZpLPD0rNQh6tVMtvQLUklNMDQlSSrkKieSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQv8J41/LMRwlhjkAAAAASUVORK5CYII=\n", | |
"text/plain": [ | |
"<Figure size 504x360 with 1 Axes>" | |
] | |
}, | |
"execution_count": 35, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# We simulate to discover the hidden string\n", | |
"simulator = Aer.get_backend(\"qasm_simulator\")\n", | |
"job = execute(circuit, simulator, shots=512)\n", | |
"results = job.result()\n", | |
"visualization.plot_histogram(results.get_counts())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 41, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Hidden string 1101101\n", | |
"Guess 1101101\n", | |
"The guess was correct!\n" | |
] | |
} | |
], | |
"source": [ | |
"# Was the guess right? Let's discover\n", | |
"print(\"Hidden string {}\\nGuess {}\".format(\n", | |
" secret_string, list(results.get_counts().keys())[0])\n", | |
")\n", | |
"if list(results.get_counts().keys())[0] == secret_string:\n", | |
" print(\"The guess was correct!\")\n", | |
"else:\n", | |
" print(\"The guess was not correct\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 42, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'qiskit-terra': '0.11.0',\n", | |
" 'qiskit-aer': '0.3.4',\n", | |
" 'qiskit-ignis': '0.2.0',\n", | |
" 'qiskit-ibmq-provider': '0.4.4',\n", | |
" 'qiskit-aqua': '0.6.1',\n", | |
" 'qiskit': '0.14.0'}" | |
] | |
}, | |
"execution_count": 42, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# For purposes of reproducibility, the Qiskit version is\n", | |
"qiskit.__qiskit_version__" | |
] | |
} | |
], | |
"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