{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Symbolic Quantum Computing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "from IPython.display import display"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sympy import init_printing\n",
    "init_printing(use_latex=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sympy import sqrt, symbols, Rational\n",
    "from sympy import expand, Eq, Symbol, simplify, exp, sin, srepr\n",
    "from sympy.physics.quantum import *\n",
    "from sympy.physics.quantum.qubit import *\n",
    "from sympy.physics.quantum.gate import *\n",
    "from sympy.physics.quantum.grover import *\n",
    "from sympy.physics.quantum.qft import QFT, IQFT, Fourier\n",
    "from sympy.physics.quantum.circuitplot import circuit_plot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qubits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "alpha, beta = symbols('alpha beta', real=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHYAAAAWBAMAAADnfXV4AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXaZRCLdEO9Uu81m\nqzIdlvb2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACBklEQVQ4EaWTMWhTQRjH/315L2dqkiYhwUqG\nBjoUoba1OAhBDLg52Ewi4tChpR0fBScH69BVXzsUtxRKEUqVTC6PQnRyKBjQVc0iLpYoDp0K/b67\n9+Xde7j5Df/8+d/3u7vc3QOi+imGfgPL29buyVkDVct/sbxY76QNu6fQkhFQrm68Hxg5jeORu6be\nJthifzRE+eVArRrJ+nEeufwA9zT7isdY1uKeKj4CdSNOT/IdMY+BXd7b5+++EczKEO/5DdDxtaiu\n5CO2AXzV687zuixPpYfZc2Ap0IIDyS3W3Uqy421qqky3SKvqL7EzLA1sp1n3x+I7P8nmSsCDltry\nAlS9P8CwxlJCNs06qnxrkGSxDDwH9h2a06MlhzWWEjKtCJY9jwFON8XeROYMaNJQYs/m8uphuB6G\nxzyNA7i/U+wpLu0Bk1eis+rwWXUC8H/RJeveB/KbKXYbz6htKmD2EPjka4E+Q4aFpaZCP8UeYKJH\nLHXpt9Hkt9EEHjHHJWwXeNhOst4eMn3k7xR9yrOBemEEVzVosUcorvD85lnotzFGmy2f9DIVzlXl\nOn0LLHz8pqJ13V+Vsq/Z2y+Pe9AyukczpxDugriIpXvgsr9B3DVZOi8MJH9izL/Yb9KTnNN65qZh\nw/zY68bfS5L9EE9pHF0vl83mGzrSMhdbvLa8be2ecTq7/6gLyNGDwpXbGDUAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$\\alpha {\\left|00\\right\\rangle } + \\beta {\\left|11\\right\\rangle }$$"
      ],
      "text/plain": [
       "α⋅❘00⟩ + β⋅❘11⟩"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "psi = alpha*Qubit('00') + beta*Qubit('11'); psi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHcAAAAWBAMAAAAIvx5GAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXaZRCLdEO9Uu81m\nqzIdlvb2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB3klEQVQ4EZWTv0sDMRTHv+1drVfP/kJQULTo\nJIgUcRBELLg5SCdxEHRw0K0qiiCiDsW1dXAuSDeRmwQpQv+ADjc6qHQRQRzUpRQXX3KXNrm4+IZv\nXpPvJ0lf3gGdqHcy4E3K5VT2xAvdlbjbzTEg5V4aaeQBxRPKdU1GDvsjo/BEhyejtwB5uiHDPcA9\nDvOeaLDdxDJAHlgXvshwGfYZQg6XzrUvxUHrwBVQBk4WWr7IcBUxF1aLiw5ngGegSnuFCeYiwREH\nCRdmm8tfsFkEeYJweiJHc6E6TrMwv7losPk6c1dgngC8mosWIyVWi40k4l9cNDgcTc01eb3Ua58D\n1+EClgjOMpiJBofoRId51JMN+v/ztDYL7drDtdp2rfbACcD8ZB4V7q0AQ4PAFFjBLFYwq62dvAL2\nkORR4dMkMFYCjoFYBXaLiwaTqd9lHhVO1AmmuVie7W2wJjEcDaY3WsszjwobLuxF+kAs2nwHR01P\nRHuKDrtBfIs6kzxqtVONupGmyU1gd/zFlwBsfqRTBc9jPP48gYvUYV4pycAjANNr8ODl9nPI8LuY\nZKOAD7xJASseGe5j9xIhYP/3nj8qHhm2M4KkMQDTM/NQPDIcdXwHG6alXEoVT7gprfw//QV6l4sg\neXrXawAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\alpha {\\left\\langle 00\\right|} + \\beta {\\left\\langle 11\\right|}$$"
      ],
      "text/plain": [
       "α⋅⟨00❘ + β⋅⟨11❘"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Dagger(psi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAA0AAAAJBAMAAAAbVLtZAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXaZRCLdEO9Uu81m\nqzIdlvb2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAATElEQVQIHWNgYBBSdmAAgjAH9lbWCQwMjQwM\ni5kKGJi/MzBYMzIwcCxgYJAQZ2CoF2BgkAdK8x8A0kDlzBcYeOz5ChgYBM8cYBZiAAB+ygtKXUvq\n0wAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\alpha$$"
      ],
      "text/plain": [
       "α"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qapply(Dagger(Qubit('00'))*psi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAWBAMAAAAlTTH8AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMhCJRHaZZs1U3SLv\nu6tsAoCUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAuUlEQVQYGV3OzQoBURTA8b+PZro0yANIKUkK\npWytrFnIdhYeZLZ2ygvIzs4b8Aj2NuMVyMLOOWfUzLiLf/fX/ejQJF1OtpOU1Gbm7nQMmkJs3tI/\nYzmq/SulyMJaHcS4p4Weuh5T/lgIzuJhSPltwY3ElxGFlwUO6lCtgU3+Pi2xfOX0P/eBvTi44T8t\ncBfLKJ7O40VUb2JODBpJSjt1Z/X4paLzZdb8z3Ive16M8vYXsMw8D9oZJNsvCfg4ksvwWEUAAAAA\nSUVORK5CYII=\n",
      "text/latex": [
       "$${\\left|00\\right\\rangle }$$"
      ],
      "text/plain": [
       "❘00⟩"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGAAAABIBAMAAAD7Se1QAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAiXaZRCLdEO9Uu81m\nqzIdlvb2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADhElEQVRIDb1WTWgTQRh9+dlskjZp2h5qpeDa\nIoIV2oIe/CMrinjQulCwiIIRBI/dKogoUor0oIVSRURPLhTxWkr9I5cUKXgoEjzoSawIevBgpFZR\nlPjNZndmdzZNG6gOzM5775u3OzOb/fIBojWV19DE9HVBn2vcpXXKDEQ/vA5IXAgZqWlOOLjDUQDE\njPRyQEQtg658q8sAJH7UaYhpdRpag/Nr7QGNvXUa9qM/6LgblFwl/ezeQxfzcWDoFcce0NKlA/Fy\nueTRasHjujqmTNaaIcVGgamwKYk1aITe155QZcLqHwQtO24BG9pq3FEOjWSATdIWlJ6VPj16QlOB\nDNJdUrokeGmkiMZs2vRKOOljMmleKERa/OKuCk03P/Dp7zcaPs6JmqvAJA5xjQErmvNxTiLOGTRg\nRCy1cy+m1SqfDHNd5FbxiYbMuIlEjkd8oMNl6iOGiuwyDzJcqb4HdwvAVXtFFjNkcAvqG4aCLVwg\nraUVprpzmEUt6srtGQsXBjOM+9pBYjHW9ZSWiZW/s6BFPWGgHUPlHEFfC48T7aS+G42zuhOyaKRf\nZ5dDfcNgjw7kSLqO6DU7ksrnx/MzCAN9NpcvIxYa2UKXkeZnbhE/D0zIc20eWUaMHc0shkv2ERG2\nqB9AJLhh0qEsYY6NA9u1vkkGqFnUt3S2M1ilvTPPyapFgiaLnH9p7+XYARaNmoODQ8O4u3QeM4C0\nzpkMEkuyshq3f2+rTfq38ZUSygp66d+u5v/fPbvCRr2yd1WK5WVrwDwFV6tTmF/W3RRcvU6h71qu\nX3Y4q6hap5yah6yr066hSp0Snry8GJN0NwWTLVinvETUknWRguHWKQnNeahSsBOxq1dUnoLpOJx5\n3EBpKVUUuh0WKVjUKV7DYUPotsFOwaFOdlS8TuGG/oFuSiZctw0sBStncck4IeoUbtCGWycgdJU5\nWAqOZ5Ds3SrqFG7IAN2iflHOMEOOetZEZJqCdgvl84/H83naq52WjlVUdj3ylC52Cr5B73/UFBH3\nCdFF4IWQcb9A/yA0T/1Khp+egGsIkfbWo8dzwE3Gf5Oh5Am4hgY6jzGPHqYS9wnj+4DnpU8i4hqS\nBXzUhQz1FxK9jIc6FtCniYhr6J/b3CZUQlmjwfAJDnENGTl4OnNUlmyuOrcJGJKlmilY1eTbRf8U\nZcnL2WuQ2lBQkmZIdJvE15P+BWK+XXz6xaLmAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$\\frac{\\alpha^{2} \\overline{\\frac{1}{\\sqrt{\\alpha^{2} + \\beta^{2}}}}}{\\sqrt{\\alpha^{2} + \\beta^{2}}}$$"
      ],
      "text/plain": [
       "   ____________\n",
       " 2      1      \n",
       "α ⋅────────────\n",
       "      _________\n",
       "     ╱  2    2 \n",
       "   ╲╱  α  + β  \n",
       "───────────────\n",
       "     _________ \n",
       "    ╱  2    2  \n",
       "  ╲╱  α  + β   "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAB4AAAAWBAMAAAAlTTH8AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAMhCJRHZU76uZzWbd\nuyLr89xdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAeklEQVQYGWMQYkAANiDTBMFl4HBA5TM2QPjp\nCkBFIOIQiM/U2a8AIRiiIfLxIHkQoYXG530ANh8uz2aAymc4gMafgsaXQOMno/HvofL5LqDymRNA\n/Bn1KzZACB6I+4CuhQBPNH4jKp9pASqfO4CBIRCmF0jzKiBxIEwAsJUfsxazGPcAAAAASUVORK5C\nYII=\n",
      "text/latex": [
       "$${\\left|11\\right\\rangle }$$"
      ],
      "text/plain": [
       "❘11⟩"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAF8AAABIBAMAAABisTTlAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAImZ2VBC7MkTdq++Z\nzYkDIcvSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADmElEQVRIDcVWS2gUQRB9+xlndrNZF0EhKCR6\nVlk/NwMGIqIgZCQnRc0oiBfB6F2dkyKIRkQQPJiLIIIQQRDBT/yCirqigh8WRqJejDER4u+Qtbqn\ne2a7ZzoqBCzYqapX9Wq6m96aAmJp/IWMx+kzYdk1c5XR3W4iaD8cSGASKFeKKdXyZkKhYk9Icqyn\nI/iZH3GitEyEzKIKkJ+UabE2EVZau4BCNU6UloGQ7cchYFRmNWkDYQ6wHtnhpkRpGgi0lgs4hsMy\nLdb5odhusqpwLtkv1uxsgkIz8+BXysbg7L3z2m1pNMYTBAOQs8Ye9RtiqXAZyNVSIwYwBzhiOX/+\nP7AadDrZIUOxVDgAioNqpN30Kr4SWv/8iko4r7qatwP2aRXKUA2zOPtGxlw1XOrivj22XcEPfOQL\noVPVZVMIzMIRJeI5A8xPIdwN81rRF796xW3ULP6X6VWqMMfihZi1nj24lN0WF+HlTV7ScofIsp4x\nY5A9FoIIW/kemKuK2AKwma/IY9EA3bDOqXmRt5yskVG41q1tDPPol1n33MOWuQGZqjg++bSFgl+s\nBoXGTxb16Jev4D3ONiiiyaoaXd0qcB/ZV76IeaTpKDuFq6hMLzWnAkGX4VzjkWK9fr3+HHSjnyiZ\n0rG+AUvJmYAdtSmPfDr7KzJH1U8rOEXIK2wbd0XEI30UpUC4mmofzrLIguXVJ10i5JFetuK98HRV\nnCzIyjLkkUHnYBB7aoMe8QgwE/D2pU6oALavg7HfMxzbf2W1UsH/LaaOYsDH//d6Z/j9JcM+m2Fl\nz/P+dQGyBZfv30ul6njUgt/hYipBx0u+SDuBg4kLxaYLHd8qy55Gu+RKCGy60HHRgllOjxtlhkaW\nTxcqHrdg4KTI75Y8Pl3EOIejFkxta1gnVNl0EeM8HLVgYLHIpwYshE0XTThHWQvGSKdPX+3A6edQ\nRODTRRPOowP0bPOtS5mu/WvWik3LN4TTRYyzMGvBuAHszrk3Gw1eAtEbqBfTdBHhbQHFWQsuUT99\nTMFQPtfrZ+r1N8zJxdMFec6SIXqyFtziAZ8+kCFFLkmbLvJfKYG14L4A+NJFhhRJCLTp4ip9YgjD\n7A4ikI5EEmradLHaRyvbeGkQ2ac2s4RIgj5d9HkIW/DYoo7SiMwmLQiJ6aI0Af5FbkoNTUGIDk4m\nZKacQWkremPoJQjYM30LTk4Xx+kqTiPJ6aLwfZr0tFDOS0NnCPsNlql6XT/vpUsAAAAASUVORK5C\nYII=\n",
      "text/latex": [
       "$$\\frac{\\beta^{2} \\overline{\\frac{1}{\\sqrt{\\alpha^{2} + \\beta^{2}}}}}{\\sqrt{\\alpha^{2} + \\beta^{2}}}$$"
      ],
      "text/plain": [
       "   ____________\n",
       " 2      1      \n",
       "β ⋅────────────\n",
       "      _________\n",
       "     ╱  2    2 \n",
       "   ╲╱  α  + β  \n",
       "───────────────\n",
       "     _________ \n",
       "    ╱  2    2  \n",
       "  ╲╱  α  + β   "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for state, prob in measure_all(psi):\n",
    "    display(state)\n",
    "    display(prob)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Qubits can be represented in the computational basis."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAB0AAABkCAMAAABNYMs0AAAAP1BMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFBd4eAAAAFHRS\nTlMAMquZdlQQQO0wRIki3e+7zWZ8bMzn8loAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAG5SURBVEgN\n7ZbbbsMgDEBNILTD5MLG/3/rwMZZTcikvlSbVF5IOLHxBRyDyTQmeBwLLwKYbF0Z8yOEVJemXKlR\n4Ocl/QuKztlwGK1tjkshfo0Q2XlNV6ximwXnSV5Rm2nR7kBfASi6biSBK7Kooj6zCGYJuZLNiWVL\ndHkoaimJyWYwA6sAMaUib9ENZEXhMSvNx6o8vKlEos59NLzFhMfV6OleUuuX2BR0NK11Hfcx3SjD\nM5+v076ZaJCjozX7bKvOkIfZj3zuTDt+nUeRZS/oSPMt35oHwFbNYtWnrgwb3YZ04RFHo1wkHtoj\ngKVGcpVA99SX6z0J7DwS42TuZWV9vO/fob7VH21RfYslz6+pz+/Tfrt/SAK60/51V1l4n/YXnUlJ\nB89P3+6Y0kV9LgpLN+S3VldOmlMFgX/xp5oT6fc9L2OruDBPrRPrNRMNpR+h0dFgonX70hqKfl8H\nHtFe1UluONxFjWWjgjQcet/AUeAqXezStDU/4lBHeb8oDnV0q5EytQXjoTQHk9ChtE/lA0XbtiL5\nDPXs7Y+o0ty8vaAPy+1RWXXCTH/rvX1ts507YkAqqPd2Dr4Bpkwjw7PPo8UAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$\\left[\\begin{matrix}\\alpha\\\\0\\\\0\\\\\\beta\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "⎡α⎤\n",
       "⎢ ⎥\n",
       "⎢0⎥\n",
       "⎢ ⎥\n",
       "⎢0⎥\n",
       "⎢ ⎥\n",
       "⎣β⎦"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "represent(psi)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gates"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Gate objects are the operators which act on a quantum state."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABkAAAARBAMAAADalBo9AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZrvddhDNVKsyIu+J\nmUR+edwkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAn0lEQVQIHWNgYBD6b8IQ9l+dAQr6BRgYW2Ec\nhvkJDDPgHAa2n1wNCB77jxUIDgPDflVk3nkHII/lyAGIWP8GIC3DUAHm8a74DqTtGPgDQNybnJ8Y\nGFh/MnAXADk8DxjsFzBw/mJgFgDy/BgY5C8wcH5lYHZgYOC4wMDA/xUkx+3AMO3/Tga+/M8NQH38\nD4AqoQBmJoTrC7UPwuO5c5UBAEc9JWXSEMgrAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$X_{0}$$"
      ],
      "text/plain": [
       "X \n",
       " 0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g = X(0)\n",
    "g"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHgAAABkCAMAAAB6rgQAAAAAP1BMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFBd4eAAAAFHRS\nTlMAMquZdlQQQO0wRIlmzd0i77t8bBwggJIAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAMnSURBVGgF\n7Zptl5owEIUjIG4VV23z/39rE6gy96bMbAyx9ix8MXCZeTLDixcObufHpXEvWj4nnnM733Zh2b+I\n64ZIa3wE717FnDkDgPv2NJyenoURjTKCz6Hd/edlnheP9teeN83rRjTKAB6uMcvpPOeCUd+0jV8G\nG9EkA/g2nth7JXmnaEY0yQD2I/jol89vDWxEkyzBvW9ja4++gw7LFQVsRLMswRd/ipDd9CN5j7EC\nNqJZRvBY8dNgNfoytfORXIK5G48654FSsRHNsgS76fjvi06uxWhKDuDbLdY2KJeMUrEzokkG8HSN\nt0s3kDApDWxEkwxg9xlvmVflZq2BrWhMjuD+FP6vlrltc/XnZpjPNRwZ0SgjGBNVXdvAVdsrk2+t\nlt2oOt5aXbW9Mvn/0Wq05HL+4zhL5orXc+zJvBRDv6pjZ7Bm6MO+2h8uWXLOnCdzqzUwWXIG58kZ\nYPaJBM6UM8BsyQmcKWeBsxx7Mi+MzgBn9pLAHB3BB3947GWfXF917I+UfwZk6H/CqwjjctL9Pjl2\nBpOc0WpHlpwz58k54DzHzvOiaASv6dgT8Gbo3+LNXnJc6m3Ak6seJ8n8PcF9t/yCMmnRWhsu4S3e\nG7yvXqucL+R5k5Mry5InZRnRuD9WjJ4b9wxrZbJz8mkBwOS5GVwm09MCgPMsOc/LiA67S18F4DxL\nzmAjWgGzEaTMZXJMtlRxpiWneRnROhg9d5K5RNbAZb00ov8GPnz8mIojz00VWy/wjeiQTR7jXx/i\nT4I8N4PLZALD5ZRnyXleRrQGJs/NmQtlbDVU7NBzJ+AyGZ8WEJyg6m3YwPV6S5m3VlND6q1ura7X\nW8r8Jq02LLkhU028itFY8ZqOnbn0OADgVR07gyk5gA1LbsiBJL0NgykawIYlN2QDTNESbPhEQ44V\nKhVztAQbltyQDTBHI3hNxx4nIpaCT264WSLrffhkq9d17PfJ3H/J78tWZ340c88ofpWKOTmADUtu\nyGECGpiiAbyqYxeNmIYFn9wYhh4dewLGaKw42bnehg1cr7eU+bu2+h99Ud7HL7y77khHodrq+EV5\n17nfTrVBsv3zzEcAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$\\left[\\begin{matrix}0 & 1 & 0 & 0\\\\1 & 0 & 0 & 0\\\\0 & 0 & 0 & 1\\\\0 & 0 & 1 & 0\\end{matrix}\\right]$$"
      ],
      "text/plain": [
       "⎡0  1  0  0⎤\n",
       "⎢          ⎥\n",
       "⎢1  0  0  0⎥\n",
       "⎢          ⎥\n",
       "⎢0  0  0  1⎥\n",
       "⎢          ⎥\n",
       "⎣0  0  1  0⎦"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "represent(g, nqubits=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAADoAAAAWBAMAAABj+5JWAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqvNmRDdRHYyiVS7\n7yJfG51DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABVUlEQVQoFXWQPU7DQBCFXyBx7LWDESVVlI4u\nQnQUcYOQqCxAFEiINIiCxgU9RqKgI+IEoYOKiJIqJ8AcITcAEQzkR8DbXW+cIDHSvJ2Zz7ueGWDG\nnDBP3TzMIhHlpTkVL/2sga5uke7e3EGJU1Vf9qkf+g7pOvZ6Wo5krfwFOO+GFp4h6kpwLmtiANgj\nQ70q3FQJdmRt/hXwUkP9KsojJfB6LPpdepMBTUSHAX+lBG6blbPVWi0JYN8yEdFLG85QCdAkvW8B\nVx0s40HRQFIpwCZpg56EOIYfzr6Ma5IxvY/SAJUOKRtyZVcup3jMxh3C+Ya1SOp1UUiVAE/ZuJ9w\nUlgxKRdRlNso1rHQBSw9Lu9WJMUJDlpaRAfbjbe4mIxj/tePJN2/XIEWiw0Zy3o2Kc/TqfhCzztV\n4RsTE1sbchuTHKV6Hutomhbiv9TmVo15oYn+OX8BKLNoFzTki84AAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$H_{0} {\\left|00\\right\\rangle }$$"
      ],
      "text/plain": [
       "H ⋅❘00⟩\n",
       " 0     "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = H(0)*Qubit('00')\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAJsAAAAvBAMAAAAGFKXcAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAInarRM2ZVBDdiWbv\nuzJCz3LGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADkElEQVRIDZVWPWgUQRT+9n529y7JJQqKFpJT\nwUbRKywUxVwhtncWQQXBBf9AEK+ySJPFoBARjFgoNh5yKiSgwVIEbQIKIoqNTeRAELvE/zOg8e3M\nzs7sujsTp3g/8775ZmbnzewDwrZ6OWiLwjVoy4TeaSCIh/P1uJ/0rGayR+uv0UYBu2UAxMOn4+4/\n3uQ/PboOd0oXpRhNt/bsewMoCtNetGiazq3hYT0aoDcmDejyLPI++p/pWaLojAFNn65/Cvk/0QCt\nQXvRo7cCxd6K6XKz2ehCnVbCT6rU0y6KBfeTLDErHb2NEjhXZYBGmymdyM1RdBNDpKKtC9/EdLiu\nI+KxdTvqYi/paPc38JhhbY8P0cqrr9HXDhBZ6HNDuMkYtjBpEPZnlPwAk4Ue9vh0jodVBi4KWz/4\nXjLR+R6f7iOw0UyHEZ/tJRNdWTofsFi3po9TvnxSGB3FjsyF+x7ZIbriR/1Ai9tHDwe6SA8s0XWU\neOojWZzzJbpcV+DhCzzuKX1Ed2nmAReVmhIQpvNDWKSJzj3zuMt7PnBVHOKaSaI7hMkhLviJK9HA\nPKj4RFdsudcA5zllr69EQrODvmcoN5kAXWXenKqw4prongB3MXG8R3drNh4MvA4GanB6TOCiiGvo\n3gLjPnJE5zYFXOoOBmso/GQCA+IzaOi+Ao0Wo8MbSSOsDq56KHxhAk477M6mc+lkGlVONyZIpO5g\nuI3KEhPistOXrkqEapXr1hKw0OZ0/OFS4/Tthr2ALhDAiTCmoaPVCTq7DlYdRCI4CmWzYKlUHh09\nMjc6WiPqwQgZGIuUd+pmU/KUHYUTHIXzExgzrg50FOPhUUSfWu6XEoVetB4TiM4qe7OYB57yRJGJ\noNJRBttBGttNWK/Nq6M0Pgl+FBskjbDokt3AlS4X5ZaZrtRyX4V09wWJ1ER3edO+UEQnr9mse2dz\nF/be73tkWlmn5rshI9HJdkCYcTpZn9Cdla3ghfYEyvQ/Yy1GR6vkzRW3LXCVaiZGl+9yMHYBL0NT\npUu70wRTqpkYXfRgvABGQmqVrq8azhFXSn0So3skYMf8iG676CM94CuONJVqJteV3Xin2Ld9xTGa\n6fWJHFag+/4frdHWg0vBBV95S69P5PhT0lyBZXt6UM4QT4zekvCT7nlYaqImwwnfMVQzFQ+5/6D7\naKhm1k/f251YgcYN65NsxLHl5V/Z0WQkrGaS3YH/Fzv3CzPK8ShkAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$\\frac{\\sqrt{2}}{2} {\\left|00\\right\\rangle } + \\frac{\\sqrt{2}}{2} {\\left|01\\right\\rangle }$$"
      ],
      "text/plain": [
       "√2⋅❘00⟩   √2⋅❘01⟩\n",
       "─────── + ───────\n",
       "   2         2   "
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "qapply(c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAANcAAAAvBAMAAACCkkLyAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqvNmRDdRHYyiVS7\n7yJfG51DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEB0lEQVRYCZWWPWgUQRTH/8ndXu527yNYSUA8\nbcRCDEZsBLNERIgWRxQLQTwEFRTkCsHyTkkRGxMk1rlgcVELF8s0CYKFIEYIFnYBtRMNxqiJor75\n2L3d29nZceB2Zt77vfe/mZ2ZHeA/S/kvK+vpUcagJlV/Q+MMu4zBcFBP+31PP7FrDCZmAE5pfBGX\nMRiJinSseqSb3DEGk1Mg6+HD6ZcawHcZg36Aoj4Hq4qnBovEGFSI+KZ59NdQeuN3k2tjMDkFvYlS\nHf1byYT0GIOaTPlBZDZNxIzBBLFbZM9xX24zARFmYzA5S36VfFPc32wnY4AxqEnycZrWYJ0DlzQY\nYAzqslxcRl+bAVmXPZOLMZicAtk/yNWYf1IDMZcxqMlT/oYh5nZcfNZggDGoy3Kwdpm5Z4F7Ogww\nBB+ILI4y2dwTl+zla4/H6kCBzyjgKVBDsCNC1R++zCoTyNCHmsTshkD3iSry1IA7/h4G/fg/JbGz\n849QqEaCZcf5FrKSmDU+NIP7IZvf7AW5XYIb1PkuQBI7inNr4C/Hjw3qY0GLjyzjWTfkAg05WLMH\nhPOWDh8+moGf9Abkn+6g7w3sYdzuiY53aWS7gIegQ1AUpxWHmIXAiTE63wRo0xme/yXIDopVOJs4\now4MWSnHc2CpZg1Lo0YMeRITYGYdKFKPlQ4qVQz8QnGNdzUPEvsKND28llCamAAry0ClLkI6uOiC\n5tVpi37y025YNPXNFhYlkyrGweahvXtXXOQXSKCDL20UtuWJa4/w4qok7UaZsLm2/OrQwdJSYWKP\nsGkU4NMZYNqjo+gZF3O52El1ZNdKYjQyEss2hDFVjIOjBK/UcBWVGo1MTGN8+1T4tdt/rNMik9PI\n9yTNwZHVkZEqpYqDtP7YyDj4mxobsLZQ8sQCcWhpLpJRW8QCWfKC15s6MrYO+DbbRoE+IIMkVqSv\nFv0PvsbsK7xUVaok9grYXQsWbqoYW+F8m/1AYRO5FonRps4Oo7ysEgjbSIw29XHgk7SmijEwJ7YZ\njazExHAdF2Zge+HEqjaJ5TzrHfDEVIzAidGvrezK7xa9s0qDiZ2f2i+XqUojsJGYtXCHFnI9XSx7\nYGNPF2S8XI0i9KbM0Ft17/kkxsuAK5noNGpAxk+KfSZCaXCqErrn+2L9NDherDXZYJUOZH57/ATb\n1LwEp6voBs/QPd8XUx/ZRqAU62sF+SONUvee74vtjAB+xwi8K+hizY+K1qF7fl5O34soIXvGoDI6\nMKbc8wMOxmA3JNZqtmMmtcEYVIdzq/6eHwo0BkMxPc20e36AG4NBRLyRds8PIozBICLWcNLu+X6E\nMegHKOrZ1Hu+DDIGFSLSJO/5yYDvMQb9AEUt7/kKT49JDf4DGi5EsiWmsw8AAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$H_{0} {\\left|0\\right\\rangle } = \\frac{\\sqrt{2}}{2} {\\left|0\\right\\rangle } + \\frac{\\sqrt{2}}{2} {\\left|1\\right\\rangle }$$"
      ],
      "text/plain": [
       "         √2⋅❘0⟩   √2⋅❘1⟩\n",
       "H ⋅❘0⟩ = ────── + ──────\n",
       " 0         2        2   "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAANcAAAAvBAMAAACCkkLyAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqvNmRDdRHYyiVS7\n7yJfG51DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD2ElEQVRYCZWXPWgUQRTH/7m7Pe/2cnfBSgJi\nDIJYSCSKpTkiIkSLJYKth2IEC7lCsLxTUmhjgsQ6JxYJpshiKUiCYCGIEYKFlYLaiYR8qInB+GZm\nP2Z3Z2fHgezOe+/33n935+MmwH+22h5ra9lZxqCmVK6lCcohY1BOivW/xOxU0xhMrQBc0MQiIWMw\nkhUxrGbETDeMwfQSKLj4evGNBvBDxqCfoLhfhjWARYNJYgwqRHzXE+QcVN/7ZvrdGEwvQSNRbSK3\nnU54EWNQU6nUh/yWiZgxmCJ2h/xFHitupSDCbQymVymtUuw+j7e76RhgDGqKfJuiOdjkwFUNBhiD\nuipXltHTZUChwa7pzRhML4HCXxQdFp/UQCxkDGrq1DbRz8KVBn5oMMAY1FUZcq6z8AzwUIcBhuBj\nUaWiLDa70CB/7eaz0SZQ5l8UcBWoITgnUtU/fPlVJpCnH2oSs1sCPSpukasG3L93CvTHn9QTKw9E\nkj2jsil5Scwa65/GI8nnd+Mg93vgBhk/BcjEXpIsHxzhkq5npD6J5V3rljdBpQDrxkBUPtDmw99m\n328aAe+h52AdGSLv3Vh20iSxg8BT0CaobwSOj9L+JkCb9vDSH5HB3myKxC7pC1CUarwClhzrRAZK\nIEokJsD8GtBLFmu+WO9nbmouVGMdaLt4p4FYyBcTYH0ZqDeZPxSrdLmpudgtiz59u4MXGoiFAjEO\ntocHB1caKM13QzGx49oneWuwnHizW7UdYLbr/erEw6EdiPGfp8VpGieXtqLnktj5kFb3SIzejMQK\nNCa6FohxcITQFQc3UHeCMUsunzo/dvuXNfo63mfka9I6PUHtGj02kqCYIODgLhEbsLZRdUMx/oEz\nHpgmyJKLrOEN3oyBfJntoEw/IH2hGJ9jNnvciYkBlSjVeAsccpA1cQMxBvJl9gvlLRQ7gVhtWSUg\n+6gGLeqzwHfZq+gHYgwsimVGb1YNxWxXkRZxUY2ia30EFiLupBGIETg+st4prOx2aMzqLfZmo5+G\n+zLnM18+1vw9mhHNZP2Ih8QKxzcOR8FgNjL0doQPjfCczx6YtX0NfotfMsBJf52xvGPxZGFL53xf\nLEcvl2xZoD12TixqSk3bXaVzvi+m3rKNQLYRU+vp8FviUg3P+b7YgQTEHEbgA5Ha6yhLyOf8kvf5\nXitJ6R8CPajMDpwZ5/yAgzEYpiR67W7CpXYYg+p07tWf86VEY1DKiXWzzvkBbgwGGclO1jk/yDAG\ng4xEp5J1zvczjEE/QXGfyTzne0nGoELEc3nn/HTAjxiDfoLi7p3zFZGYSw3+A1QJNQiRpRnHAAAA\nAElFTkSuQmCC\n",
      "text/latex": [
       "$$H_{0} {\\left|1\\right\\rangle } = \\frac{\\sqrt{2}}{2} {\\left|0\\right\\rangle } - \\frac{\\sqrt{2}}{2} {\\left|1\\right\\rangle }$$"
      ],
      "text/plain": [
       "         √2⋅❘0⟩   √2⋅❘1⟩\n",
       "H ⋅❘1⟩ = ────── - ──────\n",
       " 0         2        2   "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAWBAMAAAAr5E+TAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZrvddhDNVKsyIu+J\nmUR+edwkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABqElEQVQ4EX2Svy8DYRjHv9yd9rTVRmyaSCRC\nTBIGMdDRQm5qjCabuNEgUYNJop3EVjEZLYZOmmhq1IWQdLj/QEKKCqnnufdH7w3nGfr++Hw/7/P2\n7gCjXE8sfWOXF/EkHYjwsRgivyYZ7S2g2JsOORGnna/gNJIWU+VIUs5h4FCTId9ZgiXv2FfZSVxB\nkeqmPpfIONCEneun9Wkbjx0oMtQdLskIOTPAvudsyg09cB+bHEkSHxcKEfkAnn3Mqh01KkeR66k+\ncb7JKWBP7ahRO5LcFYjYjTqQDoa/gGodVphtbnFt81w7gqB8SZt57IYO9SEnE3AwUtoRJHPxTnAZ\nWY9Ok3dzS5E8T7UjyJP7Qs+ji5TPhJ7Bvo9EPc4JCeVWzuB+wsqxMwlMeBg8Y+dmnmuRp7pPSNYp\n1ILbgVVgQu/0ATjnXLS0wyTZArId7pMKHct3asBtNM9z7RA56dUwsvNaov+TDZg4jdUKMPeHkzl6\nOzCJfG4iO0LNzeI+XAZZE+9HkCS1Mks5Bkm378WtOVs0BVopJ56MxTq/iS3vpD9a7cYTHflv8gOz\nvIcFcN7TUgAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$X_{0} {\\left|0\\right\\rangle } = {\\left|1\\right\\rangle }$$"
      ],
      "text/plain": [
       "X ⋅❘0⟩ = ❘1⟩\n",
       " 0          "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGUAAAAWBAMAAAAr5E+TAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZrvddhDNVKsyIu+J\nmUR+edwkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABrUlEQVQ4EX2SPUvDUBSGX03TNv1G3CwIgihO\ngg7ioB1dlEzFsZObmNFBaB2cBNtJ3FqcOro4dLJg0dEuikKH/ANBqbai1HOS3OReajxD77nnOc/9\nSgElDNOdWkqVJ+EkZbvNZ+4g/apkarSK4mjB4YJcSN1uSkTv5WvwSDWHiROfIHYNaN4ZA5WcqKWv\nC1IvCRtEdp/7QCQXdPurzQB3gkSHiYrXwmeLkKOXvII/EFkEyqZHYoOmQMLBkqiIkcgAeLUEuZmX\niLMPjkRFjClb/yGnIMhDgUik0wbfx3U0qtDx9zj2OU3ZiW+g3oZLUL2iYh6HkpO2uVEKcmgfclyS\nbn4S3EDWDPYxKlI/p/7ZXPJivNFLDZG0AifWHnP4DcoWHEJ32GzA+IKWC5zJBju3KxxrnFLXHDBr\nwiE7lHZh9KEVAueS++Qgh77pE8Ak3gWyfd4nKTn3cj/n5GiW3gKInI9ayBy8V+g+WZtJ+vTjGFj+\nw9E7WzWV+O/G3RnaXA1azQmFbIvvwyhOC6ohHIWkeo/OqZ3WoirQTDjhZDrUGScR70z+n9Z3w4nf\n8l/yC/jnhwWWx5iYAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$X_{0} {\\left|1\\right\\rangle } = {\\left|0\\right\\rangle }$$"
      ],
      "text/plain": [
       "X ⋅❘1⟩ = ❘0⟩\n",
       " 0          "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGcAAAAWBAMAAAAvEZ+uAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEKvvIlR2Ms3diURm\nu5nMxUtJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB9UlEQVQ4EY2Sv2sUURDHvxuze9zu7d0SG01h\nViwMeIIWps01dhFTp8lVBkIIp6XNLUIgpRYKAYtrxGJDuL9A0mhrAlY2WWxtTPREtEi+M29f9sc1\nDtx7M995n5vZeQ8o2VPjuyWpcBuR8VcLSb3UxDPjmq6hn6t3GM0tn/XgLi9JgtCN/fdoxBJU7S4s\n9EwSw4TLjngC7eB6D680qixdhdz7QDNiovkL9l9StO7BT7BVOZ8HrDT37RTwDil4f4GP3Gkpwhju\nKa6ZsLpKex4hJ6Hu/ETQN/kUnRjBBGHPxJXVQvgi8sn4eZ5NsZAh+A13lAt2c7b7+glSCWuirt/M\ngM1Neikej9Bguy9F93fVmIQf8Fvz9tCUZOcMaI3cWKFMoe+il+xhOymgNmmEHF9zDFa27UHvogRF\nnVJ7eo1XEmBhgAcCcRDuJG+7BGE9Kiq5I2b4HRj28Fag8AgtltQB+XtqMY/ghVNAOtvP7HEY4Y1A\nvFy2P3skB0vmTPwCeiSJE/5Yia+Pz+g1rg7gr5YAcYMfKwX0jsLi+Vf9pn8KzT+5zbHUGKB7KFD7\n1p9ufh9ywk7PnP4wBVGQexILMt24eJm5JxOz2LRZaGZwmTs4iLQ9EfRJXmasY6H6a+YgxFp93WqL\nhT7V9A0Thyw6bV7e1vF06r+UC4KdfqZ5799uAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$Y_{0} {\\left|0\\right\\rangle } = i {\\left|1\\right\\rangle }$$"
      ],
      "text/plain": [
       "Y ⋅❘0⟩ = ⅈ⋅❘1⟩\n",
       " 0            "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHcAAAAWBAMAAAAIvx5GAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEKvvIlR2Ms3diURm\nu5nMxUtJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB6klEQVQ4EX2Sv2sUQRTHv6Puxt0zlyWVXRJs\nArmAKTRlrkkXces0d6QJpJDTMs0dASF2FiI5sLgmQQiE+w88CLGwCYqVIDlShVT5JYiC+n1vd24n\ne25eMT/efD4z82YXcOJ5Mo6d1PBwJPo/tZukZ4YNJxN2M2p84aIKb+GxZFL5hYPmh7OgbE4/NaBU\ns0XgpUKUvTkgSC+WF2VeEflubN4kVHAFSUjsYvz4HPB7HBcG2X3gPfweEf8XcMCewZN9yqals4KG\n8hegFillLlGqJ2Aq42uBp2nKF8CHOKGOuuspbOXlItk8q7NE84dyHUrVpvrA2hoFKwcqh5saXBxE\nWHpI+Q4LbXag1Bhvca/jTWZyOf2UA8kOFsstkXkyZaVG+dxBF3wpe/IIN7oW5lWbsdWIxpxrK3W7\nBUw08CiTvc411ZnUIvmsvGothtfhwlM2zSreZfJolWmEclq7PSljGxtG5O/AYQSlDllhM8LbTH5i\n2XxvfoQi8yc5AZQ6IsKT+Xfbmrfzkp2XzpZEDmIzDwg1/feb1vxb5PKDnxXgtYWH+kpPZLOz0nCo\nwWsLXuoPSU6CskZG+f30O0v+FrctDis71N5epDWLdL/Y5IqV8xQfTOJj0hW0Vs5Tqwn/uUBL0n5a\n1M3UjVvo4j8inIeX5eIvpAAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$Y_{0} {\\left|1\\right\\rangle } = - i {\\left|0\\right\\rangle }$$"
      ],
      "text/plain": [
       "Y ⋅❘1⟩ = -ⅈ⋅❘0⟩\n",
       " 0             "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGAAAAAWBAMAAADNzYTXAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA782ru0RUEN2ZIjKJ\nZnbgt/12AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABgUlEQVQ4EXWTLU/DUBSG37Gu+2hHCYYEw4ZA\nNwGH2AQKNYsgNMEiBmokJEACDDlDMIjxCyBMYGeqCGQ/ADFLCJAgWGB8nfux9u62Paa353mf3vae\nFFDqVqxNpSWXCcQXOF2LGGNkbnpx6Z1HqL17fwfLjRMCkvkAGjMjYQGNNppxQkDyHlBuS6E4BbuE\nlxghJGnAGIqED8OFOcBOjBASC6h4I8FxQa9otHXDh0rsH8l97LeQ+YXZlY3gMk7e+sDkA4V8XHVh\nfQMHLGnP82qx9RgxP6nziE3ebnHhjIXUIiEkGy4KOIZTp+eIV0JHDbO1SiwaWj47RMqjNn2aSXPZ\nigohuaQxrVtfyPVIMKooDoBVJtinvPjYFZI9rANNa4BcnwQaT76EQjW6Q0AmZoGbKu2QYgJOsH0N\n24sKAakcrZT/evQNTo0Je6/LQE7PxxB5SiK5FifwXkiexBxEkjbRSv4PCIl9cc5Om1e2pMUTiRSK\n/SRBJ88iaNBBa5VMtGD09h/XtoQHnSr4BgAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$Z_{0} {\\left|0\\right\\rangle } = {\\left|0\\right\\rangle }$$"
      ],
      "text/plain": [
       "Z ⋅❘0⟩ = ❘0⟩\n",
       " 0          "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAHAAAAAWBAMAAADqYwU/AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMA782ru0RUEN2ZIjKJ\nZnbgt/12AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABfUlEQVQ4EYWRP0tCYRSHf6Z51XtLaAlazFoa\nhVqiQYcmJ9eG6EZrgzQ1VhQ6BhEtDfYNooZWF9fwAzS4RoTQUJREnXPf+/71imd4Ped3n+cevC9g\n1JPos0bktBOInsDSDQfXo0WUFtY3PqJncexXNOl0JjH7CRwvKnG/CbQcXI8sSiIfAuVO9KwHb7NK\n4ns0JR0mkQYyIwHx+4YkHiU5UWYSPlANBSnjTEfM46dNBL8xIeNsd1wRiU0MB8D8M8EyxgljwUpU\nl9zLsojsN8UvODDEawm6v0pkYq+CAi5QbOqNj47grbWpzu4twqfLz3sjpEIdHzqiGtVGIu7ounf9\nH+T6WqwzGfCWdruiLGqUWId3ShfX8r+QG6i4UDNhs5ciETNLwEONNqa0GIQmbPZSJKJ6vl3+69N/\nLDZ441VptY+cyVr9OKG+KnM7FmwOvJFLE6/yHjne4iOxpKiJ4PZGfDPiveVEicNYdIk4nhtME13i\nTQgZuqAJNZ2YIOr4H1aPf85qGlHYAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$Z_{0} {\\left|1\\right\\rangle } = - {\\left|1\\right\\rangle }$$"
      ],
      "text/plain": [
       "Z ⋅❘1⟩ = -❘1⟩\n",
       " 0           "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAF4AAAAWBAMAAAC79zZcAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVJmJZkS7EM0ydqsi\n79384c/uAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABfklEQVQ4EXWRsUvDQBSHf+mlKa1SC85CUJwE\nLdVBF3F0DI462MFRMKiDIJrq5JhVHCrUySmOgmD+A3V1UhAEBaEUKQhS372kzTU533D37vd9yeUu\nQFJFl3sjSfqdngiH+Ug09V05DxFjct5khdLdhSUUA1XlfohsobDTT09wHOJd5w9IzgZWY998hGjg\nSuMnxPOB9di3AhhdHGj8hGyuAOexPxYg34YV8lIZhJMQr0MbcAnHs5H/gVFV1Awp9Xp3QKslb+2h\nimIHeGFp8UzWqeyHyP79r2tWjUCmNvvT7CtDisxVyg665EffgwtF5VYhggKvQpf0RD6dymgD41l/\nQA6JNd1miDfyrTrMLrDN/vKXrE/ZK2SCllP0BD4opb+Sa2C0Lh21FDJrQwSg9z+Tj1cc+RAV1ZW9\nQuyNmRs6gY9vme5d3wLltJ4l8f1E4prO52xASjbffyTSFqminbkSUqu5cldZhQZP6qAncWpeqir3\nelLyGVpuxv+fZNRU8AcZcXmJ9ZTA3QAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$S_{0} {\\left|0\\right\\rangle } = {\\left|0\\right\\rangle }$$"
      ],
      "text/plain": [
       "S ⋅❘0⟩ = ❘0⟩\n",
       " 0          "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAGYAAAAWBAMAAADA0/SQAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAVJmJZkS7EM0ydqsi\n79384c/uAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABx0lEQVQ4EZWSTygEcRTHv7O7dtnZtilnNZGS\nLRYpJ83BQU6bI4mDclHm4CAOKyfl4iY5UOviZImDIntyd1IuHJSiXCRS4r03v9/8ZmZP3uH33vu+\n9+n3fn8AY21+EDtGikQ7QWxFJArTlSA/j8sqGw68LU1W51BGAs3sNTP2HBTTVufqPHJL0sWMdQcU\n/SbI9oTpoMozFVMuMK6ZtdInkPckTSzDyJ1eE3NIenUbmJI675MnJreeaJeUZzsmZoX8rAfsiqoZ\nLEqaWDSTbdA+77SRWMi0KyF0q72Q8/A+Vpmm+f29BGq14K55NhSleWSTbYPj8oxh8EjC8vWPnylb\ndXkfYVIVbjRWcHoiTLcU+p1iBZ+GCd7AMDl8R5g9pKlUdejybg3DI8fMoon1HaAda1Tc9/cbeDJM\ntsHE6BvbK4etdd8wi+ggqYsovBjmhvuiVnXKIVOYQ5+LdB20z71hBqL9HM8WvJBJO3CnSyfyGT6Y\nSV19nUFuM4bZY3Ke0sOWpx6CyuG9cWuLy2vS1L/GpC7kXfU+LNjbWo56zVyE4uCgL+dhgX9hsykm\n8YH5v7FNBC6xKiZzENPzaqaFmKqToyDI+lr4l/8DQoBvNm0GCEIAAAAASUVORK5CYII=\n",
      "text/latex": [
       "$$S_{0} {\\left|1\\right\\rangle } = i {\\left|1\\right\\rangle }$$"
      ],
      "text/plain": [
       "S ⋅❘1⟩ = ⅈ⋅❘1⟩\n",
       " 0            "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAF8AAAAWBAMAAABUNV1iAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIu+7q82J3ZlmRDJU\ndhDTAJzgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABgUlEQVQ4EXWRL0/DUBTFz6C0+9dmCR8AiQAE\nYViYQGGGgARHzcIEJJCQEARJDWiCwBH6DZjAoFY1uwky/QyaBAghhAzufa+s7/HWI9rb+zunt68X\nyFQRqk6yVlrlEDdWfNMK6KTwWm++beyFZKJ2cHnTwcOkwJi4IaaOULxSgZkkOIYn6MEQvWpMHGAu\nQikmA7WvgRZ8ThvSySNwl8AXZKB2HeiLYMtw/yMdoClQZgsF3oH7BMsTAjqZT7kbB58UGKBnB3RS\nIBeGQ55Q+AC6ITwZaO2wdrk2SekbKIXVBrcpS4FiLBPZxSTOCPBijCiQDq40Mq+sTEJrwEsHixTg\nQ/cTVEMroBNaA7o1nHFghX6ywHSNA/unrBMuTUJrQFfgnNu0uAtglk26TLIu5IQlDnhJsAAc6Gau\ndeKu/mwP+Axf3A4On2iTdChTNkn/krKVI9MuJ8hWRvxI7kEZHRpiiiZIaaTdFvxJUs/qpl1zyF/7\nVrOqMof46aesWYF8Ylmtxi/9fI5h2SbKRwAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$T_{0} {\\left|0\\right\\rangle } = {\\left|0\\right\\rangle }$$"
      ],
      "text/plain": [
       "T ⋅❘0⟩ = ❘0⟩\n",
       " 0          "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAH0AAAAcBAMAAAC+Bq3pAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAIu+7q82J3ZlmRDJU\ndhDTAJzgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB+ElEQVQ4Eb2SPUgcQRiG3/OW27u921UU0tp5\njQkEtDXHYaMWWiikyxIwCgY0EBALYQU7CYhdiiPX2V4hiJVbWQjCNTmwiEwRE1IJSRQRuXO+2d2Z\n0ds9fwq/Yn7eeZ6d3ZkFHlFTj2DjUBYXPl92VMd2sVh68oaHHny3/mQd6Rocz0v28yxY8xOQ3xZs\nf4kvJoCZaiCOJ/jGCQw2wRd1MPV3aPLf6DtXi3cSfBlHPoEZF11LyG6GfuEVYDI+aa/uVlDB/hFo\nAP0eclXO88f+XG8CNj0svtKMch3cA775sCmn17K570zxSXxtMcp1sAZMMlh6jNc0iytrl1Ec+SFY\nDFEZH4SB6n79WKPJH5NRdxtMXfKo0dBikyDMzlC9paH1CS+or5uMOukLMHcN5NxCScXZKlFa9frO\nBp/mP7xfoFT6AjT4kZlVNFWcLxGlVblyzMS0S3TSFyC/fpzVMKj8gitg1fwPh86iOAbpC5BfP/Z7\nsKL8dA/xc8tUn2l4QY0q6QuQXz/2GVaV36fQYDTAfwwtk74A3zCx/0vlf9RYMfwOR7x4mEufg5nh\n1nSdvv+K/Gz5fAzgB3K77C9f9aAdlOdPmOXpcMyY9qdSoO2F90+xUaO2Q0W+Bs7PM/H9ZJ12UMVS\n5N8Bo7jyUP8OaIfvPXKf/2DwvgcBNw1IojzBSy/kAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$T_{0} {\\left|1\\right\\rangle } = e^{\\frac{i \\pi}{4}} {\\left|1\\right\\rangle }$$"
      ],
      "text/plain": [
       "          ⅈ⋅π    \n",
       "          ───    \n",
       "           4     \n",
       "T ⋅❘1⟩ = ℯ   ⋅❘1⟩\n",
       " 0               "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for gate in [H,X,Y,Z,S,T]:\n",
    "    for state in [Qubit('0'),Qubit('1')]:\n",
    "        lhs = gate(0)*state\n",
    "        rhs = qapply(lhs)\n",
    "        display(Eq(lhs,rhs))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h2>Symbolic gate rules and circuit simplification</h2>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIUAAAAUBAMAAABRzuPpAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEEKvvIlRm\nu5kfdgLEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACTUlEQVQ4EY1US2gTURQ9M/lPogmBuhQqUhWE\nFnRREU1ABHeNil2ms3XVUTfdZdBF3fWDIOoig6vuzFJc2AFxpVJBxIWUjKi4EAqGNkmrMt5378w0\nTgj6FvPuuee8c+/7JCifxujxYmI0N8DMYqHZd5BvrkTJ3O703fYUw9koKYGxtVkFsm+BN/44bvkf\nQ9WM0p8VkfrOt5A5YTGOeywg1SUPl8glF4VFFoFU+h6QMgWq73cg8VBg3IMWPQiEVPlSEJJK2wFe\nBVBNNtCuqgCqwl9jlepXJZPYNuyAI1VmF+lSANVURfbnPjtAABUr8sj310JKVWqbF0Mo85wb4Hgf\nlJ60bnxitvkhEHG364seMDYWpqD9oJAxe1w9pcZ5odM7qF3ncE71rl2uyY6LfaBQy9uiAta9EA/3\nodtG6zMLl5Zpeomn4nGALkY30Qs80mTpCB722EIGqk0cXFOHNoGixXvJTQGNKh4FHuq9eIKHPDQP\nyHOxL8nfdB3byLXY4wntacbBSfEwVi2kXcHsceWIGseZfQ7DSdgWP6hJB8k96C57bJjkYWFcPG7e\np51ZguN9JD1oTqNFNQ8BGx6SPegl9mjTYqq7ggbtAmfI/pxgZsVZvo+v1W9j3nCR9YBiT/WRY487\n/ns+jy70Y/Rj6Gy+a/5S59MdfqcV3+8g+xoX/HtIVzo2nUfRjCrJPTyLio66l0ggQXQvCmqeeh+0\n0WAIjp9HyEbz4fB9cKZet5ApRSQUjrrcT8ei1NdvMVUhpvi3By8oH42vG8Dl//ov/AMGQp4Slhb5\nLgAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\left[Y_{0},Z_{0}\\right] = 2 i X_{0}$$"
      ],
      "text/plain": [
       "⎡Y ,Z ⎤ = 2⋅ⅈ⋅X \n",
       "⎣ 0  0⎦        0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAARMAAAAZBAMAAADga9dZAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMnaJRGarmVS7\n7yLz9JhJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEBklEQVRIDa1WPWxbVRT+np+ff2P7qZ06oFgu\nS4uKXRUokaCyGBhY/KSKDhmIBSpBZajFAls8IdFKrWFqUEXMgoRAKCsL8YCYkFwidUIiBpYCAuy0\nNKRNas45996X+/LzKhQf6d17zvnOOfe7vzYwKSmOWYaTKneYOtnWYbInmvvLRKsdqtgXh8qeZLJT\nm2C180/GFcscjz8LueVI9p2I9XjjWiRknqwPxif58w1wbG1zgPzabbJT8VSOAr9/+S3F3eTcYo9b\nJZn+3cCpbkWpKmhtdfHmuqjZgfKolqmAgbvKlrZRpu4pVh9D5S04HVwmujc4ODHgVkv2X5pjODvj\npT79EDj6gzicsnS6YSrpf4DkA8vrPjIk4qnQUcn6KNzSqVesEkiuI9mxHPlAG7yppwbKuGgFgKmk\n7gEecQ3Fuw9cFSueitdGgdhQusg53auuWv/NtkMqWWDKZDxhRzCVxJDQkeV1tpFWkziYyrsU71Lu\nKKRSrFklgJVPOrYdUkkCS8saSbSsEKZS6tEXqdNvvaxiDqTirVLAqxLkjpzZgDSvS82OFLb8HQMI\nqdAu0DFSkusajXqmsnBicbHfhXexaYCVD7vAhQvmxLxeYTlpUO5/nqMJKfoLzVT6Frmm2gyEkqIT\nqIqIy6IyFxBvGSxTFkw1TOVyHZhbxvv42gClTSDTzHdibtB0jyIkfgZ/5Mqkuctimia7TZoUEc8O\nlTzfEDVYvoYjZ1j4dWMqVfr6Ps6i5JPGMkVXyG1htJdKmJl7BFfCaZH9Es0ThRaswviKT4QUocWt\nVI6vViodKb7QQVEPlhyKRzVMZYu+dTj3UKBkkUIZmK7jx71UdAC9Zw9oZiyz9K341DCVHcnVGz1d\nRJzhqtAtR04PtpuKPCv3kaRptnWpv5tAY4DnNZU3ZBFnNKi7Jf80a/ku/sIJh7ToBs2DXycpIgkh\nlT8p7T09WLommGpoVeRZ2UByBDfQyHWaYMPHszGrgsbbXY5+BXjNeZgiLXJsvRYydCakCIeFN8h5\n0QdO68F2H1t3KM8KES0EmC5zXp8+mtDtOCqJVaqJ4nNvfl5LD++QmupSY+RjUsa+KiI+syqJn4CX\nemow5Jomnvp5HKtuBrn+VkDbV2rB5VX/aPydbPNGHBW5CEjQ/8kabrQpy1rtZHW7jnfGM3zgNggi\nMVSWXvj+1LitBkOiTogRPrZa1A36xpj73yCDUv+0pYt6brcjvEEEGCo6Rg32q51hUZmVd6VpUK+b\nj3tXTJjVX7F0rUoR0Z1BBFWD7fk51DGpzz4FnCDMuHTJj9ugMC5UpgahGipcZD9Rg5VtyFoVcWds\n0Dz8Ud+BVrF3ILQ/EOV+/pn9o5TXO9OKg3djfI/+j1wD/gMsWPvgyEsBygAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$- \\left[H_{0},Y_{0}\\right] = - \\sqrt{2} i \\left(- X_{0} + Z_{0}\\right)$$"
      ],
      "text/plain": [
       "-⎡H ,Y ⎤ = -√2⋅ⅈ⋅⎛- X  + Z ⎞\n",
       " ⎣ 0  0⎦         ⎝   0    0⎠"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKoAAAAUBAMAAADvmLu0AAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMnaJRKvvIlRm\nu5mq1UNKAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACe0lEQVQ4EY1TPW/TUBQ9bhLHTpzEArECogx0\nSloLKBIIix9APHVgSL1At2IhsSHVI61aGiqxwEBGvoQYYWomxNiBFTUsCCEhNVAoaQnm3mf7OUlx\n6ZXyfM+59xxfv/cCyMhN2TLflxjj3j7uUITqKYvBEvCm58j+x2t3V74JpKa5vvz6nhpWAGPzu6NU\n+6+kONZl2WEs4fN7wNH7cXW4PUKKj5v0wmWC2m/gnTnSxdNcbgFzCV+mF0wQRZE2q2ZCb4oO0ExZ\nP0yTlXWzLgxyikMDStshSHPVa9CiFlTtJ7FSPll3oonbkgCywGr0kjTXsW7iur7kD4jDlHWlnaw7\nVFBpr0SkuVIx01UaDjfpfVP0Di6sK/46DuSuu5KfpXaBhat6SkRHlkWy4Kr5JmfqD15nZniNQ+gC\nH3iL1zFX/EOZwAfMOo3n5ZOs0Hq0GG7RxxGL4zRBodtsAedRib9kwUchxKOuyjjrpmyg3IFZoU8C\nvvAhZDx0GUQhdGuAsg2dqhx8f8shHnUNG3ht0G/dpKVs1zfowG08YjoK1hV+ktUuMu2QezoJ3Amx\ncFV5PsvyI4V4FDt4hjMK5XPI7AL1Fi4O1Fln7JBrFxlH8MoFE5gMceqsV4Fryp5Kh+rBoGOomzg7\n4lraErPqjiL+uw+BKxs0q+6k/rcK5258ruW3XgD3yCswedYHw65ate/yvlY8WDTm6qUPE0E7xGmz\njgVBUMNyO1vt2bgVTPO+0gfLkDpxB4otWRBYViWdkvzrDnBrg+8rbVQcIfZi+J9nrkP3NQk5jfrp\nI3BsoMBYVhM+JZufp82TMaxrSz5MhqsjxQNgzrLTqznrsDvAHn8BwMaeqC9ESpgAAAAASUVORK5C\nYII=\n",
      "text/latex": [
       "$$- \\left[Y_{0},Z_{0}\\right] = - 2 i X_{0}$$"
      ],
      "text/plain": [
       "-⎡Y ,Z ⎤ = -2⋅ⅈ⋅X \n",
       " ⎣ 0  0⎦         0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKsAAAAZBAMAAAC8xMNUAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAEM3dMnaJRGarmVS7\n7yLz9JhJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC2klEQVRIDa1VO2wTQRB957vzF9snUkFjC2gc\nATYKvxQI1zQ+KSKFC2KBICgUcRNR2hUSnctE4nM0SAgKtxSQCFEi2QRRIYGhQiAhOwkxzgczs2ff\nLc7ZTTLSnmZn3ns7OzdnA/u2WJetuW+dAYFQcSBwMNtvByMzqPJ8MHAgeyUzWmbqxMh88Lh3D8PV\nkTTMUvp+d5yX4SKju6mlWpL3fm/ZMeDHi7eUf6A87D4CXu2ajHaMZbFGa90JkVOqQrkkjhkiextK\nBfN05CI0ZvuqMh2i2sBvQNuS4/RCfJ9FwFuWWhsyEK0LyOWGLSMLcLX+DUDflqMVoJYVAW9ZvYwo\nKROPbKaA4ECxolpfEzjUEpDeI4tQ75i9sncJo9JtWn3ZRB0LMpl9rja+QivDO9fmy7a/R1ZfpcRV\nkVRbSt6kitpawQa7T5YtpZaWahb0m25Wp3Zjero/CdePsY0z7etMEbBrKBX8gToQ6RylJkpkQrHs\nfJYaVMU9vKSNbcsWECxEKh4DllihjEBN4mc4SV63Apt8eIKNvwSWTdOqGbiAuEEeW6ADNNQiWh6y\n4b9QBS5swYibhK41IJNZgGV3aK1B2UC0yiGyXBKwEll88pCNbVFpbHlay3wAdVsmc45kxdhuQqMq\nyhwCYh8MBMq5Bi72ZG+I203a2cfGGXYiFn4hpRB6k8beJQsQyYqxbUNrQeUrkY29pxkycgbOeVSL\n3B2LQVeAa8q2n95Bm2RdMue4WrUpxpYOjJpIJCl4qgHtJKjaj16yvlW+eez8rWeZQPM7cYlvkync\ns1kcSXfMcG3HpPbEi1DpgqH1d2++/AH1tu0lGxHfuY/+czJYLCOU3ilwb4nsGlXbN3sSXve3GDIJ\nwGkH4jrSGHFQks2LuS04UN2KeM2tk//PsclOSJL1P31Ck2I6KczNGV5NcAGSJ8juXpIVwaCbEt6e\n34SB/JDt1NkhCTusT8gvYiQU+AdzFLj0ZHZYWgAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$- \\left[H_{0},Z_{0}\\right] = \\sqrt{2} i Y_{0}$$"
      ],
      "text/plain": [
       "-⎡H ,Z ⎤ = √2⋅ⅈ⋅Y \n",
       " ⎣ 0  0⎦         0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAO4AAAAZBAMAAADEVw+wAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEZquZEFS7\n7yJ05sveAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAD2ElEQVRIDaVWzWtUVxT/zcebmbwxb0JASxZi\nTIsFS0lwRES0GeimuxkXClll9B9wQNwVOm2hBlHzFrqICj51064cXOlCbHEhtOLED1y0VB9uKrRg\nmi/TRPs859x7J/eRp4HJgbn3fP3O75378d4A3cmriKU77EZQP2wE3D3WG+keuxFkT2sj6O6xV7uH\namT/7g+VOL4jOXox5vYaMXNdIx8Ch4H85JxPvwsm3z0TnQVuv+0jB4UTxB2EN3W/QpHTHP2HBy1f\nR9txLfrNmNbc+3bvRFudCyrPhUtklQZXU7JzpGda7EjmdRr4Ec4ixU9y0hc8GJlsIH/KGPZ8rAX3\n80A811ThY9RZ1bdyhkPDmMxL20ul/9SIvA1FdQRfWaVQpOIitDeZZ0p1+qSh8QqwraVcMm6rIa/s\nZN6PgEfAJMFY0qFMesjMe03b7vCSt11REXdaeEfJagfKJeP1aRxR5hreXJ0Cg8Bo0OF9oVL1WFx6\nGbdNvxUUVkxkj/C+IXPWuHjetJitKXsN79YRIKVKDQfuAGsDKtWMz381msydfoHxholMMW9ubmLi\n9H/A5s3GXVz6iaofrOlddsoiPoW9K4u0sJKXW4CTmyb1noGpebyPZgGLvcqb+pcciuQ48zrzlLeC\nfK3YlEwaItJO4KY5XcZNs0uLc0LsdBN/94yQ+pkVJnWSn0XA4l/lvePTnVUkN5g3M0Mru4x0Hcum\nQjsEdqAUyDYYp5ovh9gp2hQQlPpIfUpPs2uI5OMKWT0veRcFTC2Vy7sel8tN8iC3BISapMqFSz/L\nFb5ewR8cZ3lMpebR20rgfeXna5ySoqfHnYAG4rXkXJZWRIHF2+mXLhh8TSK8cn1rqIb4VOO9BSD7\nP9INxetwM0NDTYkWltMBK7fghdjrkhZbZ6eO4VCDOa1zf71HAXINTXKUC8v1raMaYLtk0i4sEi+t\nvLre2qmn7MIt1rI+UqG74pAaO1dbgG98DRaE6ffq73QgA00i52qY4u2A+30Il1+R2DQj/fYm8eLA\nPk55cWjsO+Rm/iJ1jG0tBVr90jL3S2ARw3uAVmG/IgHO47D7ffQtLkW/gJae2hwKgMLomxpvUame\nsL/gY0nvjSiiK3+yQepRtpV8GT1BbnS2qcDi07yF2ft3n7/WJNhtFVZHrRjqEu87z8h0MnRm/D2p\nnPo8k2H6VX5F4g1avCmf7y9vmJKBxPtrotYc/y5YYFHd0EqlWyAksQ0cGwuAK50s5/yFhPdGJ2wp\nDyxdqwJe66bDwCT6O2jHecMsoeO+vtjf/fWzKYMetP+TD2X2v+d/ThzTxf+cd6YM/PFD1WbfAAAA\nAElFTkSuQmCC\n",
      "text/latex": [
       "$$\\left[H_{0},Y_{0}\\right] = \\sqrt{2} i \\left(- X_{0} + Z_{0}\\right)$$"
      ],
      "text/plain": [
       "⎡H ,Y ⎤ = √2⋅ⅈ⋅⎛- X  + Z ⎞\n",
       "⎣ 0  0⎦        ⎝   0    0⎠"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKgAAAAZBAMAAABX83hXAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAdt3NMolEZquZEFS7\n7yJ05sveAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAC10lEQVRIDa1VO2wTQRB9d3Yc+xx/iJQiDTER\nnwgJKQKKRHzihoLKBkRQROGr6JDdRCBRYIkmouEQQkJAcYQmnV1SkUhAh2RCOpCIJSooIORHYvLh\nzZ7PcS7OpUhG2r03s2/e7s7u2sA+Lb4pNrdPFU962PQEDsL9fhAiXo0X3sAB+EaqlUjn2VbRRqz9\ntNnArUCk3Co6zODdzUFp9tZ4bH1grNIvfpu5FW2BxoEfL99zIDw1MbtSRXR2mo6IYoFtXoBr+TKM\nU7Z4e4jegFFEzqRoARlZxTlJEtHQHyC4Kp5rLH/gm3L8RVnSsI3YJ0XVN9w1iGjbIqD9cwXlWwQq\naQF7rFQrIEZd5tO0JeCeQiIamAM6asqtd2mE65PsvtJb5OpMrrmixjpCSSUgookptpRyG12u4MBd\nRbUZEg4pkl7Dq8dEFfOSkySi+YGxsYoF7UrWibHXWGZ0dbnbv3ZGbLAxTPCzxwRSKpLPInubaPKh\n5SSJaC4N9JQxijeKI90kh9uz0aJPTUtTZKiEPsTLT4gSK/UkER1iq9g4joRNJBbicFU3Udsp+rpX\njE8msgHdFnLEggHZWQePXyWJ6BrbAoxFxMpEYnLlrFIaX3eKOgT28VXuTaybLSrnHGOWSqKouqZL\nCHLmgpDI/2wjVMhUcaIuelUtr88ZdftH9kmBUQu/ECjawO8slyNJFFXXdBnBGvSkkzD+hfuwMzaO\n+KwUmZuW0C8Dh1EqU/C+SVFJoqg+p64pVxpLotRP3oUqgudl0mk/0cCMTW782PVnKeTjBZ4LXZU0\njImhlWSkspZkTRMmdG4pPP/x3exfKc+yn2hUvewA/034qO4ADzY/qJouOz8onIHmnP5bx2Hf+vQb\nw8DFJuzCxunXA93qnrI2ddMs33vq0rZ/VRJr6lrb0+eAkXRdYGTE9tv+FrEZSVKTqBpqbyYQ7/r2\nPbxtbufRba7X0XpNb2hv/z/8Ab0/sDZrbQAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$\\left[H_{0},Z_{0}\\right] = - \\sqrt{2} i Y_{0}$$"
      ],
      "text/plain": [
       "⎡H ,Z ⎤ = -√2⋅ⅈ⋅Y \n",
       "⎣ 0  0⎦          0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for g1 in (Y,Z,H):\n",
    "    for g2 in (Y,Z,H):\n",
    "        e = Commutator(g1(0),g2(0))\n",
    "        if g1 != g2:\n",
    "            display(Eq(e,e.doit()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAL4AAAAUBAMAAADB3ZomAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqvNmRDdRHYyiVS7\n7yJfG51DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADOklEQVQ4EZ1TTWgTQRT+kqZJNmt+8ChCY63i\nyZaiB0HMIqhY0Ab1WGwUxN6y4MFDkeYgCMXSaHvvIi16axDpTS0VTyKpF1FEWoonL/1PrSaN35vZ\nTZpCS+nAzHzfzPfevnnvLYDD1TMy05BxtNqHm9VPCgPNT1uPxRyEixvAVOUjT393vUggVplpL7em\nHFclm69YyjWnygV11ECAVR6W1AWX9gR8JzwylIB5LQEcKvPkLGfkHHAcEQfRDAK8qA//MiPVMQIN\nJPQHMNY85VgHnnu45x5R9zzQX+Ti8D3neRC1/MCiBZ9NUhvGKoykxxpIZBMI//OumjZjNVlK4nnE\nOTFgIVQAmjIk/qVnQEsBYS9annGk8gsa7CRNS0zAundnrtRkAfXRUd5YwSVE6G7SJols5pnGNEKe\nid7fn07WD7aT+DQQz9Tu5qSMaixmZLvNafmWEQBiUikEWGx8FdQwomUG4I3tZKCztbVoIfzKUbeT\nOdlGODUiYGpKiDByVgoIbvFLUq/BQaFKyk1fGh3qTBMtmORzhws4gtfqqn2W2+hJLlleqMHUdNsP\n6ZmVAnop8DF1PsdMkiopd3+Fi3Exw9UlriBFXkzjPuJposCCyvoU4ZxwcGFqFqcnmEVVpWGH9kRB\nG4qLlON6e4GrmRGsiSuQ3l5F8yaiIrhqCIcYZQWYeT6dDbBl0eMSD5p/cmH7ozePH4RKyhjyY9Mk\n2r8mWqDa/y+MLQQTdGUjO+8adQtg7OhnCdYcHTX8kiS2P8bmcYfQ9f9S1cX1r4kWqPbfgLGOYA54\nwtamrTJadAiYFjWzNj/Cf1T3KNsfY2n0kWv/YRs+qbmK3yVaII9m+zP+aA5+y82y5Mekuzdpggxn\nCyeG8ui5IID1kvi/CVb5byOo8lD5d4kS3Eit5ALFco75j9sj1e8IpUpJ1+jWTJvNhH8uJZgbcWW0\njV/hFvlQ7cxJ/uVPEP9GqpLHg+pd5b9GPIGI4PWPJjooF++y7egfrVLxuwaeQNPHbv9r9tbV7LGF\nLTMZ48/eIDVn6xYiqLNI16U6+ZU9VSe7ofHxtPEFDdLY5ZVcXU5BnRwMmQcz27fVu30rDyZkZ+05\n/gPqXAXJMStrqwAAAABJRU5ErkJggg==\n",
      "text/latex": [
       "$$H_{0} X_{1} CNOT_{0,1} X_{1} X_{0}$$"
      ],
      "text/plain": [
       "H ⋅X ⋅CNOT   ⋅X ⋅X \n",
       " 0  1     0,1  1  0"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = H(0)*X(1)*H(0)**2*CNOT(0,1)*X(1)**3*X(0)*Z(1)**2\n",
    "c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAACRCAYAAABg1WvMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAC7xJREFUeJzt3V9M1fUfx/HX+SCZtCliBawD59QoMKfIpt5YqRs5lHKT\ndJPNwbgBvGir0NZWy7Uu8ibsxoGNlstshjLK6Y0DI2PqVlpQBrmCllIDBWkrY8U5n99Fi+mPfwd3\n+Hw55zwf2/fmfL5nn/eX974vPvvwPRyftdYKAOCE8boAAEgkhC4AOEToAoBDhC4AOEToAoBDhC4A\nOEToAoBDhC4AOEToAoBDhC4AOEToAoBDhC4AOEToAoBDhC4AOEToAoBDhC4AOEToAoBDhC4AOETo\nAoBDhC4AOEToAoBDhC4AOEToAoBDhC4AOEToAoBDhC4AOEToxohgMCifz+fkCAaDXl9uXKF3uJ3P\nWmu9LgLT8/l8ctUql3MlAnqH27HSBQCHCF0AcGie1wUAkRodHdWJEyd07NgxDQwMKBwOKy0tTcXF\nxdqxY4dSUlK8LhGYFivdOFJaWqqsrCwZY2SMUXZ2tg4fPjw2Xl1draSkJBljlJGRoU2bNnlYbeRG\nRkb05ptvKhgM6p133lFhYaFeeeUVtbW16bnnnlNzc7Oys7P10ksvaWhoyOty70q89g4TsIgJkbYq\nFArZnJwca4yxvb2948bz8vLswYMHozKXC0NDQ/bJJ5+0W7ZssR0dHXeM3V5nb2+vra6utrm5uban\np8d1mVNK1N5hYqx044wxRpWVlbLW6siRI3eM7d69W/v371dlZaVH1c3MyMiInn32WeXn56u5uVkr\nVqyY9NxgMKi6ujrt2rVLTz/9tK5fv+6w0uiIp95hcjwyFiNm8ijQjRs35Pf7lZmZqd7eXknSvn37\n5Pf7tXPnzqjONZv27t2rzs5ONTU1yZjx64PJ6tyzZ4/6+vr00UcfuShzWonYO0yO0I0RM72ZSktL\n1djYqBMnTqi/v183b95UTU3NrMw1G/7++28FAgG1trbq8ccfn/CcyeocHh7Www8/rK6uLmVkZMx2\nqdNKtN5hamwvxKmqqipZa1VTU6Pu7u6Ib9q5orm5WXl5eZMG7lRSU1O1fft2NTQ0zEJlsy/We4ep\nsdKNEXezglm6dKmuXLmin3/+WVlZWbM6V7Rt27ZNW7ZsUVlZ2aTnTFXn+fPnVVVVpc7OztkqMWKJ\n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\nccSpn94SmrUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11052bcf8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "circuit_plot(c, nqubits=2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This performs a commutator/anticommutator aware bubble sort algorithm to simplify a circuit:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAIoAAAAUBAMAAACgxbhkAAAAMFBMVEX///8AAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv3aB7AAAAD3RSTlMAZqvNmRDdRHYyiVS7\n7yJfG51DAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACnUlEQVQ4EY1STWgTURD+kuZvN+YHj14aYxFP\nBooeBHH3IkJBu4jHYqMgesuCBw9FuoeeiqUr9t5FUvTWINKbGio9SvQigohFPHlJatrUaH783nu7\naS20ZuDNfvPNvNmZeQPgeP+cOBakRB/lT6Y9JGq7wFp3g9yPiadZpLvrhU7e8FSQ1KFay4kanYpP\nNfltBe6FLJJXs8CxDpnzPPoF4BR0D6kiInTsSXiLJfg/R/wXoG37zqk7BJObwEyNygOiF0mkzDBQ\nNxGyaQxEa0LLBZbeBhJ/fMsQuR/yrMyaiFeAkSKNcOMxMFpBIvgzOYrhflOAeqTB+neUGZHZlmiY\nsQZ0Xlq1aehtFyhYiKuoQL85mwsgMlUgU1RmXX5v0jBDW4gAaTE0RDhqfBToH0l1+BtfZsfz+ZqJ\nxHOPf3Z8ks20oLMKDg2I9ZhPjG5+XvqfSO07FbfKahcrOIEXQIlYCpuZtB/wPocGTL8HQmw25CVz\nNJdOC5Lj6lL5nEFYs3AXGQtfZYlUbKZeXWGrcmCLHq8QxWxIe41XKNcKlQEnFqOJaBupCkrCmXTZ\nCSfeMxnTIBH9QsV1wbSLz4RQWSLucjXg5Lr8htZDLCs3RdSBGSC+7akKEBZtcV2wvIlbhH6WZ3Je\nipPrsgttBzEHdY8xbESeks1U3E/12lwXLFu4R1tlSdgIceKKEzVzXVhLykGSl15ajCvyjPJgwcXU\nJQE4OlHLJ4FlR2MEfUtx142fTqTWcTiXjA3cWB+jjr5rZdmNuKCNla/wo7/tjztiLmJzRBbN6Lq4\n37894AQP9UYKHqoPvJGMCzh1aU7sy38kYSZz6Q3g1b44we2Z+sTlPeMwVC5b2gd8L53ZF0BunzUs\nTA4beGTc6yO9wzr5egflL+4px4FmdRUFAAAAAElFTkSuQmCC\n",
      "text/latex": [
       "$$H_{0} CNOT_{0,1} X_{0}$$"
      ],
      "text/plain": [
       "H ⋅CNOT   ⋅X \n",
       " 0     0,1  0"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gate_simp(c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<sympy.physics.quantum.circuitplot.CircuitPlot at 0x110567940>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x110567fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "circuit_plot(gate_simp(c),nqubits=2)"
   ]
  }
 ],
 "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.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}