{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pennylane as pl\n", "from pennylane import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 1: Uniform superpositions" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaMAAAB4CAYAAABfG52sAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAABzklEQVR4nO3VMQEAIADDMMC/5yGjT6KgX++2HQAIvToAAMwIgJwZAZAzIwByZgRAzowAyJkRADkzAiBnRgDkzAiAnBkBkDMjAHJmBEDOjADImREAOTMCIGdGAOTMCICcGQGQMyMAcmYEQM6MAMiZEQA5MwIgZ0YA5MwIgJwZAZAzIwByZgRAzowAyJkRADkzAiBnRgDkzAiAnBkBkDMjAHJmBEDOjADImREAOTMCIGdGAOTMCICcGQGQMyMAcmYEQM6MAMiZEQA5MwIgZ0YA5MwIgJwZAZAzIwByZgRAzowAyJkRADkzAiBnRgDkzAiAnBkBkDMjAHJmBEDOjADImREAOTMCIGdGAOTMCICcGQGQMyMAcmYEQM6MAMiZEQA5MwIgZ0YA5MwIgJwZAZAzIwByZgRAzowAyJkRADkzAiBnRgDkzAiAnBkBkDMjAHJmBEDOjADImREAOTMCIGdGAOTMCICcGQGQMyMAcmYEQM6MAMiZEQA5MwIgZ0YA5MwIgJwZAZAzIwByZgRAzowAyJkRADkzAiBnRgDkzAiAnBkBkDMjAHJmBEDOjADImREAOTMCIGdGAOTMCICcGQGQMyMAcmYEQM6MAMiZEQC5D2hSBOzZIoUXAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_bits = 4\n", "dev = pl.device(\"default.qubit\", wires=n_bits)\n", "\n", "@pl.qnode(dev)\n", "def uniformsuperposition():\n", " \"\"\"Build a circuit that creates an n-qubit uniform superposition\"\"\"\n", " return pl\n", "\n", "pl.drawer.use_style(\"black_white\")\n", "pl.draw_mpl(uniformsuperposition)();\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 2: Oracles" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]\n" ] } ], "source": [ "def oracle_matrix(key):\n", " \"\"\"Create the unitary matrix corresponding to the binary key (list[int])\n", " e.g. key=[0,1,1] should give the diagonal matrix [1,1,1,-1,1,1,1,1]\"\"\"\n", " # Hint: use np.ravel_multi_index\n", " matrix = np.identity(2**len(key))\n", " return matrix\n", "\n", "print(oracle_matrix([0,1,1,0]))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n" ] }, { "data": { "image/png": "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njwpeczTk13dcd42ztuO7mMYEZHHnDvCoqOjBVXSvx9++AELFizos1EhISGh94razmHk6yE64P516X6OYeQeD9MRkc9C+Vp0I0eOhMFgwNixY90+XlhYCJlMhurqapc7t/ojjEJ524QSbiUiimhyuRxr1qzBxYsXsXHjxj7DITMzE11dXb1jX052Jc8xjIhoUBg1ahSKiopQX18/oOf7crIreY5hRESDinPHXF/8cYiOBo5hRESDhsPhwHPPPTeg5zKMgovddEQU1jo7O9HQ0ACTyYT29vbebrWYmBgMHz4cqampSE1NhVKpxObNm92ucfr0aWzcuFHSTccwCi6GERGFlfb2dhiNRnzxxRc4c+YMLly44HISq7OoqChoNBpcuHDB5bHGxkao1WqcOHECe/fuRV5eHrq7u30+2ZU8wzAiopDncDhQW1uLDz74AEajERaLxaPX37t3z20QTZ8+vfceTD1dd4sWLcJnn33Gluwg49YmopBWU1OD1NRU6HQ67N271+MgepgzZ84gNTUVNTU1vXOjRo3CmjVr/PYeNDCDIoz+67/+Cy+++CJGjhyJoUOH4u///u9RWVkpuiwieojvvvsOK1asQEZGBs6fP9/v89VqNbRaLTIyMpCRkQGtVgu1Wt3v686fP4+MjAy88sor+P777/1ROnkh4g/THTt2DFlZWYiJicGKFSswfPhw7Nu3D8uXL8eVK1fw5ptvii6RiH7G4XBgz549eOutt9De3u72OVFRUVi4cCFeeOEFTJ8+HdOmTevzFhYGgwGlpaX9vu8nn3yCgwcPYufOnVi3bp1PfwN5wRHBuru7HWq12qFUKh3//d//3Tt/584dx+OPP+6Ijo52NDc3iyuQKExt2LDBAaD3vw0bNvhl3e7ubsfGjRsla//8vylTpjh27tzp+P777we03u3bt92uk5eX55gyZUqf77Np0yZHd3e3X/6mQG2rSBPRh+m+/PJLNDU14dVXX8WMGTN650eMGIG3334bXV1d2Lt3r7gCiahXV1cXsrOzUVxc7PLYqFGjUFpaCpPJhK1btyIhIWFAaz766KMuc1qtFvn5+TCZTCgpKcHIkSNdnlNUVITs7GzJ5YEosCI6jL766isA96855SwrKwsAcPz48WCWRERudHd3Y9myZaiqqnJ5bPXq1bhw4QLWrl3rUYfbV1995fYK2T3NCnK5HOvWrcPFixexevVql+dVVVVh2bJl6O7u9uAvIW9FdBj13FHR+U6LwP3Lxg8bNox3XSQKAe+88w4OHDggmYuOjsbHH3+MiooKl1t398fRx5UWysvLMWTIEMmcSqVCRUUF/vKXv7jcCuPAgQN49913PXpv8k5ENzD0XIOqr4sdxsfHD/g6VaHC4XD4tbWVyBv+3Fuorq5GQUGBZG7o0KH4/PPPodPpvFqzrystvPHGG32+5tVXX8X48ePx0ksv4e7du73zBQUFmDdvHubPn+9VLTQwER1GkchisWDYsGGiyyDyi+vXr2PVqlWSuSFDhuDw4cOYM2eOV2veuXMHhYWFLvONjY39vlan0+Hw4cN4/vnnewPX4XBg1apVOHPmjMd7aDRwEX2YrmePqK+9n7a2Nl4inkggg8GA1tZWydyOHTu8DiKg76aFgZxzBABz5sxx2VO7du0a1q9f73VN1L+I3jPq+a3IbDZj1qxZkseuXbuGn376CU899ZSI0rwWFxeHn376SXQZNMht2bIFZWVlPq1hMplcGhZefPHFPg+xDUR/TQsDtXnzZlRXV+PQoUO9c/v370dDQwNSUlK8ro/6FtFhNHfuXPzhD3/A0aNHsWLFCsljR44c6X1OOJHJZBg6dKjoMmiQc24C8MZ7770nGT/yyCOoqKiATCbzaj1Pmhb6I5fLUVFRgSlTpuD27duSmsvLy72qjx4uog/TzZs3D5MnT8bHH3+M//mf/+md//HHH/H73/8e0dHReO2118QVSDRIXbt2DR999JFkbsOGDRg7dqzXa3rTtPAwKpUKGzZskMx9+OGHuHbtmlfr0cNFdBgpFAqUl5fDbrdDq9Vi7dq1ePPNNzF9+nT87//+L37/+98jKSlJdJlEg05paankhNLo6Ghs2rTJ6/V8aVp4mE2bNknavbu6ugZ0aSHyXESHEQA899xzOHHiBJ555hn8+7//O/70pz9h3Lhx+OSTT3hdOiJBvvzyS8l41apVGDdunNfr+dq00JeEhASsXLlSMnfs2DGf1iT3Ivo3ox5PPfWU5IdIIhLHZrOhvr5eMrdo0SKv1/NX00JfFi1ahPfff793XF9fD5vNBoViUHx9Bk3E7xkRUWg5d+6cy4nb6enpXq3lz6aFvjjXdvfuXZhMJr+sTQ8wjIgoqE6dOiUZq9VqrxsX/N204I5Kpeq9G2wP57+BfMcwIqKg+vbbbyXjtLQ0r9YJVNOCO841Ov8N5DuGEREFVUdHh2Ts7VVQAtW04I5zjc5/A/mOv8ARUVC9+eabWLFiBTo6OtDR0YHx48d7vEagmxac5ebmYtmyZYiNjUVsbCwee+yxgLzPYMYwIqKgSkxMRGJiotevD0bTgrMZM2ZIbtBJ/sfDdEQUVoLRtEDBxzAiorARzKYFCi6GERGFjWA2LVBwMYyIKCwEu2mBgothREQ+s9vtAV1fRNOCvwR620QKhhEReUypVErGP78CdyCEc9OC1WqVjGNiYgRVEtoYRkTkMecvVOdrzflTuDctOG8bhpF7DCMi8tiYMWMk4ytXrgTsvcK9aeHq1auS8ejRowVVEtoYRkTkseTkZMk4UHspDQ0NYd+0YDabJWONRiOoktDGMCIijzl/oba2tqKtrc2v7+FwONze/TUcmhZ6tLW14fr165I5hpF7DCMi8tjkyZMhk8kkc857AL7q6upCSkoK5PIHX1PPPPNMWDQt9HDeJnK5HJMmTRJUTWhjGBGRx5RKJSZOnCiZ8/ehM6VSiaKiItTX12P27NmIj4/Hp59+6tf3CLTq6mrJeOLEiS6diHQfw4iIvJKVlSUZG43GgLxPWloaTpw4gZMnTyIhISEg7xEoztvEeZvRAwwjIvKKXq+XjL/55htcunQpIO8ll8uRkpISkLUDpampCadPn5bMOW8zeoBhRERemTt3rsvtwt2dDzRYFRUVScYqlQparVZQNaGPYUREXlEoFFi6dKlkrrCwEOfOnRNUUeg4e/asSzAvWbIECgVvIdcXmcPhcIgugojCU1NTE1JTUyWXvNFqtTh27JikC24wsdvt0Ol0qKur651TKpUwmUxhc6KuCIPz00JEfqFWq7Ft2zbJXG1tLQwGw6C8QKjdbofBYJAEEQDk5eUxiPrBPSMi8onFYkFKSgpaWlok8zk5OSgpKRk0e0g9QVRWViaZT0pKQkNDA2JjYwVVFh4Gx6eEiAImLi4Oe/bscfk9pKysDDqdDmfPnhVUWfCcPXsWOp3OJYgUCgVKS0sZRAPAMCIin2VmZqKystIlkOrq6pCWloYtW7agqalJUHWB09TUhC1btiAtLc3l0JxCoUBlZSUyMzMFVRdeeJiOiPymqqoK2dnZsNlsbh+fOXMm9Ho9MjIyoNFoEB8fH+QKfdPW1gaz2Yzq6moYjUaX84h69ATR4sWLg1xh+GIYEZFfHT16FOvWrUNzc3O/z1WpVNBoNEhMTERcXByUSmXI/MZkt9thtVphsVhw9epVmM1ml4ueupOUlITS0lLuEXmIYUREftfR0YH8/HwUFBS43Ok0UimVSuTl5WH79u38jcgLDCMiCpimpibs2rUL+/btw40bN0SXExAqlQpLlizB1q1b2b7tA4YREQWczWZDbW0tjEYjjhw5gubmZoTrV49MJkNSUhKysrKg1+uh1Wp5ZQU/YBgRUdBZrVZcvnwZZrMZZrMZt27dQmdnp9u7uooUExODmJgYjB49GhqNBhqNBpMmTeJtIAKAYURERMKFRtsKERENagwjIiISjmFERETCMYyIiEg4hhEREQnHMCIiIuEYRkREJBzDiIiIhGMYERGRcAwjIiISjmFERETCMYyIiEg4hhEREQnHMCIiIuEYRkREJBzDiIiIhGMYERGRcAwjIiISjmFERETCKUQXQESDj9VqxaVLl2A2m9HY2IibN2+is7MTVqtVdGkSSqUSMTExGDNmDJKTk6HRaDB58mQolUrRpUUchhERBZzNZsPx48dhNBpx5MgRtLS0wOFwiC7LKzKZDBMnTkRWVhb0ej3mzp0LhYJfpb6SOcL1E0FEIa+xsRG7d+/Gvn37cOPGDdHlBMTYsWOxdOlSbN26FWq1WnQ5YYthRER+Z7FYkJ+fj4KCAnR1dYkuJyiUSiW2bduG7du3Iy4uTnQ5YYdhRER+dfToUaxduxYtLS39PnfcuHFITk7GhAkTEBcXh+joaMjlodFXZbfb0dXVBYvFgitXrqCxsRGtra39vi4pKQmlpaXIzMwMQpWRg2FERH5TVVWF7Oxs2Gw2t4/PmjULer0e8+fPh0ajQXx8fJAr9E1bWxvMZjNqampQWVmJ06dPu32eQqFAZWUlFi9eHOQKwxfDiIj8oq8gioqKQm5uLnJzczF58mRB1QVGU1MTioqKUFhYiHv37kkeYyB5hmFERD47evQoFi5c6BJEWq0WxcXFmDp1qqDK/Keurg7PPvus28fOnTuHjRs3ora2VjKvUChw8OBBHrIbAIYREfnEYrEgJSXF5TeinJwclJSUhMxvQN6y2+14++23cevWLZSVlT30eQaDweU5SUlJaGhoQGxsbKBLDWvh/SkhIuHy8/MjNog6OjqwfPlyFBQUYPbs2Q99rlwuR0lJCXJyciTzzc3NyM/PD2SZEYF7RkTktcbGRkydOlVy5QStVotjx46FfRC1trbi5Zdfxtdffw0AaGhowJNPPtnv6+x2O3Q6Herq6nrnlEolTCYTz0N6iPD+tBCRULt375YEUVRUFIqLi8M+iEwmE9LT03uDaOTIkXjiiScG9Fq5XI7i4mJERUX1zlmtVuzatSsgtUaK8P7EEJEwNpsN+/btk8zl5uaGfbNCTU0Nnn76acmhx/T0dI8Cdtq0acjNzZXM7d+/v8+Wd2IYEZGXjh8/7nKJH+cv4HBTXl6OBQsWoK2tTTLf3+9F7mzatEkyvn79uku3HT3AMCIirxiNRsl41qxZYXsekd1uR15eHnJyctzuvXgTRmq1GjNnzpTMOW8zeoBhREReOXLkiGSs1+sFVeKbjo4OZGdnY8eOHW4fl8lkSE9P92pt523ivM3oAYYREXnMarW6tHPPnz9fUDXea21thU6nc/nt6+dSUlIwYsQIr9bPyMiQjFtaWkLunk2hgmFERB67dOmSy/2IHn/8cUHVeMe5Y64v3hyi66HRaCRju92Oy5cve71eJGMYEZHHzGazZDxu3DgMHz5cUDWeq66udumYA4ARI0a4dM35Ekbx8fFQqVSSOedtR/cxjIjIY42NjZJxcnKyoEo8V1ZW5rZjLikpCZWVlbDb7ZJ5X8IIcN07Yhi5xzAiIo/dvHlTMp4wYYKgSgaup2Nu7dq1LlfYTk9Px6lTp/Djjz9K5j052bUviYmJkvGtW7d8Wi9S8cbtROSxzs5OyTjU72xqsVjw2muvuW1U0Ov12Lt3L2JjY3Hy5EnJY56e7OqO87Zx3nZ0H8OIiDzm3BEWHR0tqJL+/fDDD1iwYEGfjQoJCQm9V9R2DiNfD9EB969L93MMI/d4mI6IfBbK16IbOXIkDAYDxo4d6/bxwsJCyGQyVFdXu9y51R9hFMrbJpRwKxFRRJPL5VizZg0uXryIjRs39hkOmZmZ6Orq6h37crIreY5hRESDwqhRo1BUVIT6+voBPd+Xk13JcwwjIhpUnDvm+uKPQ3Q0cAwjIho0HA4HnnvuuQE9l2EUXOymI6Kw1tnZiYaGBphMJrS3t/d2q8XExGD48OFITU1FamoqlEolNm/e7HaN06dPY+PGjZJuOoZRcDGMiCistLe3w2g04osvvsCZM2dw4cIFl5NYnUVFRUGj0eDChQsujzU2NkKtVuPEiRPYu3cv8vLy0N3d7fPJruQZhhERhTyHw4Ha2lp88MEHMBqNsFgsHr3+3r17boNo+vTpvfdg6um6W7RoET777DO2ZAcZtzYRhbSamhqkpqZCp9Nh7969HgfRw5w5cwapqamoqanpnRs1ahTWrFnjt/eggYn4MProo4+wbt06/PKXv4RSqYRMJkNFRYXosoioH9999x1WrFiBjIwMnD9/vt/nq9VqaLVaZGRkICMjA1qtFmq1ut/XnT9/HhkZGXjllVfw/fff+6N08kLEH6b7x3/8R7S0tGDMmDF49NFHXS4ZT0ShxeFwYM+ePXjrrbfQ3t7u9jlRUVFYuHAhXnjhBUyfPh3Tpk3r8xYWBoMBpaWl/b7vJ598goMHD2Lnzp1Yt26dT38DeS7i94zKy8vR3NyMGzduwGAwiC6HiB7CZrMhNzcXBoPBbRBNmTIFO3fuxNWrV/HXv/4V69evx9NPP91nEN25c8dtEOXl5WHKlCku8+3t7TAYDMjNzYXNZvP9D6IBi/gwmj9/PiZOnCi6DCLqR1dXF7Kzs1FcXOzy2KhRo1BaWgqTyYStW7ciISFhQGs++uijLnNarRb5+fkwmUwoKSnByJEjXZ5TVFSE7OxsyeWBKLAiPoyIKPR1d3dj2bJlqKqqcnls9erVuHDhAtauXetRh9tXX33l9grZPc0Kcrkc69atw8WLF7F69WqX51VVVWHZsmXo7u724C8hbzGMiEi4d955BwcOHJDMRUdH4+OPP0ZFRYXLrbv709eVFsrLyzFkyBDJnEqlQkVFBf7yl7+43ArjwIEDePfddz16b/JOxDcwRBqHw+HX1lYib/hzb6G6uhoFBQWSuaFDh+Lzzz+HTqfzas2+rrTwxhtv9PmaV199FePHj8dLL72Eu3fv9s4XFBRg3rx5mD9/vle10MAwjMKMxWLBsGHDRJdB5BfXr1/HqlWrJHNDhgzB4cOHMWfOHK/WvHPnDgoLC13mGxsb+32tTqfD4cOH8fzzz/cGrsPhwKpVq3DmzBmP99Bo4HiYjoiEMRgMaG1tlczt2LHD6yAC+m5aGMg5RwAwZ84clz21a9euYf369V7XRP3jnlGYiYuLw08//SS6DBrktmzZgrKyMp/WMJlMLg0LL774Yp+H2Aaiv6aFgdq8eTOqq6tx6NCh3rn9+/ejoaEBKSkpXtdHfWMYhRmZTIahQ4eKLoMGOecmAG+89957kvEjjzyCiooKyGQyr9bzpGmhP3K5HBUVFZgyZQpu374tqbm8vNyr+ujheJiOiILu2rVr+OijjyRzGzZswNixY71e05umhYdRqVTYsGGDZO7DDz/EtWvXvFqPHi7iw6i8vByvv/46Xn/9dRiNRpc5/iuHKPhKS0slJ5RGR0dj06ZNXq/nS9PCw2zatEnS7t3V1TWgSwuR5yL+MF3PPUp+7m9/+xv+9re/9Y7/4R/+IdhlEQ1qX375pWS8atUqjBs3zuv1fG1a6EtCQgJWrlyJ999/v3fu2LFj+O1vf+vTuuQq4veMKioq4HA4+vyPV/AmCi6bzYb6+nrJ3KJFi7xez19NC31xrq2+vp7XrQuAiA8jIgot586dczlxOz093au1/Nm00Bfn2u7evQuTyeSXtekBhhERBdWpU6ckY7Va7XXjgr+bFtxRqVS9d4Pt4fw3kO8YRkQUVN9++61knJaW5tU6gWpacMe5Rue/gXzHMCKioOro6JCMR4wY4dU6gWpacMe5Rue/gXwX8d10RBRa3nzzTaxYsQIdHR3o6OjA+PHjPV4j0E0LznJzc7Fs2TLExsYiNjYWjz32WEDeZzBjGBFRUCUmJiIxMdHr1wejacHZjBkzMGPGjICsTffxMB0RhZVgNC1Q8DGMiChsBLNpgYKLYUREYSOYTQsUXAwjIgoLwW5aoOBiGBGRz+x2e0DXF9G04C+B3jaRgmFERB5TKpWS8c+vwB0I4dy0YLVaJeOYmBhBlYQ2hhERecz5C9X5WnP+FO5NC87bhmHkHsOIiDw2ZswYyfjKlSsBe69wb1q4evWqZDx69GhBlYQ2hhEReSw5OVkyDtReSkNDQ9g3LZjNZslYo9EIqiS0MYyIyGPOX6itra1oa2vz63s4HA63d38Nh6aFHm1tbbh+/bpkjmHkHsOIiDw2efJkyGQyyZzzHoCvurq6kJKSArn8wdfUM888ExZNCz2ct4lcLsekSZMEVRPaGEZE5DGlUomJEydK5vx96EypVKKoqAj19fWYPXs24uPj8emnn/r1PQKturpaMp44caJLJyLdxzAiIq9kZWVJxkajMSDvk5aWhhMnTuDkyZNISEgIyHsEivM2cd5m9ADDiIi8otfrJeNvvvkGly5dCsh7yeVypKSkBGTtQGlqasLp06clc87bjB5gGBGRV+bOnetyu3B35wMNVkVFRZKxSqWCVqsVVE3oYxgRkVcUCgWWLl0qmSssLMS5c+cEVRQ6zp496xLMS5YsgULBW8j1ReZwOByiiyCi8NTU1ITU1FTJJW+0Wi2OHTsm6YIbTOx2O3Q6Herq6nrnlEolTCZT2JyoK8Lg/LQQkV+o1Wps27ZNMldbWwuDwTAoLxBqt9thMBgkQQQAeXl5DKJ+cM+IiHxisViQkpKClpYWyXxOTg5KSkoGzR5STxCVlZVJ5pOSktDQ0IDY2FhBlYWHwfEpIaKAiYuLw549e1x+DykrK4NOp8PZs2cFVRY8Z8+ehU6ncwkihUKB0tJSBtEAMIyIyGeZmZmorKx0CaS6ujqkpaVhy5YtaGpqElRd4DQ1NWHLli1IS0tzOTSnUChQWVmJzMxMQdWFFx6mIyK/qaqqQnZ2Nmw2m9vHZ86cCb1ej4yMDGg0GsTHxwe5Qt+0tbXBbDajuroaRqPR5TyiHj1BtHjx4iBXGL4YRkTkV0ePHsW6devQ3Nzc73NVKhU0Gg0SExMRFxcHpVIZMr8x2e12WK1WWCwWXL16FWaz2eWip+4kJSWhtLSUe0QeYhgRkd91dHQgPz8fBQUFLnc6jVRKpRJ5eXnYvn07fyPyAsOIiAKmqakJu3btwr59+3Djxg3R5QSESqXCkiVLsHXrVrZv+4BhREQBZ7PZUFtbC6PRiCNHjqC5uRnh+tUjk8mQlJSErKws6PV6aLVaXlnBDxhGRBR0VqsVly9fhtlshtlsxq1bt9DZ2en2rq4ixcTEICYmBqNHj4ZGo4FGo8GkSZN4G4gAYBgREZFwodG2QkREgxrDiIiIhGMYERGRcAwjIiISjmFERETCMYyIiEg4hhEREQnHMCIiIuEYRkREJBzDiIiIhGMYERGRcAwjIiISjmFERETCMYyIiEg4hhEREQnHMCIiIuEYRkREJBzDiIiIhGMYERGRcArRBRDR4GO1WnHp0iWYzWY0Njbi5s2b6OzshNVqFV2ahFKpRExMDMaMGYPk5GRoNBpMnjwZSqVSdGkRh2FERAFns9lw/PhxGI1GHDlyBC0tLXA4HKLL8opMJsPEiRORlZUFvV6PuXPnQqHgV6mvZI5w/UQQUchrbGzE7t27sW/fPty4cUN0OQExduxYLF26FFu3boVarRZdTthiGBGR31ksFuTn56OgoABdXV2iywkKpVKJbdu2Yfv27YiLixNdTthhGBGRXx09ehRr165FS0tLv88dN24ckpOTMWHCBMTFxSE6OhpyeWj0VdntdnR1dcFiseDKlStobGxEa2trv69LSkpCaWkpMjMzg1Bl5GAYEZHfVFVVITs7Gzabze3js2bNgl6vx/z586HRaBAfHx/kCn3T1tYGs9mMmpoaVFZW4vTp026fp1AoUFlZicWLFwe5wvDFMCIiv+griKKiopCbm4vc3FxMnjxZUHWB0dTUhKKiIhQWFuLevXuSxxhInmEYEZHPjh49ioULF7oEkVarRXFxMaZOnSqoMv+pq6vDs88+6/axc+fOYePGjaitrZXMKxQKHDx4kIfsBoBhREQ+sVgsSElJcfmNKCcnByUlJSHzG5C37HY73n77bdy6dQtlZWUPfZ7BYHB5TlJSEhoaGhAbGxvoUsNaeH9KiEi4/Pz8iA2ijo4OLF++HAUFBZg9e/ZDnyuXy1FSUoKcnBzJfHNzM/Lz8wNZZkTgnhERea2xsRFTp06VXDlBq9Xi2LFjYR9Era2tePnll/H1118DABoaGvDkk0/2+zq73Q6dToe6urreOaVSCZPJxPOQHiK8Py1EJNTu3bslQRQVFYXi4uKwDyKTyYT09PTeIBo5ciSeeOKJAb1WLpejuLgYUVFRvXNWqxW7du0KSK2RIrw/MUQkjM1mw759+yRzubm5Yd+sUFNTg6efflpy6DE9Pd2jgJ02bRpyc3Mlc/v37++z5Z0YRkTkpePHj7tc4sf5CzjclJeXY8GCBWhra5PM9/d7kTubNm2SjK9fv+7SbUcPMIyIyCtGo1EynjVrVtieR2S325GXl4ecnBy3ey/ehJFarcbMmTMlc87bjB5gGBGRV44cOSIZ6/V6QZX4pqOjA9nZ2dixY4fbx2UyGdLT071a23mbOG8zeoBhREQes1qtLu3c8+fPF1SN91pbW6HT6Vx++/q5lJQUjBgxwqv1MzIyJOOWlpaQu2dTqGAYEZHHLl265HI/oscff1xQNd5x7pjrizeH6HpoNBrJ2G634/Lly16vF8kYRkTkMbPZLBmPGzcOw4cPF1SN56qrq1065gBgxIgRLl1zvoRRfHw8VCqVZM5529F9DCMi8lhjY6NknJycLKgSz5WVlbntmEtKSkJlZSXsdrtk3pcwAlz3jhhG7jGMiMhjN2/elIwnTJggqJKB6+mYW7t2rcsVttPT03Hq1Cn8+OOPknlPTnbtS2JiomR869Ytn9aLVLxxOxF5rLOzUzIO9TubWiwWvPbaa24bFfR6Pfbu3YvY2FicPHlS8pinJ7u647xtnLcd3ccwIiKPOXeERUdHC6qkfz/88AMWLFjQZ6NCQkJC7xW1ncPI10N0wP3r0v0cw8g9HqYjIp+F8rXoRo4cCYPBgLFjx7p9vLCwEDKZDNXV1S53bvVHGIXytgkl3EpEFNHkcjnWrFmDixcvYuPGjX2GQ2ZmJrq6unrHvpzsSp5jGBHRoDBq1CgUFRWhvr5+QM/35WRX8hzDiIgGFeeOub744xAdDRzDiIgGDYfDgeeee25Az2UYBRe76YgorHV2dqKhoQEmkwnt7e293WoxMTEYPnw4UlNTkZqaCqVSic2bN7td4/Tp09i4caOkm45hFFwMIyIKK+3t7TAajfjiiy9w5swZXLhwweUkVmdRUVHQaDS4cOGCy2ONjY1Qq9U4ceIE9u7di7y8PHR3d/t8sit5hmFERCHP4XCgtrYWH3zwAYxGIywWi0evv3fvntsgmj59eu89mHq67hYtWoTPPvuMLdlBxq1NRCGtpqYGqamp0Ol02Lt3r8dB9DBnzpxBamoqampqeudGjRqFNWvW+O09aGAiOoz+7//+D//6r/+KzMxM/OIXv0B0dDQSEhKwdOlS/Od//qfo8ojoIb777jusWLECGRkZOH/+fL/PV6vV0Gq1yMjIQEZGBrRaLdRqdb+vO3/+PDIyMvDKK6/g+++/90fp5IWIPkxXWFiIgoICqNVqZGZmYuzYsTCbzfjss8/w2Wef4eOPP8by5ctFl0lEP+NwOLBnzx689dZbaG9vd/ucqKgoLFy4EC+88AKmT5+OadOm9XkLC4PBgNLS0n7f95NPPsHBgwexc+dOrFu3zqe/gTwX0WH01FNP4auvvsLcuXMl83V1dZg3bx7Wr1+PRYsWuVw7iojEsNls+PWvf43i4mK3j0+ZMgVvvPEGVq5ciYSEhH7Xu3PnjtsgysvLw1//+leX35Ha29thMBhw7tw5/PGPf4RCEdFfkSElog/TLVmyxCWIAODZZ5/Fc889h9u3b+Ps2bMCKiMiZ11dXcjOznYbRKNGjUJpaSlMJhO2bt06oCACgEcffdRlTqvVIj8/HyaTCSUlJRg5cqTLc4qKipCdnS25PBAFVkSH0cMMGTIEAPgvH6IQ0N3djWXLlqGqqsrlsdWrV+PChQtYu3atRx1uX331ldsrZPc0K8jlcqxbtw4XL17E6tWrXZ5XVVWFZcuWobu724O/hLw1KMPo22+/RU1NDR599FFMmzZNdDlEg94777yDAwcOSOaio6Px8ccfo6KiwuXW3f3p60oL5eXlvf8Q7aFSqVBRUYG//OUvLrfCOHDgAN59912P3pu8M+h2C7q7u7Fq1SpYrVYUFBQgKipKdEkecTgcfm1tJfKGP/cWqqurUVBQIJkbOnQoPv/8c+h0Oq/W7OtKC2+88Uafr3n11Vcxfvx4vPTSS7h7927vfEFBAebNm4f58+d7VQsNzKAKI7vdjtdffx21tbXIycnBqlWrRJfkMYvFgmHDhokug8gvrl+/7vL/4ZAhQ3D48GHMmTPHqzXv3LmDwsJCl/nGxsZ+X6vT6XD48GE8//zzvYHrcDiwatUqnDlzxuM9NBq4QXOYzm6341e/+hU+/vhjrFy5EiUlJaJLIhr0DAYDWltbJXM7duzwOoiAvpsWBnLOEQDMmTPHZU/t2rVrWL9+vdc1Uf8GxZ6R3W7HmjVr8Oc//xmvvPIKKioqwvZSH3Fxcfjpp59El0GD3JYtW1BWVubTGiaTyaVh4cUXX+zzENtA9Ne0MFCbN29GdXU1Dh061Du3f/9+NDQ0ICUlxev6qG8RH0Y/D6Lly5fjww8/DLvfiX5OJpNh6NChosugQc65CcAb7733nmT8yCOPoKKiAjKZzKv1PGla6I9cLkdFRQWmTJmC27dvS2ouLy/3qj56uPDcPRignkNzf/7zn6HX6/HRRx+FdRARRYpr167ho48+ksxt2LABY8eO9XpNb5oWHkalUmHDhg2SuQ8//BDXrl3zaj16uIjeM/rnf/5n7N27F8OGDcPjjz+Of/mXf3F5zqJFizBjxozgF0c0iJWWlkpOKI2OjsamTZu8Xs+XpoWH2bRpE3bu3Nlba1dXF0pLS/Hb3/7Wp3XJVUSHUXNzMwDgp59+wu9+9zu3z0lKSmIYEQXZl19+KRmvWrUK48aN83o9X5sW+pKQkICVK1fi/fff7507duwYwygAIvowXUVFBRwOx0P/e/3110WXSTSo2Gw21NfXS+YWLVrk9Xr+alroi3Nt9fX1sNlsflmbHojoMCKi0HPu3DmXE7fT09O9WsufTQt9ca7t7t27MJlMflmbHmAYEVFQnTp1SjJWq9VeNy74u2nBHZVK1Xs32B7OfwP5jmFEREH17bffSsZpaWlerROopgV3nGt0/hvIdwwjIgqqjo4OyXjEiBFerROopgV3nGt0/hvIdxHdTUdEoefNN9/EihUr0NHRgY6ODowfP97jNQLdtOAsNzcXy5YtQ2xsLGJjY/HYY48F5H0GM4YREQVVYmIiEhMTvX59MJoWnM2YMYOngAQYD9MRUVgJRtMCBR/DiIjCRjCbFii4GEZEFDaC2bRAwcUwIqKwEOymBQouhhER+cxutwd0fRFNC/4S6G0TKRhGROQxpVIpGf/8CtyBEM5NC1arVTKOiYkRVEloYxgRkcecv1CdrzXnT+HetOC8bRhG7jGMiMhjY8aMkYyvXLkSsPcK96aFq1evSsajR48WVEloYxgRkceSk5Ml40DtpTQ0NIR904LZbJaMNRqNoEpCG8OIiDzm/IXa2tqKtrY2v76Hw+Fwe/fXcGha6NHW1obr169L5hhG7jGMiMhjkydPhkwmk8w57wH4qqurCykpKZDLH3xNPfPMM2HRtNDDeZvI5XJMmjRJUDWhjWFERB5TKpWYOHGiZM7fh86USiWKiopQX1+P2bNnIz4+Hp9++qlf3yPQqqurJeOJEye6dCLSfQwjIvJKVlaWZGw0GgPyPmlpaThx4gROnjyJhISEgLxHoDhvE+dtRg8wjIjIK3q9XjL+5ptvcOnSpYC8l1wuR0pKSkDWDpSmpiacPn1aMue8zegBhhEReWXu3Lkutwt3dz7QYFVUVCQZq1QqaLVaQdWEPoYREXlFoVBg6dKlkrnCwkKcO3dOUEWh4+zZsy7BvGTJEigUvIVcX2QOh8MhuggiCk9NTU1ITU2VXPJGq9Xi2LFjki64wcRut0On06Gurq53TqlUwmQyhc2JuiIMzk8LEfmFWq3Gtm3bJHO1tbUwGAyD8gKhdrsdBoNBEkQAkJeXxyDqB/eMiMgnFosFKSkpaGlpkczn5OSgpKRk0Owh9QRRWVmZZD4pKQkNDQ2IjY0VVFl4GByfEiIKmLi4OOzZs8fl95CysjLodDqcPXtWUGXBc/bsWeh0OpcgUigUKC0tZRANAMOIiHyWmZmJyspKl0Cqq6tDWloatmzZgqamJkHVBU5TUxO2bNmCtLQ0l0NzCoUClZWVyMzMFFRdeOFhOiLym6qqKmRnZ8Nms7l9fObMmdDr9cjIyIBGo0F8fHyQK/RNW1sbzGYzqqurYTQaXc4j6tETRIsXLw5yheGLYUREfnX06FGsW7cOzc3N/T5XpVJBo9EgMTERcXFxUCqVIfMbk91uh9VqhcViwdWrV2E2m10ueupOUlISSktLuUfkIYYREfldR0cH8vPzUVBQ4HKn00ilVCqRl5eH7du38zciLzCMiChgmpqasGvXLuzbtw83btwQXU5AqFQqLFmyBFu3bmX7tg8YRkQUcDabDbW1tTAajThy5Aiam5sRrl89MpkMSUlJyMrKgl6vh1ar5ZUV/IBhRERBZ7VacfnyZZjNZpjNZty6dQudnZ1u7+oqUkxMDGJiYjB69GhoNBpoNBpMmjSJt4EIAIYREREJFxptK0RENKgxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCacQXQARDT5WqxWXLl2C2WxGY2Mjbt68ic7OTlitVtGlSSiVSsTExGDMmDFITk6GRqPB5MmToVQqRZcWcRhGRBRwNpsNx48fh9FoxJEjR9DS0gKHwyG6LK/IZDJMnDgRWVlZ0Ov1mDt3LhQKfpX6SuYI108EEYW8xsZG7N69G/v27cONGzdElxMQY8eOxdKlS7F161ao1WrR5YQthhER+Z3FYkF+fj4KCgrQ1dUlupygUCqV2LZtG7Zv3464uDjR5YQdhhER+dXRo0exdu1atLS09PvccePGITk5GRMmTEBcXByio6Mhl4dGX5XdbkdXVxcsFguuXLmCxsZGtLa29vu6pKQklJaWIjMzMwhVRg6GERH5TVVVFbKzs2Gz2dw+PmvWLOj1esyfPx8ajQbx8fFBrtA3bW1tMJvNqKmpQWVlJU6fPu32eQqFApWVlVi8eHGQKwxfDCMi8ou+gigqKgq5ubnIzc3F5MmTBVUXGE1NTSgqKkJhYSHu3bsneYyB5BmGERH57OjRo1i4cKFLEGm1WhQXF2Pq1KmCKvOfuro6PPvss24fO3fuHDZu3Ija2lrJvEKhwMGDB3nIbgAYRkTkE4vFgpSUFJffiHJyclBSUhIyvwF5y2634+2338atW7dQVlb20OcZDAaX5yQlJaGhoQGxsbGBLjWshfenhIiEy8/Pj9gg6ujowPLly1FQUIDZs2c/9LlyuRwlJSXIycmRzDc3NyM/Pz+QZUYE7hkRkdcaGxsxdepUyZUTtFotjh07FvZB1Nraipdffhlff/01AKChoQFPPvlkv6+z2+3Q6XSoq6vrnVMqlTCZTDwP6SHC+9NCRELt3r1bEkRRUVEoLi4O+yAymUxIT0/vDaKRI0fiiSeeGNBr5XI5iouLERUV1TtntVqxa9eugNQaKcL7E0NEwthsNuzbt08yl5ubG/bNCjU1NXj66aclhx7T09M9Cthp06YhNzdXMrd///4+W96JYUREXjp+/LjLJX6cv4DDTXl5ORYsWIC2tjbJfH+/F7mzadMmyfj69esu3Xb0AMOIiLxiNBol41mzZoXteUR2ux15eXnIyclxu/fiTRip1WrMnDlTMue8zegBhhEReeXIkSOSsV6vF1SJbzo6OpCdnY0dO3a4fVwmkyE9Pd2rtZ23ifM2owcYRkTkMavV6tLOPX/+fEHVeK+1tRU6nc7lt6+fS0lJwYgRI7xaPyMjQzJuaWkJuXs2hQqGERF57NKlSy73I3r88ccFVeMd5465vnhziK6HRqORjO12Oy5fvuz1epGMYUREHjObzZLxuHHjMHz4cEHVeK66utqlYw4ARowY4dI150sYxcfHQ6VSSeactx3dxzAiIo81NjZKxsnJyYIq8VxZWZnbjrmkpCRUVlbCbrdL5n0JI8B174hh5B7DiIg8dvPmTcl4woQJgioZuJ6OubVr17pcYTs9PR2nTp3Cjz/+KJn35GTXviQmJkrGt27d8mm9SMUbtxORxzo7OyXjUL+zqcViwWuvvea2UUGv12Pv3r2IjY3FyZMnJY95erKrO87bxnnb0X0MIyLymHNHWHR0tKBK+vfDDz9gwYIFfTYqJCQk9F5R2zmMfD1EB9y/Lt3PMYzc42E6IvJZKF+LbuTIkTAYDBg7dqzbxwsLCyGTyVBdXe1y51Z/hFEob5tQwq1ERBFNLpdjzZo1uHjxIjZu3NhnOGRmZqKrq6t37MvJruQ5hhERDQqjRo1CUVER6uvrB/R8X052Jc8xjIhoUHHumOuLPw7R0cAxjIho0HA4HHjuuecG9FyGUXCxm46IwlpnZycaGhpgMpnQ3t7e260WExOD4cOHIzU1FampqVAqldi8ebPbNU6fPo2NGzdKuukYRsHFMCKisNLe3g6j0YgvvvgCZ86cwYULF1xOYnUWFRUFjUaDCxcuuDzW2NgItVqNEydOYO/evcjLy0N3d7fPJ7uSZxhGRBTyHA4Hamtr8cEHH8BoNMJisXj0+nv37rkNounTp/feg6mn627RokX47LPP2JIdZNzaRBTSampqkJqaCp1Oh71793ocRA9z5swZpKamoqampndu1KhRWLNmjd/egwYmosOos7MTv/nNb6DVajF+/HjExMQgISEBzzzzDD744AN0d3eLLpGI+vDdd99hxYoVyMjIwPnz5/t9vlqthlarRUZGBjIyMqDVaqFWq/t93fnz55GRkYFXXnkF33//vT9KJy9E9GG6n376CX/605/w1FNPYeHChRg7dixu376NQ4cO4Ve/+hU++eQTHDp0iLvjRCHE4XBgz549eOutt9De3u72OVFRUVi4cCFeeOEFTJ8+HdOmTevzFhYGgwGlpaX9vu8nn3yCgwcPYufOnVi3bp1PfwN5LqLD6JFHHsGPP/7oct0sm82GjIwMHD16FIcOHcLChQsFVUhEP2ez2fDrX/8axcXFbh+fMmUK3njjDaxcuRIJCQn9rnfnzh23QZSXl4e//vWvLr8jtbe3w2Aw4Ny5c/jjH/8IhSKivyJDSkTvEsjlcrcXcFQoFFi8eDEA1/uyEJEYXV1dyM7OdhtEo0aNQmlpKUwmE7Zu3TqgIAKARx991GVOq9UiPz8fJpMJJSUlGDlypMtzioqKkJ2dLbk8EAVWRIdRX+x2Ow4fPgwAmDp1quBqiKi7uxvLli1DVVWVy2OrV6/GhQsXsHbtWo8OqX/11Vdur5Dd06wgl8uxbt06XLx4EatXr3Z5XlVVFZYtW8bfloNkUOyDdnV14fe//z0cDgdu3bqFL774AhcuXMCaNWswb9480eURDXrvvPMODhw4IJmLjo5GRUUFXnnlFY/X6+tKC+Xl5RgyZIhkTqVSoaKiApmZmVizZo1kb+jAgQN499138Yc//MHjGsgzgyaM/umf/ql3LJPJsHXr1rD8gDkcDr+2thJ5w597C9XV1SgoKJDMDR06FJ9//jl0Op1Xa/Z1pYU33nijz9e8+uqrGD9+PF566SXcvXu3d76goADz5s3D/PnzvaqFBmZQhNGwYcPgcDhgt9vx3Xff4cCBA3j77bdx8uRJ/Md//Afi4+NFlzhgFosFw4YNE10GkV9cv34dq1atkswNGTIEhw8fxpw5c7xa886dOygsLHSZH8jvwzqdDocPH8bzzz/fG7gOhwOrVq3CmTNnoFKpvKqJ+jeofjOSy+VITEzE+vXrsWfPHvztb3/D7373O9FlEQ1aBoMBra2tkrkdO3Z4HURA300LAznnCADmzJnjsqd27do1rF+/3uuaqH+DYs/InczMTAD3f+QMJ3Fxcfjpp59El0GD3JYtW1BWVubTGiaTyaVh4cUXX+zzENtA9Ne0MFCbN29GdXU1Dh061Du3f/9+NDQ0ICUlxev6qG+DNoy+++47AHD5MTPUyWQyDB06VHQZNMj54/+b9957TzJ+5JFHUFFRAZlM5tV6njQt9Ecul6OiogJTpkzB7du3JTWXl5d7VR89XEQfpmtoaHD7Y7/FYsFvfvMbAPf/JUZEwXXt2jV89NFHkrkNGzZg7NixXq/pTdPCw6hUKmzYsEEy9+GHH+LatWterUcPF9FhVFlZiYSEBLz44ovYsGEDtm/fjlWrVuEXv/gFDh8+jGeffRZbtmwRXSbRoFNaWippoY6OjsamTZu8Xs+XpoWH2bRpk+TE+a6urgFdWog8F9Fh9NJLL2HFihX49ttv8W//9m/YvXs3Dh06hL/7u79DaWkpvvzyS8TGxoouk2jQ+fLLLyXjVatWYdy4cV6v52vTQl8SEhKwcuVKydyxY8d8WpPci+jfjH75y1/il7/8pegyiOhnbDYb6uvrJXOLFi3yej1/NS30ZdGiRXj//fd7x/X19bDZbLxunZ9F9J4REYWec+fOufyWm56e7tVa/mxa6ItzbXfv3oXJZPLL2vQAw4iIgurUqVOSsVqt9rpxwd9NC+6oVKreu8H2cP4byHcMIyIKqm+//VYyTktL82qdQDUtuONco/PfQL5jGBFRUHV0dEjGI0aM8GqdQDUtuONco/PfQL7jL3BEFFRvvvkmVqxYgY6ODnR0dGD8+PEerxHopgVnubm5WLZsGWJjYxEbG4vHHnssIO8zmDGMiCioEhMTkZiY6PXrg9G04GzGjBmYMWNGQNam+3iYjojCSjCaFij4GEZEFDaC2bRAwcUwIqKwEcymBQouhhERhYVgNy1QcDGMiMhndrs9oOuLaFrwl0Bvm0jBMCIijymVSsn451fgDoRwblqwWq2ScUxMjKBKQhvDiIg85vyF6u6+Yf4S7k0LztuGYeQew4iIPDZmzBjJ+MqVKwF7r3BvWrh69apkPHr0aEGVhDaGERF5LDk5WTIO1F5KQ0ND2DctmM1myVij0QiqJLQxjIjIY85fqK2trWhra/PrezgcDrd3fw2HpoUebW1tuH79umSOYeQew4iIPDZ58mTIZDLJnPMegK+6urqQkpICufzB19QzzzwTFk0LPZy3iVwux6RJkwRVE9oYRkTkMaVSiYkTJ0rm/H3oTKlUoqioCPX19Zg9ezbi4+Px6aef+vU9Aq26uloynjhxoksnIt3HMCIir2RlZUnGRqMxIO+TlpaGEydO4OTJk0hISAjIewSK8zZx3mb0AMOIiLyi1+sl42+++QaXLl0KyHvJ5XKkpKQEZO1AaWpqwunTpyVzztuMHmAYEZFX5s6d63K7cHfnAw1WRUVFkrFKpYJWqxVUTehjGBGRVxQKBZYuXSqZKywsxLlz5wRVFDrOnj3rEsxLliyBQsFbyPVF5nA4HKKLIKLw1NTUhNTUVMklb7RaLY4dOybpghtM7HY7dDod6urqeueUSiVMJlPYnKgrwuD8tBCRX6jVamzbtk0yV1tbC4PBMCgvEGq322EwGCRBBAB5eXkMon5wz4iIfGKxWJCSkoKWlhbJfE5ODkpKSgbNHlJPEJWVlUnmk5KS0NDQgNjYWEGVhYfB8SkhooCJi4vDnj17XH4PKSsrg06nw9mzZwVVFjxnz56FTqdzCSKFQoHS0lIG0QAwjIjIZ5mZmaisrHQJpLq6OqSlpWHLli1oamoSVF3gNDU1YcuWLUhLS3M5NKdQKFBZWYnMzExB1YUXHqYjIr+pqqpCdnY2bDab28dnzpwJvV6PjIwMaDQaxMfHB7lC37S1tcFsNqO6uhpGo9HlPKIePUG0ePHiIFcYvhhGRORXR48exbp169Dc3Nzvc1UqFTQaDRITExEXFwelUhkyvzHZ7XZYrVZYLBZcvXoVZrPZ5aKn7iQlJaG0tJR7RB5iGBGR33V0dCA/Px8FBQUudzqNVEqlEnl5edi+fTt/I/ICw4iIAqapqQm7du3Cvn37cOPGDdHlBIRKpcKSJUuwdetWtm/7gGFERAFns9lQW1sLo9GII0eOoLm5GeH61SOTyZCUlISsrCzo9XpotVpeWcEPGEZEFHRWqxWXL1+G2WyG2WzGrVu30NnZ6fauriLFxMQgJiYGo0ePhkajgUajwaRJk3gbiABgGBERkXCh0bZCRESDGsOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERML9P9fZfn0shQLUAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "@pl.qnode(dev)\n", "def oracle_circuit(key):\n", " # Hint: use pl.QubitUnitary\n", " return pl.probs(wires=range(n_bits))\n", "\n", "pl.draw_mpl(oracle_circuit)([0,1,1,0]);\n", "print(oracle_circuit([0,1,1,0]))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 3: Pair programming" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 0.]\n" ] }, { "data": { "image/png": "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Wrhwoe6++27T0wOGvT//+c/aunWrZWzEiBHauHGjHn744bD319eVFjZs2KArrrjCMpaZmamNGzequLhYCxcutBwNbd26VX/5y1/08ssvhz0HhGfYxOiFF17o3bbZbFq5cmVS/oL5/f6YLm0FIhHLo4XGxkZVVVVZxkaOHKn33ntPhYWFEe2zrystPPnkk33+zCOPPKIJEybo/vvv148//tg7XlVVpbvvvlszZ86MaC4YmGERoyuvvFJ+v18+n08nT57U1q1b9fzzz2vv3r364IMPlJGRYXqKA+bxeHTllVeangYQE6dPn9aCBQssY1dccYW2bdumGTNmRLTP77//XmvWrAkaH8j54cLCQm3btk2///3ve4Pr9/u1YMECHTx4UJmZmRHNCf0bVueM7Ha7srOz9dRTT2n9+vX697//rRdffNH0tIBhq6ysTO3t7ZaxV155JeIQSX0vWhjId44kacaMGUFHaqdOndJTTz0V8ZzQv2FxZBRKcXGxpAsnOZNJenq6fvjhB9PTwDC3YsUK1dbWRrWPpqamoAUL9913X58fsQ1Ef4sWBurpp59WY2OjGhoaesfefvttNTc3Ky8vL+L5oW/DNkYnT56UpKCTmYOdzWbTyJEjTU8Dw1ws/rt5/fXXLdtXX321Nm7cKJvNFtH+wlm00B+73a6NGzfqxhtv1HfffWeZ84YNGyKaHy5vSH9M19zcHPJkv8fj0TPPPCPpwv+JAUisU6dO6c0337SMLV26VOPGjYt4n5EsWriczMxMLV261DL2j3/8Q6dOnYpof7i8IR2juro6ZWVl6b777tPSpUu1atUqLViwQL/61a+0bds23XnnnVqxYoXpaQLDTk1NjWUJ9YgRI7R8+fKI9xfNooXLWb58ueWL8z09PQO6tBDCN6RjdP/992v+/Pn66quv9M9//lOrV69WQ0ODfvOb36impkYfffSR0tLSTE8TGHY++ugjy/aCBQs0fvz4iPcX7aKFvmRlZenRRx+1jO3atSuqfSK0IX3O6LbbbtNtt91mehoAfsbr9Wr//v2WsTlz5kS8v1gtWujLnDlz9Pe//713e//+/fJ6vVy3LsaG9JERgMHn8OHDQedyCwoKItpXLBct9CVwbj/++KOamppism9cQowAJNS+ffss27m5uREvXIj1ooVQMjMze+8Ge1HgvwHRI0YAEuqrr76ybE+b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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_bits = 4 \n", "dev = pl.device(\"default.qubit\", wires=n_bits)\n", "@pl.qnode(dev)\n", "def pair_circuit(probe, key):\n", " \"\"\"Test whether probe (list[int]) contains a solution to key (list[int])\"\"\"\n", " return pl.probs(wires=n_bits-1)\n", "\n", "pl.drawer.use_style(\"black_white\")\n", "pl.draw_mpl(pair_circuit)([1,0,0,1],[0,1,1,1]);\n", "print(pair_circuit([0,1,1,1],[0,1,1,1]))\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "For 4 bits, it takes 8.0 pair tests on average.\n" ] } ], "source": [ "secretkey = [0,1,0,1] \n", " \n", "def pair_lock_picker(trials):\n", " keystrings = [np.binary_repr(n, n_bits-1) for n in range(2**(n_bits-1))]\n", " keys = [[int(s) for s in keystring] for keystring in keystrings] \n", "\n", " testnumbers = []\n", "\n", " for trial in range(trials):\n", " counter = 0\n", " for key in keys:\n", " counter += 1\n", " if np.isclose(pair_circuit(key, secretkey)[1], 1):\n", " break\n", " testnumbers.append(counter)\n", " return sum(testnumbers)/trials\n", "\n", "trials = 500\n", "output = pair_lock_picker(trials)\n", "\n", "print(f\"For {n_bits} bits, it takes\", output, \"pair tests on average.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 4: Deutsch-Jozsa" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", "constant\n" ] }, { "data": { "image/png": "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njwpeczTk13dcd42ztuO7mMYEZHHnDvCoqOjBVXSvx9++AELFizos1EhISGh94razmHk6yE64P516X6OYeQeD9MRkc9C+Vp0I0eOhMFgwNixY90+XlhYCJlMhurqapc7t/ojjEJ524QSbiUiimhyuRxr1qzBxYsXsXHjxj7DITMzE11dXb1jX052Jc8xjIhoUBg1ahSKiopQX18/oOf7crIreY5hRESDinPHXF/8cYiOBo5hRESDhsPhwHPPPTeg5zKMgovddEQU1jo7O9HQ0ACTyYT29vbebrWYmBgMHz4cqampSE1NhVKpxObNm92ucfr0aWzcuFHSTccwCi6GERGFlfb2dhiNRnzxxRc4c+YMLly44HISq7OoqChoNBpcuHDB5bHGxkao1WqcOHECe/fuRV5eHrq7u30+2ZU8wzAiopDncDhQW1uLDz74AEajERaLxaPX37t3z20QTZ8+vfceTD1dd4sWLcJnn33Gluwg49YmopBWU1OD1NRU6HQ67N271+MgepgzZ84gNTUVNTU1vXOjRo3CmjVr/PYeNDCDIoz+67/+Cy+++CJGjhyJoUOH4u///u9RWVkpuiwieojvvvsOK1asQEZGBs6fP9/v89VqNbRaLTIyMpCRkQGtVgu1Wt3v686fP4+MjAy88sor+P777/1ROnkh4g/THTt2DFlZWYiJicGKFSswfPhw7Nu3D8uXL8eVK1fw5ptvii6RiH7G4XBgz549eOutt9De3u72OVFRUVi4cCFeeOEFTJ8+HdOmTevzFhYGgwGlpaX9vu8nn3yCgwcPYufOnVi3bp1PfwN5wRHBuru7HWq12qFUKh3//d//3Tt/584dx+OPP+6Ijo52NDc3iyuQKExt2LDBAaD3vw0bNvhl3e7ubsfGjRsla//8vylTpjh27tzp+P777we03u3bt92uk5eX55gyZUqf77Np0yZHd3e3X/6mQG2rSBPRh+m+/PJLNDU14dVXX8WMGTN650eMGIG3334bXV1d2Lt3r7gCiahXV1cXsrOzUVxc7PLYqFGjUFpaCpPJhK1btyIhIWFAaz766KMuc1qtFvn5+TCZTCgpKcHIkSNdnlNUVITs7GzJ5YEosCI6jL766isA96855SwrKwsAcPz48WCWRERudHd3Y9myZaiqqnJ5bPXq1bhw4QLWrl3rUYfbV1995fYK2T3NCnK5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2WyG2WzGrVu30NnZ6fauriLFxMQgJiYGo0ePhkajgUajwaRJk3gbiABgGBERkXCh0bZCRESDGsOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERMIxjIiISDiGERERCccwIiIi4RhGREQkHMOIiIiEYxgREZFwDCMiIhKOYURERML9P9fZfn0shQLUAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "n_bits = 4\n", "dev = pl.device(\"default.qubit\", wires=n_bits)\n", "\n", "def oracle_matrix(keys):\n", " \"\"\"Create the unitary matrix corresponding to the binary key (list[int])\n", " e.g. key=[0,1,1] should give the diagonal matrix [1,1,1,-1,1,1,1,1]\"\"\"\n", " # Hint: use np.ravel_multi_index \n", " matrix = np.identity(2 ** n_bits)\n", " return matrix\n", "\n", "@pl.qnode(dev)\n", "def deutschjozsa(keys):\n", " \"\"\"Build the Deutsch-Jozsa circuit\"\"\"\n", " return pl.probs(wires=range(n_bits))\n", "\n", "keys = ([[0,0,0,0],[0,0,0,1],[1,0,0,0],[0,1,0,0],[1,1,0,0],[0,0,1,0],[0,0,1,1],[0,1,1,0]])\n", "pl.draw_mpl(deutschjozsa)(keys)\n", "print(deutschjozsa(keys))\n", "if np.isclose(deutschjozsa(keys)[0],0):\n", " print(\"balanced\")\n", "else:\n", " print(\"constant\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Exercise 5: Bernstein-Vazirani" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The value of a is [0 0 0]\n" ] }, { "data": { "image/png": "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Vpag6sILT9MRkd/U1NQgJycHdrvd4+tz586FwWBAZmYmtFot4uPjg1yhbzo6OmCxWFBbWwuTyeR2HVGfviBavnx5kCsMXwwjIvKr48ePY+PGjWhtbR1024SEBGi1WiQlJSEuLg5qtTpkvmNyOByw2WywWq24fv06LBaL201PPUlOTkZZWRmPiLzEMCIiv+vq6kJBQQEKCwvdnnQaqdRqNfLz87Fz505+RyQDw4iIAqalpQV79uzBgQMHcOvWLdHlBERCQgJWrFiB7du3s33bBwwjIgo4u92O+vp6mEwmHDt2DK2trQjXPz0KhQLJycnIzs6GwWCATqfjnRX8gGFEREFns9lw9epVWCwWWCwW3LlzB93d3R6f6ipSTEwMYmJiMG7cOGi1Wmi1WkydOpWPgQgAhhEREQkXGm0rREQ0rDGMiIhIOIYREREJxzAiIiLhGEZERCQcw4iIiIRjGBERkXAMIyIiEo5hREREwjGMiIhIOIYREREJxzAiIiLhGEZERCQcw4iIiIRjGBERkXAMIyIiEo5hREREwjGMiIhIOIYREREJxzAiIiLhGEZERCQcw4iIiIRjGBERkXAMIyIiEo5hREREwjGMiIhIOIYREREJxzAiIiLhGEZERCQcw4iIiIRjGBERkXAMIyIiEo5hREREwjGMiIhIOIYREREJxzAiIiLhGEZERCQcw4iIiIRjGBERkXAMIyIiEo5hREREwjGMiIhIOIYREREJxzAiIiLhGEZERCQcw4iIiIRjGBERkXAMIyIiEo5hREREwjGMiIhIOIYREREJxzAiIiLhGEZERCQcw4iIiIRjGBERkXAMIyIiEo5hREREwjGMiIhIOIYREREJxzAiIiLhGEZERCQcw4iIiIRjGBERkXAMIyIiEo5hREREwjGMiIhIOIYREREJxzAiIiLhGEZERCTc/wMT8YioVauQqwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dev = pl.device(\"default.qubit\", wires = 4, shots = 1)\n", "\n", "def oracle():\n", " \"\"\"Encode the hidden value in a circuit\"\"\"\n", " pl.CNOT(wires=[1, 3])\n", " pl.CNOT(wires=[2 ,3])\n", " \n", "@pl.qnode(dev)\n", "def bernsteinvazirani():\n", " \"\"\"Sample the Bernstein-Vazirani circuit to return the hidden value\"\"\"\n", " return pl.sample(wires = range(3))\n", "\n", "pl.drawer.use_style(\"black_white\")\n", "pl.draw_mpl(bernsteinvazirani)()\n", "a = bernsteinvazirani()\n", "print(f\"The value of a is {a}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "pennylane", "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.7" } }, "nbformat": 4, "nbformat_minor": 2 }