{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Three Qubit Gates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from qiskit import *\n",
    "from math import pi\n",
    "import numpy as np\n",
    "from qiskit.visualization import *\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Three-qubit gates\n",
    "\n",
    "\n",
    "There are two commonly-used three-qubit gates. For three qubits, the basis vectors are ordered as\n",
    "\n",
    "$$\\left|000\\right\\rangle, \\left|001\\right\\rangle, \\left|010\\right\\rangle, \\left|011\\right\\rangle, \\left|100\\right\\rangle, \\left|101\\right\\rangle, \\left|110\\right\\rangle, \\left|111\\right\\rangle,$$\n",
    "\n",
    "which, as bitstrings, represent the integers $0,1,2,\\cdots, 7$. Again, Qiskit uses a representation in which the first qubit is on the right-most side of the tensor product and the third qubit is on the left-most side:\n",
    "\n",
    "$$\\left|abc\\right\\rangle : \\underset{\\text{qubit 2}}{\\left|a\\right\\rangle}\\otimes \\underset{\\text{qubit 1}}{\\left|b\\right\\rangle}\\otimes \\underset{\\text{qubit 0}}{\\left|c\\right\\rangle}.$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Toffoli gate ($ccx$ gate)\n",
    "\n",
    "The [Toffoli gate](https://en.wikipedia.org/wiki/Quantum_logic_gate#Toffoli_(CCNOT)_gate) flips the third qubit if the first two qubits (LSB) are both $\\left|1\\right\\rangle$:\n",
    "\n",
    "$$\\left|abc\\right\\rangle \\rightarrow \\left|bc\\oplus a\\right\\rangle \\otimes \\left|b\\right\\rangle \\otimes \\left|c\\right\\rangle.$$\n",
    "\n",
    "In matrix form, the Toffoli gate is\n",
    "$$\n",
    "C_{CX} = \n",
    "\\begin{pmatrix}\n",
    "1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\\n",
    "0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\\\\n",
    "0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\\\\n",
    "0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\\\\\n",
    "0 & 0 & 0 & 0 & 1 & 0 & 0 & 0\\\\\n",
    "0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\\\\n",
    "0 & 0 & 0 & 0 & 0 & 0 & 1 & 0\\\\\n",
    "0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\n",
    "\\end{pmatrix}.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-22T14:44:29.306703Z",
     "start_time": "2019-08-22T14:44:29.298815Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 238.392x204.68 with 1 Axes>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qc = QuantumCircuit(3)\n",
    "qc.ccx(0,1,2)\n",
    "qc.draw(output='mpl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-22T14:44:29.342102Z",
     "start_time": "2019-08-22T14:44:29.308539Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]]\n"
     ]
    }
   ],
   "source": [
    "backend = Aer.get_backend('unitary_simulator')\n",
    "job = execute(qc, backend)\n",
    "result = job.result()\n",
    "print(result.get_unitary(qc, decimals=3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Controlled swap gate (Fredkin Gate)\n",
    "\n",
    "The [Fredkin gate](https://en.wikipedia.org/wiki/Quantum_logic_gate#Fredkin_(CSWAP)_gate), or the _controlled swap gate_, exchanges the second and third qubits if the first qubit (LSB) is $\\left|1\\right\\rangle$:\n",
    "\n",
    "$$ \\left|abc\\right\\rangle \\rightarrow \\begin{cases} \\left|bac\\right\\rangle~~\\text{if}~c=1 \\cr \\left|abc\\right\\rangle~~\\text{if}~c=0 \\end{cases}.$$\n",
    "\n",
    "In matrix form, the Fredkin gate is\n",
    "\n",
    "$$\n",
    "C_{\\mathrm{SWAP}} = \n",
    "\\begin{pmatrix}\n",
    "1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\\\\n",
    "0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\\\\n",
    "0 & 0 & 1 & 0 & 0 & 0 & 0 & 0\\\\\n",
    "0 & 0 & 0 & 0 & 0 & 1 & 0 & 0\\\\\n",
    "0 & 0 & 0 & 0 & 1 & 0 & 0 & 0\\\\\n",
    "0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\\\\\n",
    "0 & 0 & 0 & 0 & 0 & 0 & 1 & 0\\\\\n",
    "0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\n",
    "\\end{pmatrix}.\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-22T14:44:29.351500Z",
     "start_time": "2019-08-22T14:44:29.345440Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 238.392x204.68 with 1 Axes>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qc = QuantumCircuit(3)\n",
    "qc.cswap(0,1,2)\n",
    "qc.draw(output='mpl')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2019-08-22T14:44:29.393122Z",
     "start_time": "2019-08-22T14:44:29.353155Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j 0.+0.j]\n",
      " [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j 1.+0.j]]\n"
     ]
    }
   ],
   "source": [
    "backend = Aer.get_backend('unitary_simulator')\n",
    "job = execute(qc, backend)\n",
    "result = job.result()\n",
    "print(result.get_unitary(qc, decimals=3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "-------------"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "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.3"
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}