{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "40739e3d",
   "metadata": {},
   "source": [
    "# Quantum information and quantum computing - Problem set 08\n",
    "\n",
    "### _Problem 1_ : Code Grover's search algorithm"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f2a6517d",
   "metadata": {},
   "source": [
    "In this notebook we are going to see a simple implementation of the Grover algorithm on a database of dimension $N=8$ possibile data, so using $n=3$ qubits.\n",
    "\n",
    "Between all the possibile state $|xyz\\rangle$ , let's consider $|110 \\rangle$ and $|101 \\rangle$ as the solutions of our problem."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ecb5c076",
   "metadata": {},
   "outputs": [],
   "source": [
    "#initialization\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import math\n",
    "\n",
    "# importing Qiskit\n",
    "from qiskit_aer import QasmSimulator\n",
    "from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d38c59a0",
   "metadata": {},
   "source": [
    "##### Creating the oracle\n",
    "\n",
    "The first thing to make is a oracle function, that adds a phase to the states that are solution of our search problems. Considering $f(x)=1$ iff $x$ is a solution of the problem, the unitary has the form\n",
    "\n",
    "\\begin{equation}\n",
    "U |x\\rangle_{n} = (-1)^{f(x)}|x\\rangle_{n}\n",
    "\\end{equation}\n",
    "\n",
    "\n",
    "In our case the oracle function is easy to make: we have to control if the first qubit (the last, for qiskit order) is $1$ and then perform a X gate on second and third qubit.\n",
    "\n",
    "Note that, since we already know the solutions, we can construct the oracle without the ancilla qubit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "ec6eb1c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def oracle(circuit):\n",
    "    circuit.cz(2,0)\n",
    "    circuit.cz(2,1)\n",
    "    \n",
    "    circuit.barrier() # Barriers are added to divide the different parts of the circuits\n",
    "    return circuit"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e00c6886",
   "metadata": {},
   "source": [
    "##### Creating the Grover gate \n",
    "\n",
    "Now we want to add the Grover gate. Remember that it is made of three parts:\n",
    "\n",
    "- Apply Hadamard gates on all qubits\n",
    "- Apply a phase shift to all the $|x \\rangle_{n}$ except $|0\\rangle_{n}$\n",
    "- Apply again Hadamard to all the qubits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b5cf4c0d",
   "metadata": {},
   "outputs": [],
   "source": [
    "def grover_gate(circuit):\n",
    "    # Hadamard\n",
    "    for i in range(circuit.num_qubits):\n",
    "        circuit.h(i)\n",
    "        \n",
    "    # To add a phase at all the solutions except |0>, we create a set of \n",
    "    # transformations that only |0> won't trigger\n",
    "    circuit.z(0) # address |**1> states\n",
    "    circuit.x(0) # now target |**0> states\n",
    "    circuit.cz(0,1) # for |*10> states\n",
    "    circuit.cx(1,2) # control if the second qubit is in 1\n",
    "    circuit.cz(0,2) # for |100> state\n",
    "    \n",
    "    # now bring the qubit back to their original state\n",
    "    circuit.cx(1,2)\n",
    "    circuit.x(0)\n",
    "    \n",
    "    \n",
    "    #Hadamard again\n",
    "    for i in range(circuit.num_qubits):\n",
    "        circuit.h(i)\n",
    "    \n",
    "    circuit.barrier()\n",
    "    return circuit\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2e643319",
   "metadata": {},
   "source": [
    "##### Construct the circuit\n",
    "\n",
    "We can now assemble the Grover circuit for our problem. As a first thing, apply the Hadamard:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "24b65f7b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "CircuitInstruction(operation=Instruction(name='barrier', num_qubits=3, num_clbits=0, params=[]), qubits=(Qubit(QuantumRegister(3, 'q'), 0), Qubit(QuantumRegister(3, 'q'), 1), Qubit(QuantumRegister(3, 'q'), 2)), clbits=())"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grover= QuantumCircuit(3,3)\n",
    "\n",
    "for i in range(3):\n",
    "    grover.h(i)\n",
    "\n",
    "grover.barrier()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "346b8a7e",
   "metadata": {},
   "source": [
    "Then the oracle and the grover gate (since we have $2$ solutions in $N=8$ possibilities, one iteration is sufficient to obtain the _exact_ result):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "61655483",
   "metadata": {},
   "outputs": [],
   "source": [
    "grover = oracle(grover)\n",
    "grover = grover_gate(grover)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a0903cb",
   "metadata": {},
   "source": [
    "Don't forget to measure!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "ff8fd096",
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(grover.num_qubits):\n",
    "    grover.measure(i,i)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "455ba669",
   "metadata": {},
   "source": [
    "Print the circuit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2c10d9df",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1541.66x367.889 with 1 Axes>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# We can simply print the circuit \n",
    "#print(grover)\n",
    "\n",
    "# Or draw it just like in IBM Quantum Experience\n",
    "# to do this, install pylatexenc with 'pip install pylatexenc'\n",
    "# and then use the draw function\n",
    "\n",
    "grover.draw('mpl')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "982f38df",
   "metadata": {},
   "source": [
    "##### Run the algorithm on QASM\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a513f6e7",
   "metadata": {},
   "outputs": [],
   "source": [
    "backend = QasmSimulator()\n",
    "results = backend.run(grover, backend=backend, shots=2048).result()\n",
    "answer = results.get_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec0ca856",
   "metadata": {},
   "source": [
    "##### Visualize the results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "430848b1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAHNCAYAAAAAFUE1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvuElEQVR4nO3deVxVdeL/8TeILIKAuHBFUXEZl7Lsq4mopQVJbqO5xeTMoLm0YGWW/WTGfYkRTR0by5xFbVJzmW9mNqkMmk4jodlYimtlQRmgKVylQJTz+6MH59sVVGwuwYd5PR+P+3jkOZ9z7udeOPHy3HPQw7IsSwAAAAbxrOoJAAAA3CwCBgAAGIeAAQAAxiFgAACAcQgYAABgHAIGAAAYh4ABAADGIWAAAIBxCBgAAGAcAgaoRB4eHpo5c2ZVT8O2YMECtWzZUrVq1VKnTp2qejr/VVatWiUPDw99/vnnVfL87777rjw8PPTuu+9WeOymTZsqf2LAj0TAwFilPxBKH15eXmrSpIlGjRqlr776qqqnV669e/dq5syZysvL+8mfe8eOHXruuefUo0cPrVy5Us8///wNt/nnP/+pESNGqEmTJvL29lZQUJAiIyM1e/Zs5eTk/ASzrhyff/55hX+Y12Rr167VkiVLqnoawI/iVdUTAP5Ts2fPVkREhAoLC/X+++9r1apVeu+993T48GH5+vpW9fRc7N27V7NmzdKoUaMUHBz8kz73zp075enpqT//+c/y9va+4fjp06drzpw5atmypUaNGqWWLVuqsLBQBw4c0AsvvKDVq1fr008//QlmDne4++679d1337l87deuXavDhw9r4sSJVTcx4EciYGC8vn37qkuXLpKksWPHqkGDBpo/f762bNmiESNGVPHsqo/c3Fz5+flVKF7Wr1+vOXPmaMSIEfrrX/9aZpvFixdr8eLF192HZVkqLCyUn5/ffzRvd7p8+bJKSkqqeho/qcLCQnl7e8vT07PaBT3wn+AjJNQ4d911lySVOTtw7NgxDRs2TCEhIfL19VWXLl20ZcsWlzHFxcWaNWuW2rRpI19fX9WvX189e/ZUSkqKPaZ3797q3bt3mecdNWqUWrRocc15zZw5U5MnT5YkRURE2B99lV4TkZKSop49eyo4OFgBAQFq27atfvOb39zw9V6+fFlz5sxRq1at5OPjoxYtWug3v/mNioqK7DEeHh5auXKlCgoK7OddtWrVNfc5ffp0NWjQ4Jpna4KCgspc29OiRQsNGDBA27dvV5cuXeTn56dXXnlFkvTZZ59p+PDhCgkJUZ06ddStWze9/fbb9rY5OTny8vLSrFmzyjzX8ePH5eHhoT/84Q/2sry8PE2cOFHh4eHy8fFR69atNX/+fJc4Kf2YaOHChVqyZIn9/hw5cqTc15ydna3Ro0eradOm8vHxUePGjTVo0KAbXrPy8ccf22eofH195XA49PDDD+ubb7657naSVFJSopkzZyosLEx16tTRPffcoyNHjqhFixYaNWqUy9gbvYfS/1278vrrr2vq1Klq0qSJ6tSpI6fTWeYamN69e+vtt9/WF198YX9PXP39W1JSonnz5qlp06by9fVVdHS0PvnkE5cxvXv31q233qqPP/5YvXr1Up06ddS6dWv7+pndu3crMjJSfn5+atu2rf7xj3/c8H0BKoIzMKhxSn/g1KtXz16WkZGhHj16qEmTJpoyZYr8/f21YcMGDR48WH/729/0wAMPSPo+MpKSkjR27Fh17dpVTqdTH3zwgT788EPdd999/9G8hgwZohMnTmjdunVavHixGjRoIElq2LChMjIyNGDAAN12222aPXu2fHx89Mknn+hf//rXDfc7duxYrV69WsOGDdMzzzyj9PR0JSUl6ejRo3rjjTckSX/961+1YsUK7du3T3/6058kSd27dy93fydOnNCJEyc0duxYBQQE3NRrPH78uH7xi1/okUce0bhx49S2bVvl5OSoe/fu+vbbb/Xkk0+qfv36Wr16tX7+859r06ZNeuCBBxQaGqpevXppw4YNmjFjhss+169fr1q1amn48OGSpG+//Va9evXSV199pUceeUTNmjXT3r17lZiYqK+//rrMNR0rV65UYWGhxo8fLx8fH4WEhJR7Fmbo0KHKyMjQE088oRYtWig3N1cpKSnKzMy8bpimpKTos88+0+jRo+VwOJSRkaEVK1YoIyND77//vjw8PK65bWJiopKTkzVw4EDFxsbqo48+UmxsrAoLC13GVeQ9/KE5c+bI29tbzz77rIqKisqN0N/+9rfKz8/Xl19+aZ9Nu/rr/bvf/U6enp569tlnlZ+fr+TkZI0cOVLp6eku486fP68BAwYoLi5Ow4cP18svv6y4uDitWbNGEydO1KOPPqqHHnpICxYs0LBhw5SVlaW6dete830BKsQCDLVy5UpLkvWPf/zDOnPmjJWVlWVt2rTJatiwoeXj42NlZWXZY6Ojo62OHTtahYWF9rKSkhKre/fuVps2bexlt99+u9W/f//rPm+vXr2sXr16lVkeHx9vNW/e3GWZJGvGjBn2nxcsWGBJsk6dOuUybvHixZYk68yZMzd+4T9w8OBBS5I1duxYl+XPPvusJcnauXOny/z8/f1vuM8333zTkmQtWbLEZXlJSYl15swZl0dxcbG9vnnz5pYka9u2bS7bTZw40ZJk/fOf/7SXXbhwwYqIiLBatGhhXblyxbIsy3rllVcsSdahQ4dctu/QoYN177332n+eM2eO5e/vb504ccJl3JQpU6xatWpZmZmZlmVZ1qlTpyxJVmBgoJWbm3vd13z+/HlLkrVgwYIbvT1lfPvtt2WWrVu3zpJk7dmzx15W+v1a+rXPzs62vLy8rMGDB7tsO3PmTEuSFR8fby+r6Hu4a9cuS5LVsmXLMvMqXbdr1y57Wf/+/ct8z/5wbPv27a2ioiJ7+e9///syX6NevXpZkqy1a9fay44dO2ZJsjw9Pa3333/fXr59+3ZLkrVy5coyzwncLD5CgvFiYmLUsGFDhYeHa9iwYfL399eWLVvUtGlTSdK5c+e0c+dOjRgxQhcuXNDZs2d19uxZffPNN4qNjdXJkyftu5aCg4OVkZGhkydP/qSvofSC3jfffPOmrtH4+9//LkmaNGmSy/JnnnlGksp8xFARTqdTUtm/jefn56thw4Yuj4MHD7qMiYiIUGxsbJk5du3aVT179rSXBQQEaPz48fr888/tj3SGDBkiLy8vrV+/3h53+PBhHTlyRA8++KC9bOPGjbrrrrtUr149+2t59uxZxcTE6MqVK9qzZ4/L8w8dOlQNGza87msuvTbo3Xff1fnz52/wDpXdtlRhYaHOnj2rbt26SZI+/PDDa26Xmpqqy5cv6/HHH3dZ/sQTT5QZW9H3sFR8fLxbrj0aPXq0y9mb0o9nP/vsM5dxAQEBiouLs//ctm1bBQcHq3379oqMjLSXl/731dsDPwYBA+MtW7ZMKSkp2rRpk/r166ezZ8/Kx8fHXv/JJ5/IsixNmzatzA/g0o8rcnNzJX1/R1NeXp5+9rOfqWPHjpo8ebI+/vjjSn8NDz74oHr06KGxY8cqNDRUcXFx2rBhww1j5osvvpCnp6dat27tstzhcCg4OFhffPHFTc+l9NT+xYsXXZYHBAQoJSVFKSkp9rU8V4uIiCh3jm3bti2zvH379vZ6SWrQoIGio6O1YcMGe8z69evl5eWlIUOG2MtOnjypbdu2lflaxsTESPq/r+X15nQ1Hx8fzZ8/X++8845CQ0N19913Kzk5WdnZ2Tfc9ty5c3rqqacUGhoqPz8/NWzY0H7O/Pz8a25X+rqv/tqFhIS4fPxZOrYi72GpirzmimjWrJnLn0vndXXkNW3atMxHZUFBQQoPDy+zrLztgR+Da2BgvK5du9p3IQ0ePFg9e/bUQw89pOPHjysgIMCOgGeffbbM2YFSpT9E7r77bn366ad68803tWPHDv3pT3/S4sWLtXz5co0dO1bS9xfEWpZVZh9Xrlz50a/Bz89Pe/bs0a5du/T2229r27ZtWr9+ve69917t2LFDtWrVuu7217vO4ma1a9dO0vdnP37Iy8vLjoQvv/yy3G3/07/1x8XFafTo0Tp48KA6deqkDRs2KDo62r5eSPr+wtL77rtPzz33XLn7+NnPfvaj5jRx4kQNHDhQmzdv1vbt2zVt2jQlJSVp586duuOOO6653YgRI7R3715NnjxZnTp1sr/n7r///iq748ldd35d6/vu6u//a42r6PbAj8EZGNQotWrVUlJSkk6fPm3ftdKyZUtJUu3atRUTE1Pu44cXFIaEhGj06NFat26dsrKydNttt7nccVOvXr1yfxFdRc52XC80PD09FR0drUWLFunIkSOaN2+edu7cqV27dl1zm+bNm6ukpKTMR145OTnKy8tT8+bNbzinq7Vt21Zt2rTR5s2bVVBQcNPblzfH48ePl1l+7Ngxe32pwYMHy9vbW+vXr9fBgwd14sQJl48mJKlVq1a6ePHiNb+WV581uBmtWrXSM888ox07dujw4cO6dOmSXnjhhWuOP3/+vFJTUzVlyhTNmjVLDzzwgO677z77e+56Sl/31Xf1fPPNN2XOUNzMe3gz3Bm+wE+NgEGN07t3b3Xt2lVLlixRYWGhGjVqpN69e+uVV17R119/XWb8mTNn7P+++tbXgIAAtW7d2uWW5FatWunYsWMu23300UcVumPI399fksoE0Llz58qMLf1V/z987qv169dPksrcebNo0SJJUv/+/W84p/LMnDlTZ8+e1bhx41RcXFxm/c38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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'110': 1032, '101': 1016}\n"
     ]
    }
   ],
   "source": [
    "plt.suptitle(\"Results of Grover's algorithm\")\n",
    "plt.bar(answer.keys(), answer.values(), color='royalblue')\n",
    "plt.show()\n",
    "\n",
    "print(answer)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "95d1302f",
   "metadata": {},
   "source": [
    "As you can see, the results are exactly what we expected! Since we prepared a equiprobable superposition of the two result states, half of the time we get $|101\\rangle$ and the other half $|110\\rangle$.\n",
    "\n",
    "In this case we have only the solutions of the problem as outcome of the measurements, because with one rotation you have exactly the superposition of the solutions.\n",
    "\n",
    "In general, the aim of the Grover's algorithm is to get as close as possibile to the superposition of the solutions, in order to have statistically the right answers."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a6f199a",
   "metadata": {},
   "source": [
    "### _Extra_ : Run with noise model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0b73411f",
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit_aer.noise import NoiseModel\n",
    "from qiskit.providers.fake_provider import GenericBackendV2\n",
    "\n",
    "fake_backend = GenericBackendV2(num_qubits=3)\n",
    "noise_model = NoiseModel.from_backend(fake_backend)\n",
    "shots = 2048 \n",
    "\n",
    "results = fake_backend.run(grover, backend=fake_backend, shots=shots,noise_model = noise_model).result()\n",
    "answer = results.get_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "8fb02ac7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAHNCAYAAAAAFUE1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0AklEQVR4nO3deXhU9b3H8U9CyELCJIQlQyBAQAqkReklJQaooKQEWSrKYmraBmRpNWgRxQut7NiUqECxSKTtBdoqgvSKFiuSBoW2xIBYFMKqokFxEjAkA9GELOf+4ZNzHRIgwITkF9+v55nnYX7nd875/s6Z5cNZJj6WZVkCAAAwiG9DFwAAAHClCDAAAMA4BBgAAGAcAgwAADAOAQYAABiHAAMAAIxDgAEAAMYhwAAAAOMQYAAAgHEIMEA98vHx0fz58xu6DNsTTzyhrl27qlmzZurTp09Dl/ONsnbtWvn4+Oijjz5qkPW/+eab8vHx0Ztvvlnnvps2bar/woCrRICBsaq/EKoffn5+6tChgyZMmKBPP/20ocur1a5duzR//nwVFRVd93Vv27ZNjz76qAYMGKA1a9bo17/+9WXn+ec//6nx48erQ4cO8vf3V2hoqOLi4rRw4ULl5+dfh6rrx0cffVTnL/Om7Pnnn9fy5csbugzgqvg1dAHAtVq4cKGio6NVWlqqt956S2vXrtW//vUvHThwQIGBgQ1dnoddu3ZpwYIFmjBhgsLCwq7rurdv3y5fX1/98Y9/lL+//2X7z507V4sWLVLXrl01YcIEde3aVaWlpdq7d6+eeuoprVu3Th988MF1qBzecMstt+jLL7/02PfPP/+8Dhw4oOnTpzdcYcBVIsDAeLfffrtiY2MlSZMnT1abNm20ZMkSvfLKKxo/fnwDV9d4FBQUKCgoqE7hZcOGDVq0aJHGjx+vP//5zzXmWbZsmZYtW3bJZViWpdLSUgUFBV1T3d5UUVGhqqqqhi7juiotLZW/v798fX0bXaAHrgWnkNDkfP/735ekGkcHDh8+rLFjxyo8PFyBgYGKjY3VK6+84tGnvLxcCxYsUPfu3RUYGKjWrVtr4MCByszMtPsMHjxYgwcPrrHeCRMmqEuXLheta/78+Zo5c6YkKTo62j71VX1NRGZmpgYOHKiwsDCFhISoR48e+uUvf3nZ8VZUVGjRokXq1q2bAgIC1KVLF/3yl79UWVmZ3cfHx0dr1qxRSUmJvd61a9dedJlz585VmzZtLnq0JjQ0tMa1PV26dNHIkSP1+uuvKzY2VkFBQXr22WclSR9++KHGjRun8PBwtWjRQjfffLNeffVVe978/Hz5+flpwYIFNdZ15MgR+fj46He/+53dVlRUpOnTpysqKkoBAQG64YYbtGTJEo9wUn2a6Mknn9Ty5cvt7XPw4MFax+xyuTRx4kR17NhRAQEBat++ve64447LXrPy3nvv2UeoAgMD5XQ6de+99+rzzz+/5HySVFVVpfnz5ysyMlItWrTQrbfeqoMHD6pLly6aMGGCR9/LbUPp/69deeGFF/TYY4+pQ4cOatGihdxud41rYAYPHqxXX31VH3/8sf2auPD1W1VVpccff1wdO3ZUYGCghgwZovfff9+jz+DBg/Wd73xH7733ngYNGqQWLVrohhtusK+f2bFjh+Li4hQUFKQePXroH//4x2W3C1AXHIFBk1P9hdOqVSu7LTc3VwMGDFCHDh00a9YsBQcHa+PGjRo9erT++te/6s4775T0VchIS0vT5MmT1a9fP7ndbr399tt655139IMf/OCa6rrrrrt09OhRrV+/XsuWLVObNm0kSW3btlVubq5GjhypG2+8UQsXLlRAQIDef/99/fvf/77scidPnqx169Zp7Nixevjhh5WTk6O0tDQdOnRIL730kiTpz3/+s1avXq3du3frD3/4gySpf//+tS7v6NGjOnr0qCZPnqyQkJArGuORI0f0ox/9SD/72c80ZcoU9ejRQ/n5+erfv7+++OILPfjgg2rdurXWrVunH/7wh9q0aZPuvPNORUREaNCgQdq4caPmzZvnscwNGzaoWbNmGjdunCTpiy++0KBBg/Tpp5/qZz/7mTp16qRdu3Zp9uzZ+uyzz2pc07FmzRqVlpZq6tSpCggIUHh4eK1HYcaMGaPc3Fw98MAD6tKliwoKCpSZmam8vLxLBtPMzEx9+OGHmjhxopxOp3Jzc7V69Wrl5ubqrbfeko+Pz0XnnT17ttLT0zVq1CglJibq3XffVWJiokpLSz361WUbft2iRYvk7++vRx55RGVlZbWG0F/96lcqLi7WJ598Yh9Nu3B//+Y3v5Gvr68eeeQRFRcXKz09XcnJycrJyfHod+bMGY0cOVJJSUkaN26cVq1apaSkJD333HOaPn26fv7zn+uee+7RE088obFjx+rEiRNq2bLlRbcLUCcWYKg1a9ZYkqx//OMf1qlTp6wTJ05YmzZtstq2bWsFBARYJ06csPsOGTLE6t27t1VaWmq3VVVVWf3797e6d+9ut910003WiBEjLrneQYMGWYMGDarRnpKSYnXu3NmjTZI1b948+/kTTzxhSbKOHz/u0W/ZsmWWJOvUqVOXH/jX7Nu3z5JkTZ482aP9kUcesSRZ27dv96gvODj4sst8+eWXLUnW8uXLPdqrqqqsU6dOeTzKy8vt6Z07d7YkWVu3bvWYb/r06ZYk65///KfddvbsWSs6Otrq0qWLVVlZaVmWZT377LOWJGv//v0e88fExFi33Xab/XzRokVWcHCwdfToUY9+s2bNspo1a2bl5eVZlmVZx48ftyRZDofDKigouOSYz5w5Y0mynnjiicttnhq++OKLGm3r16+3JFk7d+6026pfr9X73uVyWX5+ftbo0aM95p0/f74lyUpJSbHb6roN33jjDUuS1bVr1xp1VU9744037LYRI0bUeM1+vW+vXr2ssrIyu/23v/1tjX00aNAgS5L1/PPP222HDx+2JFm+vr7WW2+9Zbe//vrrliRrzZo1NdYJXClOIcF4CQkJatu2raKiojR27FgFBwfrlVdeUceOHSVJhYWF2r59u8aPH6+zZ8/q9OnTOn36tD7//HMlJibq2LFj9l1LYWFhys3N1bFjx67rGKov6H355Zev6BqNv//975KkGTNmeLQ//PDDklTjFENduN1uSTX/N15cXKy2bdt6PPbt2+fRJzo6WomJiTVq7NevnwYOHGi3hYSEaOrUqfroo4/sUzp33XWX/Pz8tGHDBrvfgQMHdPDgQd19991224svvqjvf//7atWqlb0vT58+rYSEBFVWVmrnzp0e6x8zZozatm17yTFXXxv05ptv6syZM5fZQjXnrVZaWqrTp0/r5ptvliS98847F50vKytLFRUVuv/++z3aH3jggRp967oNq6WkpHjl2qOJEyd6HL2pPj374YcfevQLCQlRUlKS/bxHjx4KCwtTr169FBcXZ7dX//vC+YGrQYCB8VauXKnMzExt2rRJw4cP1+nTpxUQEGBPf//992VZlubMmVPjC7j6dEVBQYGkr+5oKioq0re+9S317t1bM2fO1HvvvVfvY7j77rs1YMAATZ48WREREUpKStLGjRsvG2Y+/vhj+fr66oYbbvBodzqdCgsL08cff3zFtVQf2j937pxHe0hIiDIzM5WZmWlfy3Oh6OjoWmvs0aNHjfZevXrZ0yWpTZs2GjJkiDZu3Gj32bBhg/z8/HTXXXfZbceOHdPWrVtr7MuEhARJ/78vL1XThQICArRkyRK99tprioiI0C233KL09HS5XK7LzltYWKhf/OIXioiIUFBQkNq2bWuvs7i4+KLzVY/7wn0XHh7ucfqzum9dtmG1uoy5Ljp16uTxvLquC0Nex44da5wqCw0NVVRUVI222uYHrgbXwMB4/fr1s+9CGj16tAYOHKh77rlHR44cUUhIiB0CHnnkkRpHB6pVf4nccsst+uCDD/Tyyy9r27Zt+sMf/qBly5YpIyNDkydPlvTVBbGWZdVYRmVl5VWPISgoSDt37tQbb7yhV199VVu3btWGDRt02223adu2bWrWrNkl57/UdRZXqmfPnpK+OvrxdX5+fnZI+OSTT2qd91r/15+UlKSJEydq37596tOnjzZu3KghQ4bY1wtJX11Y+oMf/ECPPvporcv41re+dVU1TZ8+XaNGjdLmzZv1+uuva86cOUpLS9P27dv13e9+96LzjR8/Xrt27dLMmTPVp08f+zU3bNiwBrvjyVt3fl3sdXfh6/9i/eo6P3A1OAKDJqVZs2ZKS0vTyZMn7btWunbtKklq3ry5EhISan18/YLC8PBwTZw4UevXr9eJEyd04403etxx06pVq1p/iK4uRzsuFTR8fX01ZMgQLV26VAcPHtTjjz+u7du364033rjoPJ07d1ZVVVWNU175+fkqKipS586dL1vThXr06KHu3btr8+bNKikpueL5a6vxyJEjNdoPHz5sT682evRo+fv7a8OGDdq3b5+OHj3qcWpCkrp166Zz585ddF9eeNTgSnTr1k0PP/ywtm3bpgMHDuj8+fN66qmnLtr/zJkzysrK0qxZs7RgwQLdeeed+sEPfmC/5i6letwX3tXz+eef1zhCcSXb8Ep4M/gC1xsBBk3O4MGD1a9fPy1fvlylpaVq166dBg8erGeffVafffZZjf6nTp2y/33hra8hISG64YYbPG5J7tatmw4fPuwx37vvvlunO4aCg4MlqUYAKiwsrNG3+qf+v77uCw0fPlySatx5s3TpUknSiBEjLltTbebPn6/Tp09rypQpKi8vrzH9Sv4HPXz4cO3evVvZ2dl2W0lJiVavXq0uXbooJibGbg8LC1NiYqI2btyoF154Qf7+/ho9erTH8saPH6/s7Gy9/vrrNdZVVFSkioqKOtdW7Ysvvqhx50+3bt3UsmXLS27/6iMMF26Puvy67ZAhQ+Tn56dVq1Z5tH/9dvFqV7INr0RwcPAlT3MBjRmnkNAkzZw5U+PGjdPatWv185//XCtXrtTAgQPVu3dvTZkyRV27dlV+fr6ys7P1ySef6N1335UkxcTEaPDgwerbt6/Cw8P19ttva9OmTZo2bZq97HvvvVdLly5VYmKiJk2apIKCAmVkZOjb3/62fQHsxfTt21fSV7ewJiUlqXnz5ho1apQWLlyonTt3asSIEercubMKCgr0zDPPqGPHjh4Xbl7opptuUkpKilavXq2ioiINGjRIu3fv1rp16zR69GjdeuutV7X97rnnHh04cEBpaWnavXu3kpKSFB0drZKSEh04cEDr169Xy5Yta1yrUZtZs2Zp/fr1uv322/Xggw8qPDxc69at0/Hjx/XXv/5Vvr6e/4+6++679eMf/1jPPPOMEhMTa/xi8cyZM/XKK69o5MiRmjBhgvr27auSkhLt379fmzZt0kcffeRxyqkujh49qiFDhmj8+PGKiYmRn5+fXnrpJeXn59c4AvR1DofDvl6mvLxcHTp00LZt23T8+PHLrjMiIkK/+MUv9NRTT+mHP/yhhg0bpnfffVevvfaa2rRp43F05Eq3YV317dtXGzZs0IwZM/S9731PISEhGjVq1FUtC7juGvIWKOBaVN+WumfPnhrTKisrrW7dulndunWzKioqLMuyrA8++MD66U9/ajmdTqt58+ZWhw4drJEjR1qbNm2y51u8eLHVr18/KywszAoKCrJ69uxpPf7449b58+c9lv+Xv/zF6tq1q+Xv72/16dPHev311+t0G7VlfXUbcIcOHSxfX1/7ttqsrCzrjjvusCIjIy1/f38rMjLS+tGPflTjVuHalJeXWwsWLLCio6Ot5s2bW1FRUdbs2bM9bhm3rLrfRv11b775pjV27Firffv2VvPmzS2Hw2HFxsZa8+bNsz777DOPvp07d77oLegffPCBNXbsWCssLMwKDAy0+vXrZ23ZsqXWvm632woKCrIkWX/5y19q7XP27Flr9uzZ1g033GD5+/tbbdq0sfr37289+eST9r6qvo26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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'011': 1, '111': 5, '100': 9, '110': 1037, '001': 10, '000': 2, '010': 7, '101': 977}\n"
     ]
    }
   ],
   "source": [
    "plt.suptitle(\"Results of Grover's algorithm\")\n",
    "plt.bar(answer.keys(), answer.values(), color='royalblue')\n",
    "plt.show()\n",
    "\n",
    "print(answer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e42ae8ed",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "jupytext": {
   "formats": "ipynb,md"
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
