{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e078160b",
   "metadata": {},
   "source": [
    "# Quantum information and quantum computing - Problem set 07\n",
    "\n",
    "### _Problem 1_ : Shor's algorithm for factoring 15"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8dcd1b7d",
   "metadata": {},
   "source": [
    "In this notebook we are going to see how to implement a simple circuit of 6 qubits to factorize $N = 15$ using Python and the Qiskit quantum library provided by IBM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f3cfb179",
   "metadata": {},
   "outputs": [],
   "source": [
    "# First, import all the useful methods\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt   \n",
    "import math\n",
    "\n",
    "from qiskit_aer import QasmSimulator\n",
    "from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "af26ab65",
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit_ibm_runtime import QiskitRuntimeService\n",
    "\n",
    "# Save your credentials on disk.\n",
    "# QiskitRuntimeService.save_account(channel='ibm_quantum', token=<IBM Quantum API key>)\n",
    "\n",
    "service = QiskitRuntimeService(\n",
    "    channel='ibm_quantum',\n",
    "    instance='ibm-q/open/main',\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "036c751b",
   "metadata": {},
   "source": [
    "We will surely need the circuit for $\\text{QFT}^\\dagger$, so we will create a function to do it"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "44cc7309",
   "metadata": {},
   "outputs": [],
   "source": [
    "def qft_dagger(circ, n):\n",
    "    \"\"\"n-qubit QFTdagger the first n qubits in circ\"\"\"\n",
    "    # Don't forget the Swaps!\n",
    "    for qubit in range(n//2):\n",
    "        circ.swap(qubit, n-qubit-1)\n",
    "    for j in range(n):\n",
    "        for m in range(j):\n",
    "            circ.cp(-math.pi/float(2**(j-m)), m, j)\n",
    "        circ.h(j)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7234bfe0",
   "metadata": {},
   "outputs": [],
   "source": [
    "c =QuantumCircuit(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "60783cbc",
   "metadata": {},
   "outputs": [],
   "source": [
    "qft_dagger(c, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "68658814",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<pre style=\"word-wrap: normal;white-space: pre;background: #fff0;line-height: 1.1;font-family: &quot;Courier New&quot;,Courier,monospace\">        ┌───┐                                        \n",
       "q_0: ─X─┤ H ├─■──────────────■───────────────────────\n",
       "      │ └───┘ │P(-π/2) ┌───┐ │                       \n",
       "q_1: ─┼───────■────────┤ H ├─┼─────────■─────────────\n",
       "      │                └───┘ │P(-π/4)  │P(-π/2) ┌───┐\n",
       "q_2: ─X──────────────────────■─────────■────────┤ H ├\n",
       "                                                └───┘</pre>"
      ],
      "text/plain": [
       "        ┌───┐                                        \n",
       "q_0: ─X─┤ H ├─■──────────────■───────────────────────\n",
       "      │ └───┘ │P(-π/2) ┌───┐ │                       \n",
       "q_1: ─┼───────■────────┤ H ├─┼─────────■─────────────\n",
       "      │                └───┘ │P(-π/4)  │P(-π/2) ┌───┐\n",
       "q_2: ─X──────────────────────■─────────■────────┤ H ├\n",
       "                                                └───┘"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c.draw()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a898ed03",
   "metadata": {},
   "source": [
    "Suppose now we have already made the first three steps in the Shor's algorithm and we obtained the random number $y=4$. We have that\n",
    "\n",
    "\\begin{equation*}\n",
    "\\text{gcd}(y,15) = 1\n",
    "\\end{equation*}\n",
    "\n",
    "so we can proceed with the order-finding algorithm.\n",
    "\n",
    "#### Build the circuit\n",
    "First, we have to build the circuit. For this, we will assume that the possibile period for $y=4$ is a $2$-qubit number. This assumption is justified since we expect a small number.\n",
    "\n",
    "Therefore, together with the $4$ qubits useful to represent the number from $0$ to $15$, we need a $6$-qubits circuit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d6bd9760",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 203.28x618.722 with 1 Axes>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Construct the different register\n",
    "\n",
    "first_register   = QuantumRegister(2,name=\"a\")\n",
    "second_register  = QuantumRegister(4,name=\"s\")\n",
    "classic_register = ClassicalRegister(2, name=\"c\")\n",
    "\n",
    "# Put together the circuit\n",
    "shor_circ = QuantumCircuit(first_register,second_register,classic_register)\n",
    "\n",
    "\n",
    "# In the first register , create the superposition of all the possible states\n",
    "\n",
    "shor_circ.h(first_register[0])\n",
    "shor_circ.h(first_register[1])\n",
    "\n",
    "# And prepare the state |1>_L in the second register\n",
    "\n",
    "shor_circ.x(second_register[0])\n",
    "\n",
    "shor_circ.draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8442f12d",
   "metadata": {},
   "source": [
    "Now we need the circuit for modular exponentiation. Usually this step is the bottleneck for Shor's algorithm, since we have to apply the c-$U^{2^n}$ gates. In this case, we will contruct directly a unitary that performs\n",
    "\n",
    "\\begin{equation*}\n",
    "U | z \\rangle_{2}|1\\rangle_{4} = | z \\rangle_{2} |4^z(\\text{mod}15)\\rangle_{4}\n",
    "\\end{equation*}\n",
    "\n",
    "\n",
    "This can be constructed simply by looking at the possible outcome of this operation\n",
    "\n",
    "| z | 4^z(mod15) |\n",
    "|---|------------|\n",
    "| 0 | 1          |\n",
    "| 1 | 4          |\n",
    "| 2 | 1          |\n",
    "| 3 | 4          |"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "41434ca2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 370.502x618.722 with 1 Axes>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# a double CNOT on first qubit, we must put the first qubit of the second register to 0 and the third to 1\n",
    "# when the first qubit of the first register is in 1 (representing 1=01 and 3=11)\n",
    "shor_circ.cx(first_register[0],second_register[0])\n",
    "shor_circ.cx(first_register[0],second_register[2])\n",
    "\n",
    "shor_circ.draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f2a2e42",
   "metadata": {},
   "source": [
    "Then we can apply the $\\text{QFT}^\\dagger$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ee7c4da7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "CircuitInstruction(operation=Instruction(name='barrier', num_qubits=6, num_clbits=0, params=[]), qubits=(Qubit(QuantumRegister(2, 'a'), 0), Qubit(QuantumRegister(2, 'a'), 1), Qubit(QuantumRegister(4, 's'), 0), Qubit(QuantumRegister(4, 's'), 1), Qubit(QuantumRegister(4, 's'), 2), Qubit(QuantumRegister(4, 's'), 3)), clbits=())"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shor_circ.barrier()\n",
    "qft_dagger(shor_circ,2)\n",
    "shor_circ.barrier()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a931320b",
   "metadata": {},
   "source": [
    "and measure the first two qubits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b6a44d5a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<qiskit.circuit.instructionset.InstructionSet at 0x11d353910>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shor_circ.measure(first_register[0],classic_register[0])\n",
    "shor_circ.measure(first_register[1],classic_register[1]) "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "83c87c7f",
   "metadata": {},
   "source": [
    "The whole circuit looks like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9c266502",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1123x618.722 with 1 Axes>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "shor_circ.draw(\"mpl\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97a3e678",
   "metadata": {},
   "source": [
    "#### Run the circuit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "af2c245b",
   "metadata": {},
   "outputs": [],
   "source": [
    "backend = QasmSimulator()\n",
    "shots = 2048 # it is interesting seeing a single shot, since statistically we will get all the answers\n",
    "results = backend.run(shor_circ, backend=backend, shots=shots).result()\n",
    "answer = results.get_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c06530da",
   "metadata": {},
   "source": [
    "#### Print the results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "dd1c67fc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAHNCAYAAAAAFUE1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxOklEQVR4nO3de1xVdaL//zd3EAREuUihonlSy9SBRBRLk4nUPDLRhSRD8zIp2lFSRyfvmZQ5apqKTpNa2WR2sbI0DR09JaFiNmWKlzE1/QKaAUmKCuv3Rw/Wzy2Y1tmEH309H4/9eMRan73WZ+/thldrrwUulmVZAgAAMIhrbU8AAADg1yJgAACAcQgYAABgHAIGAAAYh4ABAADGIWAAAIBxCBgAAGAcAgYAABiHgAEAAMYhYICLuLi4aPLkybU9Ddvzzz+vpk2bys3NTW3btq2VOfyez8mpU6c0cOBAhYWFycXFRSNGjNC3334rFxcXLV261Gn7qW6bkydPlouLi9P2URNqe45Lly6Vi4uLvv322yseu3379pqfGK47BAx+V5Xf0Cpv7u7uuuGGG9SvXz8dPXq0tqdXrS1btmjy5MkqKir63fe9bt06jRkzRp06ddKSJUs0ffr0330Ov7fp06dr6dKlGjJkiF599VX17du3tqeEy1iwYIFT4xK4Eu61PQFcn6ZOnarIyEidOXNGn3/+uZYuXapPP/1UX3/9tby9vWt7eg62bNmiKVOmqF+/fgoMDPxd971hwwa5urrqH//4hzw9PX/XfdeWDRs2qEOHDpo0aZK9zLIsnT59Wh4eHjW67/Hjx2vs2LE1ug/T9e3bV8nJyfLy8rKXLViwQA0aNFC/fv1qb2K47hAwqBXdu3dXdHS0JGngwIFq0KCBnnvuOb3//vt68MEHa3l2V4/CwkL5+PjUeLyUlpbK19e3RvdR6cyZM/L09JSra/UHgAsLC9WqVSuHZS4uLr9L2Lq7u8vdnW+L1an8N+Lm5iY3N7fang7AR0i4OnTu3FmSdODAAYfle/bs0f3336+goCB5e3srOjpa77//vsOYc+fOacqUKWrevLm8vb1Vv359xcXFaf369faYLl26qEuXLlX2269fPzVp0uSS85o8ebJGjx4tSYqMjLQ/+qr8/H/9+vWKi4tTYGCg/Pz8dPPNN+uvf/3rZR/v+fPn9fTTT6tZs2by8vJSkyZN9Ne//lVlZWX2GBcXFy1ZskSlpaX2fi93mH7lypWKioqSj4+PGjRooEceeaTKR3P9+vWTn5+fDhw4oB49eqhu3bpKSUmRJJWVlWnkyJEKDg5W3bp19d///d/67rvvqt3X0aNH9dhjjyk0NFReXl665ZZb9PLLLzuM+de//iUXFxe98cYbGj9+vG644QbVqVNHJSUlVbZXOfbgwYP68MMPHZ7r6s5XqXwcR48eVWJiovz8/BQcHKxRo0apvLzcYdtFRUXq16+fAgICFBgYqNTU1Go/Eqzu/BIXFxcNGzZMq1at0q233mo/1rVr11b7GKKjo+Xt7a1mzZpp0aJFV3zOyv/+7//qgQceUKNGjeTl5aWIiAiNHDlSp0+fvux9T58+rSeeeEINGjSwX7ejR49We+7SF198oe7du8vf319+fn7q1q2bPv/8c4cxlR/1btq0SUOHDlVISIhuvPFGh3WV74EmTZpo165d2rRpk/2aXfxeKysrU3p6uoKDg+Xr66s//elPOn78uMOYJk2a6N5777WfQx8fH7Vu3Vr/+te/JEnvvPOOWrduLW9vb0VFRemLL7647POCaxv/q4GrQuU3w3r16tnLdu3apU6dOumGG27Q2LFj5evrqzfffFOJiYl6++239ac//UnSzz90MjIyNHDgQLVv314lJSXavn27duzYoT/+8Y//p3ndd9992rt3r/75z39q9uzZatCggSQpODhYu3bt0r333qvbbrtNU6dOlZeXl/bv36/PPvvsstsdOHCgli1bpvvvv19PPvmkcnJylJGRod27d+vdd9+VJL366qtavHixtm7dqpdeekmS1LFjx0tuc+nSperfv79uv/12ZWRkqKCgQC+88II+++wzffHFFw4ff50/f14JCQmKi4vTzJkzVadOHXter732mvr06aOOHTtqw4YN6tmzZ5V9FRQUqEOHDvYP9+DgYK1Zs0YDBgxQSUmJRowY4TD+6aeflqenp0aNGqWysrJqjyi1bNlSr776qkaOHKkbb7xRTz75pP1cX/zDrlJ5ebkSEhIUExOjmTNn6pNPPtHf/vY3NWvWTEOGDJH088dPvXv31qeffqrHH39cLVu21LvvvqvU1NRLPpcX+/TTT/XOO+9o6NChqlu3rubOnaukpCQdPnxY9evXl/RzGNxzzz1q2LChpkyZovLyck2dOlXBwcFX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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'00': 1016, '10': 1032}\n"
     ]
    }
   ],
   "source": [
    "plt.suptitle(\"Results of order finding algorithm\")\n",
    "plt.bar(answer.keys(), answer.values(), color='royalblue')\n",
    "plt.show()\n",
    "\n",
    "print(answer)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f377ae0d",
   "metadata": {},
   "source": [
    "#### Continue the algorithm\n",
    "\n",
    "If the result of the circuit is $\\text{'00'} = 0$ the algorithm fails, if it returns $\\text{'10'}=2$\n",
    "we can continue: since the first register has $2$ qubits we have $2^2$ possible states\n",
    "we don't need the continued-fraction algorithm, since $\\frac{2}{4}= \\frac{1}{2}$ and $r= 2$.\n",
    "\n",
    "\n",
    "$4^1 \\neq -1 (\\text{mod}15)$ therefore $4^1$ is a solution.\n",
    "\n",
    "We can compute \n",
    "\n",
    "\\begin{align*}\n",
    "\\text{gcd}(5,15) & = 5 \\\\\n",
    "\\text{gcd}(3,15) & = 3 \n",
    "\\end{align*}\n",
    "\n",
    "\n",
    "and we have found both the factor of $N = 15$"
   ]
  }
 ],
 "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
}
