{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "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": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 400x500 with 1 Axes>"
      ]
     },
     "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",
    "\n",
    "    for i in range(n_bits):\n",
    "        pl.Hadamard(wires=[i])\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": 3,
   "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",
    "\n",
    "    matrix = np.identity(2**len(key))\n",
    "    index = np.ravel_multi_index(key, [2]*len(key)) \n",
    "    matrix[index,index] = -1\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": [
      "[0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625\n",
      " 0.0625 0.0625 0.0625 0.0625 0.0625 0.0625]\n"
     ]
    },
    {
     "data": {
      "image/png": "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hx88j2eyQVKY/SMuisMuAJCOo0ePeu6XlpbScCn428bfdrnA9Ugf1yPo8OHD5r777kuajKiVBq+88oqpV6+eWbt2bSBwqO6uqfm4HnFBgAAn+DON69SpE1pZoq5u3bo1/gbI9eB6ZOvbb7+1UwqpkhGbNm1qgwPxBwjVnV7IV/+IC6YY4KRCPnshim3D9YhW20T5emiaYNiwYaZx48ZJfz516lS714ESFzds2JDzACHKbRM1tBQAIH8fOrVrmwceeMB8/vnnZuTIkSk/sPv06WOOHz+ekw2SkB0CBABA3p1//vlm2rRpZv369Wk9vzobJCE7BAgAgND4VyqkkovpBWSGAAEAEArtjnr99den9VwChPxjFQMAIGe0KmDLli126+Qff/zx9CqBkpISu/tpx44d7U2rCR5++OGkv0PJicpPSFzFQICQfwQIAICsKQjQscnLly83n3zyifnss88CGx/5FRUV2R0N9dxku3TqaOY1a9bY/RC0mdLPP/9c7Q2SkDkCBABAxlMDq1atMi+99JINDrTxUSYUQCQLDq644grTpk0bz2qHfv36mTfffJPliSEoiBwEDVf179/fNG/e3Fx44YXm5ptvttEpkM0phuecc4659dZbUz7nhRdesM+ZNWsWDYzYWbZsmZ0i0LHM+oafaXBQFY1A6HfrbySudlCggPyL/QjChx9+aPr27etZT/uXv/zFLF682CxatKjKN3og2f7xhw4dMkeOHEnZOHqt6TmJrznAdXv27DGPPPKIef3119N6vqYJ9KWscudC7b65e/duU15eXuV/9+mnn5revXubQYMGmeeee85+qUM4Yj2CcOLECfPQQw/ZN+qhQ4fac7937dpl57Q0xKVDQnIZ/QJAHKcTZs6cadq3b58yOFBOwa9//Wvzhz/8wfz1r3+1JzMql2DlypVmyZIl9qb/r8f0XpyO1157zeYd6G8jHLEeQfjggw9stKrs1xdffNHuxCUTJ060GbbvvPOOefvtt82dd94ZdlEBIJJfssaMGWOmT5+e9OcKGh588EFzzz332DMUzuT7779P+oGvL21vvfVWIC9BCZDalnnTpk1mypQpprg41h9ZkRPrEQRFrHLvvfeeDg4q3X///fbfFStWhFI2AIgyjbwOHDgwaXCgvAB90OuL1rhx49IKDiTZdEG3bt1Of2mbMWOGPavBTzsuqixM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+eebadOmmfXr16f1/OpskITsECAAAELjX6mQSi6mF5AZAgQAQCi0++P111+f1nMJEPKPVQwAgJzRqpktW7bYrZN//PHH06toSkpK7O6OHTt2tDetJnj44YeT/g4lJyo/IXEVAwFC/hEgAACypiBAR00vX77cfPLJJ+azzz4LbHzkV1RUZHc01HOT7Qqpo5nXrFlj90PQZko///xztTdIQuYIEAAAGU8NrFq1yrz00ks2ONDGR5lQAJEsOLjiiitMmzZtPKsd+vXrZ958802WJ4Yg9jkI33zzjXn55ZfN7bffbho2bGjOOeccs2zZsrCLBYdPzdNr6NZbb035nBdeeME+Z9asWXktG5APev/UFIGOZdY3/EyDg6poBEK/O/E9WqsdFCgg/2I/gvCLX/zCfP31157HTpw4EVp54DbtH3/o0CFz5MiRlM/R2m09J3ENN+C6PXv2mEceecS8/vrraT1f0wTNmzc/vXOhdnvcvXu3KS8vr/K/+/TTT03v3r3NoEGDzHPPPWcuvPDCnJQfmYt9gKDduvr27Wu/8b399ts24gUApD+doNGwf/qnf7L5BqlyCm6++Wbzq1/9yk4TXH755SmPm9YuijNnzjzj333ttdfMu+++a37/+9+boUOHcrlCEPsA4e9///vp/79ixYpQywIALtFo65gxY8z06dOT/rx9+/bmwQcfNPfcc489Q+FMvv/++6TBgRIR33rrrUBeggISBRSbNm0yU6ZMMcXFsf/IipTY5yAAADKnKbKBAwcmDQ6UF6APei1lHDduXFrBgSSbLujWrZuZOHGi/V0zZsywZzX4acdFlYVpu/wiQAAAeGhZ4R133GEWLVoUaJn777/fftMfMmRIRisLPvzww6Qni1YmJOp3aSpBZzTob/ipLCqTyob8YLwGyILe7LRSIRnewOC6J5980uZs+Y+Q1oqwu+66K2c7Js6ZM8ecddZZnsfKysrs39FhTVq9kDhqoDJNmDDBPP300xmXAZkjQHCMOloulxW5ImofulrHrZUKrrRdrssatevhkqhfDx2zPGnSJM9jZ599tnnnnXfs0sZspNoxUfkLqdx9992mWbNm5pZbbvG0l8p2ww03mF69emVVFqSPAMExCg5SfXNF/uiN0v8NK3EfhCeeeCIyl2P27Nn2hmiI8vXYt2+fuffeez2P6Rv++++/b6699tqsfqcS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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "@pl.qnode(dev)\n",
    "def oracle_circuit(key):\n",
    "    for i in range(n_bits):\n",
    "        pl.Hadamard(wires=[i])\n",
    "    pl.QubitUnitary(oracle_matrix(key), wires = list(range(n_bits)))\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: Deutsch-Jozsa"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.     0.25   0.0625 0.0625 0.0625 0.0625 0.     0.     0.25   0.\n",
      " 0.0625 0.0625 0.0625 0.0625 0.     0.    ]\n",
      "balanced\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmwAAAIICAYAAADT8LJpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjExLjIsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvgI3uAAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAS3dJREFUeJzt3QtwlFWa+P8TEkmICmpIQAm/hBCUAh0Fa2RRuYhcvE6hAqLlpSwnEAOUoKxMlSVTs+4Wl/EyK6Dcxstg7SjRoKurhotIxIJyI1sOF3UTAsplAUEFJUAk9L+e86+k+n3THbo7nfc95+3vp6pnpjs96XPOk/Py9HtuaaFQKKQAAABgrA5+FwAAAACtI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYLgMvwsAeOHUqVOqrq5O1dTUqNraWnX48GF18uRJ/bpJMjMzVVZWluratasqLi5Wffr0UUVFRfr1ICEeZiEeZiEeiISEDYF0+vRptWHDBlVeXq4qKyvVt99+q0KhkLJRWlqaKigoUGPGjFHjx49Xw4YNUxkZdnVd4mEW4mEW4oGYhIAAqampCZWWloZyc3MlOwvkQ+omdaytrQ2ZjniYhXiYhXggHiRsCITjx4+HnnrqqVDHjh19T6i8emRmZuo6S91NQzzMQjzMQjyQiDT5j9juxQFmWr16tZo0aZIe9jybbt266blhPXv2VNnZ2apjx46qQwcz1t6cOXNGNTQ0qPr6erVnzx491+7gwYNn/f8VFhaqJUuWqNGjRysTEA/i0R7oH1yvUl5CaR5giIqKilBGRkbUu1BXX311aO7cuaHq6urQ0aNHQ7aRMkvZpQ4DBw6MWk9pA2kLvxEP4uEl+odZbIuHbUjYYK1oyUF6enpo+vTpoZ07d4aCRuatSd2kjqZdBIkH8fAb/cMsJsfDRiRssFJlZWXEZG3o0KGhrVu3hoJO6ih1jXQRlLbxGvEgHiahf3ivqqrKmnjYioQN1pEJuwUFBS06f0lJSaixsTGUKqSuUmd3OxQWFobq6+s9KwfxIB4mon94186zZs0K/f73v7ciHjYjYYN1ZGVkqidrZ7sIzp4927MyEA/iYSr6R/uSRGvcuHH6mvPXv/7VinjYjIQNVpF9i2Q7C/cwaComa02k7kOGDGmx5YcX+7QRD+JhOvpH+zhw4EDommuuab7m7Nixw/h42M6M/QyAGD377LOO46TS09PVokWLjNmaww9Sd2kDaYsm0kbPPPNMu3828SAepqN/JN/27dvVoEGD1Oeff66fX3DBBeqyyy4zPh7W8ztjBGL166+/tjjBQFYg4f8nbRHeNnl5ebrN2gvxaB3xMAvxSI41a9aEOnfu7LjWjBkzxvh4BEHq3paAdeRs0O+//97x2rRp03wrj2mmTp3qeH7o0CFVVVXVbp9HPIiHTegfbbd8+XJ18803q2PHjjleHzx4sPHxCAISNlhDDnIPd/XVV6uioiLfymOa3r17q4EDB7baZslEPIiHTegfbTtlYtasWaqkpEQfVO+WSMLmdTyCgIQN1qisrHQ8Hz9+vG9lMZW7TdxtlkzEg3jYhv4RvxMnTqgJEyao+fPnR/x5Wlqans9mejyCgIQNVpBJqe6zQkeOHOlbeUw1atQox3Nps/BFGslCPIiHjegf8ZGzjIcPH67efvvtqO/p16+f6tKli9HxCAoSNlihrq5OFsg4Xrv00kt9K4+p+vTp02IoY9euXUn/HOJBPGxE/0h8JWg0iQyHeh2PoCBhgxVqamocz7t166bOP/9838pjqs6dO6u8vLxW2y4ZiAfxsBH9IzZr1qxR1157bYtRDbmT5t5CqS0Jm1fxCAoSNlihtrbW8by4uNi3spjO/a21PS6AxIN42Ir+0bply5ZFXAlaWFioVq5cqe+CJSth8yoeQUHCBiscPnzY8bxnz56+lcV0+fn5judHjhxJ+mcQD+JhK/pH6ytBJ02apBobGx0/k6HRzZs3q6NHjzpej2fDXD/jERQZfhcAiMXJkycdz7Ozs2m4KNxt4267ZCAesSMeZiEeLdXX16sHHngg4uICWcn52muvqU6dOqlNmza1SOTaesqMF/EIChI2WMG9cqhjx46+lcV0mZmZ7X4BJB7Ew1b0D6cffvhBD4FGW1zQvXt3nawJd8LW1uFQr+IRFAyJwkqpfHaoiW1DPMxqG+JhVtuYHA8Z1iwtLVW5ubkRf75gwQK915osRNiyZUvSEzaT28Y0tBQAAClKEqaHHnpIffPNN2rKlClRE6jRo0erhoaGpGyYi8SQsAEAkOIuvPBCtXDhQlVdXR3T+9uyYS4SQ8IGAAA090rQaJIxHIr4kLABAAB9mswNN9wQU0uQsHmPVaIAAASUrLrcsWOHPmrq559/bl6FmZWVpU+L6d+/v37Ias1HH3004u+QxQYyvy18lSgJm/dI2AAACAhJysrLy9W6devUl19+qb7++usWG+G6paen6xMH5L2RTjXp3bu32rhxo96PTTbX/fXXX9u8YS7iR8IGAIDlQ5lVVVXqlVde0cmabIQbD0noIiVrV155pSoqKnKsJh07dqx655132I7DBykxh01u595xxx2qR48e6uKLL1a33nqr/rYAxKuurk6dd9556vbbb4/6nhdeeEG/Z+nSpTQwUgr9w3tr167VQ5rDhw/Xd8DiTdZaI3fo5HfLZ4SvJpXEDd4L/B22Tz75RI0ZM8axf8wHH3ygKisr1apVq1r9hxeIdN7e8ePH1YkTJ6I2jvytyXvC/+aAVED/8M7+/fvVY489pt58882Y3i/DmnLToulkATmtZN++fWrnzp2t/v+++uorNWrUKDVx4kT13HPP6Zse8Eeg77CdPn1a/f73v9f/cE6ePFnt2rVL7dmzR4/Byy1gOeQ2md9GAABo7+HPJUuWqL59+0ZN1mRO2u9+9zv14osvqs8++0wdO3ZMz0XbsGGDWr16tX7I/5bX5N/GWLzxxht63pp8NvwR6DtsH3/8sf72IKtZXnrpJb0zs5g7d65eMfP++++r9957T919991+FxUAgLPehJg+fbpatGhRxJ9LEvfwww+r++67T58BejY//fRTxARMbmq8++67Lea1yYIGOcZq27Zt6vnnn1cZGYFOIYwT6Dts8g1C3H///c3JWpMHH3xQ//f69et9KRsAALGSkaIJEyZETNZkXpkkXnIjYubMmTElayLS8ObQoUObb2osXrxYnzXqJiciSFmY9uGtQCdsNTU1+r+vuOKKiKtfwt8DAICJZBuNcePG6XnXbnLzQe6EyRSfeA5Sl/ndTXuyhWtaYCC/S4ZL5YzRphsc4aQsUiYpG7wR6PuZcrtXdO3atcXPcnJy4jqGA3Bf7GQlaCRcwJDq6B/J9dRTT+npO+E6duyoXn31VXXPPfck7USD5cuXq3POOcfxWl5env4cOfxdVoeG31WTMs2ePVvNmTMn7jIgfoFO2Jq4h0NF0zcRWdVkE+loqbhQwrQkSBatyEpQW9ou2WU1LR42SYV40D+SF481a9aoefPmOV4799xz9Rxs2cojEdFONJD5b9Hce++96pJLLlG33Xab4+9XynbjjTeqkSNHJlQWxC7QCZscuyF+/PHHFj/74Ycf9H937txZ2USStWh3duAduVC6v/GG78P25JNPGhOOZcuW6QfMkArxoH8kx6FDh/Qc7HByB+yjjz5S119/fcIjTwsWLGjxuqwYjSWu8tkjRoxo/pIgNxGkjLJnm9yNQ/sJ9Bw22XdGyIoWt6bXiouLPS8X7CfL5iVxjvSQoQogldE/kkNWZB48eNDx2vz58xNO1lpbaND07+XZyGe77/gdOHBAPfLIIwmXCbEJ9B02+cP685//rPeqkf3Ywv3973/X/z1kyBBlk+zsbPXLL7+oVDNjxozA35VoLyUlJXoJfjIRj8QRD7OYGg9ZpeleZHDLLbdEHc5MxkKDWEkZZKj2ww8/bH6toqJCHzLfr1+/hMuHFE7YZJKkjLnLH+Mf//hHvbeM7BsjmwnKJoCyFFrORbNtPp7MX0g17omwiK/tkv03Qzza1nbEwxymxkNOFQh30UUX6cn/keZkJ3uhwdnIHHApi+z7Fj7lSMosvw/tI9BDollZWXrPGvnj+pd/+Rc9p61Tp07624/4y1/+orp06eJ3MQEAcAwxvv76644WKSsrU7m5uQm3UiILDVoj89WkTOFWrFihy472EeiETcgdNLltO2jQoOZvJgMGDFBvv/22euCBB/wuHgAADrIJbvj2GTIvdurUqQm3UlsWGrRGyhQ+Z1fKzNFV7SfQQ6LhQ6PykC085LawTIgFEiETc+V4ltaOZJFvsjJZuOmQZSBV0D+Sd6xiOFmF2a1bN98WGkQjJyrIMVgvv/xy82tyepBMQULyBf4OWzgZGiVZQ1vIXVpZCSrD7dHIfBB5D/O8kGroH8k5L7S6utrxWlvmWidroUE07rJJ2aUOSL6UStgAADCZbDnl3hxdpvT4vdAgGnfZZFNdWeGK5CNhAwDAEJs3b3Y8l2HLRBcbJHuhQbTFB0VFRa3WAclBwgYAgCG+++47x3NZJGfSQoNI3GV01wHJQcIGAIAhTpw44Xie6NZT7bXQIBJ3Gd11QHKkxCpRAABs8Pjjj6uJEyfqpEcesvm7aQsN3KZNm6bGjRun9zmVR48ePdrlc1IdCRsAAIbIz8/Xj0R5sdDA7aqrrtIPtC+GRAEACAgvFhrAHyRsAAAEgJcLDeA9EjYAAALAy4UG8B4JGwAAlvN6oQG8R8IGK8m5sKBtwN+ADdeO9v5MPxYaJAvX8tiRsMEK7oPUGxoafCuL6U6dOuV43tq5pwgG+odZ/cPreNi80IDrVexI2GAF90XVfdYeorcNCVvw0T/M6h9exsP2hQZcr2JHwgYrdO3a1fF8z549vpXFdHv37nU8z8nJ8a0s8Ab9w6z+4WU8bF9owPUqdiRssEJxcbGV3x79UFNT43jep08f38oCb9A/zOofXsVjx44d1i804HoVOxI2WMF9UT148KA6duyYb+UxlbTJoUOHHK+RsAUf/cOs/uFFPGShwdSpU61caNCE61V8SNhghaKiIpWWltbqNzO0bJMOHTqoXr160TQBR/8wq394EQ9ZyNCvXz9dhybXXXedFQsNmnC9ig8JG6wgq64KCgqsve3vlTVr1jieS5u5V6wheOgfZvUPL+Ihn7Fw4UJVXV2tBg8erDp37qzeeustZROuV/EhYYM1xowZ43heXl7uW1lM5W4Td5shuOgfZvUPr+IxYMAAtXHjRrVp0ybVvXt3ZROuV/EhYYM1xo8f73j+xRdfqLq6Ot/KY5qdO3eqLVu2tNpmCC76h1n9w8t4yLCoDI/ahOtV/EjYYI1hw4ap3Nxcx2uR9h9KVTI8Ei4vL08v70dqoH+Y1T+Ih1nxCAISNlgjIyND3XXXXS0Stm3btqlUt3Xr1hbJ65133qnbDKmB/mFW/yAeZsUjCEjYYJWZM2c6Jgk3NjaqKVOmpPR5dFJ3aQNpiybSRtJWSC30D7P6B/EwKx62I2GDVWT37ieeeMLxWlVVlSotLU3JpE3qLHX/9NNPHa/PmjXLmp3OkTz0D7P6B/EwKx7WCwGWOX78eKigoCAkf77hj5KSklBjY2MoVUhdpc7udigsLAzV19e362eXlZU5PlOew4y2on/43z+Ih7nxsBl32GCd7OxstXTp0hbzHZYtW6aGDx+u50cEndRR6ip1DidtsmTJEtWpUyffygZ/0T/M6h/Ew6x42IyEDVYaPXq0WrlyZYukTW61y75EM2bM0MvGg0bqJHWTOrqHFaQtpE2kbZDa6B9m9Q/iYVY8rOX3LT6gLSoqKkIZGRktbrM3PQYOHBiaM2dOqLq6OnT06FHrGlvKLGWXOkhdotVT2kDawisMidrRVvQPf/oH8TDrehUUafIffieNQFusXr1aTZ48We3evfus75W9fuRg5vz8fD1UIauTws/i83tC7qlTp1R9fb3au3evPmfPfVB1JIWFhXpYwctvqrLK68UXX2x+XlZWphYtWuTZ59vE77aif3jfP1pDPMyKh1X8zhiBZJBJq7Nnzw5lZmZG/VYXtIfUVersx4Rd7rDZ1Vb0D7MQDyTCjFsLQBvJpNU//elPavv27XrZuPtEhCCRu4RSR6mr1JkJuzgb+odZiAcSQcKGQJG9fF566SW1f/9+tW7dOp3Y9OrVS6WlpSlbSdmlDlIXqdO+fft0Hdm3CPGif5iFeCAenAOBQJIVSCNGjNAPIXPDdu3apeeFyePIkSPq5MmT+mGSrKws/cjJydFz7eQhyVr46Q5AW9E/zEI8EAsSNqQESXj69u2rHwDoHybjeoVIGBIFAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADJfhdwEAL5w6dUrV1dWpmpoaVVtbqw4fPqxOnjypXzdJZmamysrKUl27dlXFxcWqT58+qqioSL8OtBf6h1mIByIhYUMgnT59Wm3YsEGVl5eryspK9e2336pQKKRslJaWpgoKCtSYMWPU+PHj1bBhw1RGBl0XiaN/mIV4ICYhIEBqampCpaWlodzcXMnOAvmQukkda2trfWvnsrIyR5nkOcxvK/qHWYgH4sEcNgRCfX29mj17turfv79avHix+v7771VQSd2kjlJXqbPUHWgN/cMsxAOJYFwF1lu9erWaNGmSHvY8m27duum5YT179lTZ2dmqY8eOqkMHM763nDlzRjU0NOiL+Z49e/Rcu4MHD7Y6z+Xpp59WK1asUEuWLFGjR4/2tLywA/3DrP5BPMyKh01I2GC1VatWqQkTJug5IJFcffXVet7XyJEj9QT+zp07K5scO3ZML5RYu3atWrlypdqyZUuL9+zevVvdeuut+ud33HGHL+WEmegfZvUP4mFWPKwT1wAqYJCKiopQRkZGizle6enpoenTp4d27twZChqZtyZ1kzq66y1tIW2SavOyTOdXW9E//OsfxMOs61VQkLDBSpWVlRGTtaFDh4a2bt0aCjqpo9Q10kVQ2qa9kbCZ3Vb0D3/7RyrGo6qqytjrVVCYMXkHiIPM8ZI5a+5h0JKSErV+/Xp1+eWXB749pY5SV6lzOGmTyZMnqxMnTvhWNviL/mFW/wh6PGTu7R/+8Af1t7/9zYp42IyEDdaZO3duiwUGciGQlZOmLCDwgtRV6uy+CMocEWkjpCb6h1n9I8jxkETr7rvvVvPmzVODBw+2Ih5W8/sWHxDvvkWZmZkthhUaGxtTtiGl7kOGDHG0ibRRe+7TxpComW1F/zCjf6RCPA4cOBC65pprmuu1Y8cO4+NhO7vTe6ScZ5991nGcVHp6ulq0aJH131TbQuoubSBt0UTa6JlnnvG1XPAe/cOs/hHUeGzfvl0NGjRIff755/r5BRdcoC677LKY/r9crxJn918NUorMd3j77bcdr02bNs36OSDJcMUVV+i2CFdRURF1uxMED/3DrP4R1HjIFkPXXnutY5hXkrd4klCuV4khYYM15GxQ9wkG7otwKps6darj+aFDh1RVVZVv5YG36B9m9Y8gxmP58uXq5ptv1vtDhjvb/LVIuF7Fj4QN1pCD3N2b4hYVFflWHtP07t1bDRw4sNU2Q3DRP8zqH0GKh6wEnTVrll4wEOmuZCIJG9er+JGwwRqVlZWO53KCAVSrbeJuMwQX/cOs/hGUeMhKUDlNZv78+RF/npaWpodEE8H1Kj4kbLCCTNx1L42X46bgNGrUKMdzabPwSc8IJvqHWf0jKPGQs4yHDx/eYi5euH79+qkuXbok9Pu5XsWHhA1WqKurky1oHK9deumlvpXHVHJeqnsoY9euXb6VB96gf5jVP4IQD/dK0GgSGQ5twvUqPiRssIIcgB6uW7du6vzzz/etPKaSw+3z8vJabTsED/3DrP5hezzWrFnTYiWokDtp7tWgbUnYuF7Fh4QNVqitrXU8Ly4u9q0spnN/ayVhCz76h1n9w+Z4LFu2LOJK0MLCQrVy5Up9VzJZCZvgehU7EjZY4fDhw47nPXv29K0spsvPz3c8P3LkiG9lgTfoH2b1Dxvj0bQSVM49bWxsdPxMhkY3b96sjh496ng9ng1zo+F6FbuMON4L+ObkyZOO59nZ2b6VxXTutnG3HYKH/mFW/7AtHnJA/QMPPBBxcYGs5HzttddUp06d1KZNmxw/i3fD3Ei4XsWOhA1WcK/k6tixo29lMV1mZqbjOQlb8NE/zOofNsXjhx9+0EOg0RYXdO/eXSdrwp2wtXU4VHC9ih1DorCS7WfxtSfaBvwNmNU/TI6HDGuWlpaq3NzciD9fsGCB3mtNFiJs2bIl6QmbyW1jGloKAIAUJQnTQw89pL755hs1ZcqUqAnU6NGjVUNDQ1I2zEViSNgAAEhxF154oVq4cKGqrq6O6f1t2TAXiSFhAwAAmnslaDTJGA5FfEjYAACAPp3hhhtuiKklSNi8xypRAAACSlbB7tixQx819fPPPzevis3KytKnL/Tv318/ZLXmo48+GvF3yGIDmd8WvkqUhM17JGwAAASEJGXl5eVq3bp16ssvv1Rff/11i41w3dLT0/WJA/LeSKc29O7dW23cuFHvxyab6/76669t3jAX8SNhAwDA8qHMqqoq9corr+hkTTbCjYckdJGStSuvvFIVFRU5VpOOHTtWvfPOO2zH4YPAz2H7/vvv1auvvqruuusulZOTo8477zy1du1av4sFS9XV1em/odtvvz3qe1544QX9nqVLl3paNsBv9A/vyb9nMqQ5fPhwfQcs3mStNXKHTn53+L+ZsppUEjd4L/B32H7zm9+oAwcOOF47ffq0b+WB3eS8vePHj6sTJ05EfY/sVSTvCd+zCEgF9A/v7N+/Xz322GPqzTffjOn9MqzZo0eP5pMF5DSGffv2qZ07d7b6//vqq6/UqFGj1MSJE9Vzzz2nLr744qSUH/ELfMImuzePGTNG3xF577339DcQAABsHf6Uu/f//M//rOerRZuTduutt6qbbrpJD2teccUVeoFBJHLKwZIlS876uW+88Yb6r//6L/XnP/9ZTZ48uc31QPwCn7D94x//aP7f69ev97UsAAAkSkaHpk+frhYtWhTx53379lUPP/ywuu+++/QZoGfz008/RUzWZGHBu+++22JemySIkuBt27ZNPf/88yojI/AphFECP4cNAADbyRSLCRMmREzWZF6ZJF6ydcfMmTNjStZEpOHNoUOHqrlz5+rftXjxYn3WqJuciCBlYdqHt0jYAAAwmGyjMW7cOLVq1aoWP3vwwQf1nbBJkybFtXLzk08+ad6TLVzTAgP5XTL0KWeMyme4SVmkTFI2eIP7mUAC5GInK0Ej4QKGVEf/SK6nnnpKz8EO17FjR70Dwj333JO0Ew2WL1+uzjnnHMdreXl5+nPk8HdZHRp+V03KNHv2bDVnzpy4y4D4kbBZRjpaMpdt28K0JEj2LZKVoLa0XbLLalo8bJIK8aB/JC8ea9asUfPmzXO8du6556r3339fb+WRiGgnGsj8t2juvfdedckll6jbbrvN8fcrZbvxxhvVyJEjEyoLYkfCZhlJ1qLd2YF35ELp/sYbvg/bk08+aUw4li1bph8wQyrEg/6RHIcOHVL333+/4zW5A/bRRx+p66+/PqHfKQsNFixYEPFEg1jiKp89YsSI5i8JchNByih7tsndOLQf5rABCZBl85I4R3rIUAWQyugfySErMg8ePOh4bf78+Qkna60tNJB92mIhn+2+4yd7nT7yyCMJlwmx4Q6bZbKzs9Uvv/zidzE8N2PGjMDflWgvJSUlegl+MhGPxBEPs5gaD1ml6V5kcMstt0QdzkzGQoNYSRlkqPbDDz9sfq2iokIfMt+vX7+Ey4fWkbBZJi0tTc9fSDXuibCIr+2S/TdDPNrWdsTDHKbGQ04VCHfRRRfpyf/yb0Ai4llocDayglTKIvu+/fjjj44yy+9D+wj8kOjvf//75qGqprMd77jjjubX5BBbAABMIUOMr7/+uuO1srIyfXJPohJZaNAama8mZQq3YsWKFkdBInkCn7DJ7V9Z0SKPpkmS4a9xrigAwCSyCW749hkyL3bq1KkJ/762LDRojZQpfM6ulDmWY66QmMAnbH/961/1cRrRHnK3DYiVTMyVvxtZUt/aN1l5D+ftIdXQP5Lj448/djyXVZjdunXzbaFBNHKighyDFY4jINtP4OewZWZm6geQDDJ/5Gzbqsh8EOZ4IRXRP9pORn2qq6sdr40dO9b3hQbRSNlefvnl5udSdqkD54wmX+DvsAEAYAs5WN29OfqgQYN8X2gQjbtsMtVIVrgi+UjYAAAwxObNmx3PZdgy0cUGyV5oEG3xQVFRUat1QHKQsAEAYIjvvvvO8XzAgAFGLTSIxF1Gdx2QHCRsAAAY4sSJE47nXbp0MWqhQSTuMrrrgOQI/KIDAABs8fjjj6uJEyfqpEcecuC6aQsN3KZNm6bGjRunOnXqpB89evRol89JdSRsAAAYIj8/Xz8S5cVCA7errrpKP9C+GBIFACAgvFhoAH+QsAEAEABeLjSA90jYAAAIAC8XGsB7JGwAAFjO64UG8B4JG6x05swZv4tgLNoG/A2Y1T/a+zP9WGiQLPytxo6EDVZwnwfb0NDgW1lMd+rUKcfzrKws38oCb9A/zOofXsfD5oUGXK9iR8IGK7gvqu6z9hC9bUjYgo/+YVb/8DIeti804HoVOxI2WKFr166O53v27PGtLKbbu3ev43lOTo5vZYE36B9m9Q8v42H7QgOuV7EjYYMViouLrfz26IeamhrH8z59+vhWFniD/mFW//AqHjt27LB+oQHXq9iRsMEK7ovqwYMH1bFjx3wrj6mkTQ4dOuR4jYQt+OgfZvUPL+IhCw2mTp1q5UKDJlyv4kPCBisUFRWptLS0Vr+ZoWWbdOjQQfXq1YumCTj6h1n9w4t4yEKGfv366To0ue6666xYaNCE61V8SNhgBVl1VVBQYO1tf6+sWbPG8VzazL1iDcFD/zCrf3gRD/mMhQsXqurqajV48GDVuXNn9dZbbymbcL2KDwkbrDFmzBjH8/Lyct/KYip3m7jbDMFF/zCrf3gVjwEDBqiNGzeqTZs2qe7duyubcL2KDwkbrDF+/HjH8y+++ELV1dX5Vh7T7Ny5U23ZsqXVNkNw0T/M6h9exkOGRWV41CZcr+JHwgZrDBs2TOXm5jpei7T/UKqS4ZFweXl5enk/UgP9w6z+QTzMikcQkLDBGhkZGequu+5qkbBt27ZNpbqtW7e2SF7vvPNO3WZIDfQPs/oH8TArHkFAwgarzJw50zFJuLGxUU2ZMiWlz6OTuksbSFs0kTaStkJqoX+Y1T+Ih1nxsB0JG6wiu3c/8cQTjteqqqpUaWlpSiZtUmep+6effup4fdasWdbsdI7koX+Y1T+Ih1nxsF4IsMzx48dDBQUFIfnzDX+UlJSEGhsbQ6lC6ip1drdDYWFhqL6+vl0/u6yszPGZ8hxmtBX9w//+QTzMjYfNuMMG62RnZ6ulS5e2mO+wbNkyNXz4cD0/IuikjlJXqXM4aZMlS5aoTp06+VY2+Iv+YVb/IB5mxcNmJGyw0ujRo9XKlStbJG1yq132JZoxY4ZeNh40Uiepm9TRPawgbSFtIm2D1Eb/MKt/EA+z4mEtv2/xAW1RUVERysjIaHGbvekxcODA0Jw5c0LV1dWho0ePWtfYUmYpu9RB6hKtntIG0hZeYUjUjraif/jTP4iHWderoEiT//A7aQTaYvXq1Wry5Mlq9+7dZ32v7PUjBzPn5+froQpZnRR+Fp/fE3JPnTql6uvr1d69e/U5e+6DqiMpLCzUwwpeflOVVV4vvvhi8/OysjK1aNEizz7fJn63Ff3D+/7RGuJhVjys4nfGCCSDTFqdPXt2KDMzM+q3uqA9pK5SZz8m7HKHza62on+YhXggEWbcWgDaSCat/ulPf1Lbt2/Xy8bdJyIEidwllDpKXaXOTNjF2dA/zEI8kAgSNgSK7OXz0ksvqf3796t169bpxKZXr14qLS1N2UrKLnWQukid9u3bp+vIvkWIF/3DLMQD8eAcCASSrEAaMWKEfgiZG7Zr1y49L0weR44cUSdPntQPk2RlZelHTk6OnmsnD0nWwk93ANqK/mEW4oFYkLAhJUjC07dvX/0AQP8wGdcrRMKQKABrvf322+q8885Tf/zjH6O+R4aS5T3ufaAAwCYkbACs9euvv6rjx4/rIe9oZNhb3hN+2DQA2IaEDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AFbvEN+0vUc0DQ0N+r/POeccz8oFAMlGwgbAWhdddJH+771790Z9T9PPmt4LADYiYQNgrSuvvFKlpaWpdevW6c1x3f7v//5Pbd68WZ177rn6XFYAsBUJGwBr5eTkqJtvvlkdOXJE3XTTTaq6ulqfehAKhdR///d/q7Fjx+rh0nvvvbd5+BQAbMQVDIDVFixYoL744gu1ceNG9dvf/lZ16NBBP06fPq1/XlxcrObMmeN3MQGgTbjDBsBqRUVF+s7a5MmTVY8ePdSZM2f0uaGFhYXqscce00OicicOAGzGHTYA1svPz1eLFy/W/1vurMm8tvT0dL+LBQBJQ8IGIFCYqwYgiBgSBQAAMBwJGwAAgOFI2AAAAAzHHDakBNmbq66uTtXU1Kja2lp1+PBhdfLkSf26STIzM1VWVpbq2rWr3o5CNnuVVZDyOtBe6B9mIR6IhIQNgSQrBTds2KDKy8tVZWWl+vbbb/VmqjaSFY8FBQVqzJgxavz48WrYsGFMrEeb0D/MQjwQkxAQIDU1NaHS0tJQbm6uZGeBfEjdpI61tbW+tXNZWZmjTPIc5rcV/cMsxAPxYA4bAqG+vl7Nnj1b9e/fX+/H9f3336ugkrpJHaWuUmepO9Aa+odZiAcSwZAorLd69Wo1adIkPex5Nt26ddNzw3r27Kmys7NVx44d9TFGJpAd+hsaGvTFfM+ePXqu3cGDB1ud5/L000+rFStWqCVLlqjRo0d7Wl7Ygf5hVv8gHmbFwyYkbLDaqlWr1IQJE5rPjXS7+uqr9byvkSNH6gn8nTt3VjY5duyYXiixdu1atXLlSrVly5YW79m9e7e69dZb9c/vuOMOX8oJM9E/zOofxMOseFgnrgFUwCAVFRWhjIyMFnO80tPTQ9OnTw/t3LkzFDQyb03qJnV011vaQtok1eZlmc6vtqJ/+Nc/iIdZ16ugIGGDlSorKyMma0OHDg1t3bo1FHRSR6lrpIugtE17I2Ezu63oH/72j1SMR1VVlbHXq6AwY/IOEAeZ4yVz1tzDoCUlJWr9+vXq8ssvD3x7Sh2lrlLncNImkydPVidOnPCtbPAX/cOs/hH0eMjc2z/84Q/qb3/7mxXxsBkJG6wzd+7cFgsM5EIgKydNWUDgBamr1Nl9EZQ5ItJGSE30D7P6R5DjIYnW3XffrebNm6cGDx5sRTys5vctPiDefYsyMzNbDCs0NjambENK3YcMGeJoE2mj9tynjSFRM9uK/mFG/0iFeBw4cCB0zTXXNNdrx44dxsfDdnan90g5zz77rOM4qfT0dLVo0SLrv6m2hdRd2kDaoom00TPPPONrueA9+odZ/SOo8di+fbsaNGiQ+vzzz/XzCy64QF122WUx/X+5XiXO7r8apBSZ7/D22287Xps2bZr1c0CS4YorrtBtEa6ioiLqdicIHvqHWf0jqPGQLYauvfZaxzCvJG/xJKFcrxJDwgZryNmg7hMM3BfhVDZ16lTH80OHDqmqqirfygNv0T/M6h9BjMfy5cvVzTffrPeHDHe2+WuRcL2KHwkbrCEHubs3xS0qKvKtPKbp3bu3GjhwYKtthuCif5jVP4IUD1kJOmvWLL1gINJdyUQSNq5X8SNhgzUqKysdz+UEA6hW28TdZggu+odZ/SMo8ZCVoHKazPz58yP+PC0tTQ+JJoLrVXxI2GAFmbjrXhovx03BadSoUY7n0mbhk54RTPQPs/pHUOIhZxkPHz68xVy8cP369VNdunRJ6PdzvYoPCRusUFdXJ1vQOF679NJLfSuPqeS8VPdQxq5du3wrD7xB/zCrfwQhHu6VoNEkMhzahOtVfEjYYAU5AD1ct27d1Pnnn+9beUwlh9vn5eW12nYIHvqHWf3D9nisWbOmxUpQIXfS3KtB25Kwcb2KDwkbrFBbW+t4Xlxc7FtZTOf+1krCFnz0D7P6h83xWLZsWcSVoIWFhWrlypX6rmSyEjbB9Sp2JGywwuHDhx3Pe/bs6VtZTJefn+94fuTIEd/KAm/QP8zqHzbGo2klqJx72tjY6PiZDI1u3rxZHT161PF6PBvmRsP1KnYZcbwX8M3Jkycdz7Ozs30ri+ncbeNuOwQP/cOs/mFbPOSA+gceeCDi4gJZyfnaa6+pTp06qU2bNjl+Fu+GuZFwvYodCRus4F7J1bFjR9/KYrrMzEzHcxK24KN/mNU/bIrHDz/8oIdAoy0u6N69u07WhDtha+twqOB6FTuGRGEl28/ia0+0DfgbMKt/mBwPGdYsLS1Vubm5EX++YMECvdeaLETYsmVL0hM2k9vGNLQUAAApShKmhx56SH3zzTdqypQpUROo0aNHq4aGhqRsmIvEkLABAJDiLrzwQrVw4UJVXV0d0/vbsmEuEkPCBgAANPdK0GiSMRyK+JCwAQAAfTrDDTfcEFNLkLB5j1WiAAAElKyC3bFjhz5q6ueff25eFZuVlaVPX+jfv79+yGrNRx99NOLvkMUGMr8tfJUoCZv3SNgAAAgIScrKy8vVunXr1Jdffqm+/vrrFhvhuqWnp+sTB+S9kU5t6N27t9q4caPej0021/3111/bvGEu4kfCBgCA5UOZVVVV6pVXXtHJmmyEGw9J6CIla1deeaUqKipyrCYdO3aseuedd9iOwweBnsMmS5Dfffddde+996rLL79c5eTkqEsvvVQ9/PDDEf84gbOpq6tT5513nrr99tujvueFF17Q71m6dCkNipRC//De2rVr9ZDm8OHD9R2weJO11sgdOvnd8hnhq0klcYP3An2H7emnn1b/+q//2mJXZzns9z/+4z/UBx98EPMES6DpvL3jx4+rEydOtPpFQd4TvmcRkAroH97Zv3+/euyxx9Sbb74Z0/tlWLNHjx7NJwvIaQz79u1TO3fubPX/99VXX6lRo0apiRMnqueee05dfPHFSSk/4hfoO2xyHIjcvv373/+u/vGPf6hDhw6pTz/9VF1//fV64uUjjzzidxEBAIhr+HPJkiWqb9++UZM1mZP2u9/9Tr344ovqs88+U8eOHdNz0TZs2KBWr16tH/K/5bXJkyfH9LlvvPGGnrcmnw1/BPoO21NPPdXiNTl+Q+6s9ezZU+/sLHfcLrroIl/KBwBArE6fPq2mT5+uFi1aFPHnksTJlJ/77rtPnwF6Nj/99FPEBEwWFsh0IvfUIVnQIMdYbdu2TT3//PMqIyPQKYRxAn2HLRpZytyrVy/9LaTpUFsAAEwlUywmTJgQMVmTeWWSeMnWHTNnzowpWRORhjeHDh2q5s6dq3/X4sWL9VmjbnIigpSFaR/e6pCqE2PlG8LNN99MwgYAMJpsozFu3Di1atWqFj978MEH9Z2wSZMmxbVy85NPPmneky1c0wID+V0yXCojUfIZblIWKZOUDd5IufuZ8gcqt4uzs7P1BEogEXKxk5WgkXABQ6qjfyR/es97773XYo72q6++qu65556knWiwfPlydc455zhey8vL058jh7/L6tDwu2pSptmzZ6s5c+bEXQbEL6USNlkVM378eL1r83/+53/qjQJtIx0tmcu2bWFaEiT7FslKUFvaLtllNS0eNkmFeNA/khePNWvWqHnz5jleO/fcc9X777+vt/JIRLQTDWT+WzSyPdYll1yibrvtNsffr5TtxhtvVCNHjkyoLIhdyiRsv/zyi141I0dryKZ/8m3BRpKsRbuzA+/IhdL9jTd8H7Ynn3zSmHAsW7ZMP2CGVIgH/SM5ZGeD+++/3/Ga3AH76KOP9G4HiZCFBgsWLGjxuqwYjSWu8tkjRoxo/pIgNxGkjLJnm9yNQ/tJiTlshw8f1rd/N2/erO+s3XTTTX4XCZaTBSuSOEd6yFAFkMroH8khKzIPHjzoeG3+/PkJJ2utLTSQfdpiIZ/tvuN34MABtsnyQODvsO3Zs0ffTfvuu+/0LWT5ZmAzmXsndwtTzYwZMwJ/V6K9lJSU6CX4yUQ8Ekc8zGJqPGSVpnuRwS233BJ1ODMZCw1iJWWQodoPP/yw+bWKigp9yHy/fv0SLh9SOGGTEw1kXF32WpM/LPkWYbu0tDQ9fyHVuCfCIr62S/bfDPFoW9sRD3OYGg/3ojjZL1Qm/8u/AYmIZ6HB2cgKUimL7Pv2448/Ososvw/tI9BDonLrWO6syTcK+WYSafhq69atfhcTAADHEOPrr7/uaJGysjK98XuiEllo0BqZryZlCrdixQpddrSPQCds8o2iaXdoWdUS6SGrmQAAMIVsghu+fYbMi506dWrCv68tCw1aI2UKn7MrZeboqvYT6IRNdoSWozRae/zmN7/xu5iwiEzMlb8bmQ/Z2jdZeU+sZ/QBQUH/SI6PP/7Y8VxWYXbr1s23hQbRyIkKsq9puPXr17fpdyJF57BlZmbqB5AsMn/kbNuqyHwQ5nghFdE/2k5GhKqrqx2vjR071veFBtFI2V5++eXm51J2qQPnjCZfoO+wAQBgEzk20b05+qBBg3xfaBCNu2wy1UhWuCL5SNgAADCE7BcaToYtE11skOyFBtEWHxQVFbVaByQHCRsAAIaQnQ3CDRgwwKiFBpG4y+iuA5KDhA0AAEOcOHHC8bxLly5GLTSIxF1Gdx2QHIFedAAAgE0ef/xxNXHiRJ30yEMOXDdtoYHbtGnT1Lhx41SnTp30o0ePHu3yOamOhA0AAEPk5+frR6K8WGjgdtVVV+kH2hdDogAABIQXCw3gDxI2AAACwMuFBvAeCRsAAAHg5UIDeI+EDQAAy3m90ADeI2GDlc6cOeN3EYxF24C/AbP6R3t/ph8LDZKFv9XYkbDBCu4zYRsaGnwri+lOnTrleJ6VleVbWeAN+odZ/cPreNi80IDrVexI2GAF90XVfdYeorcNCVvw0T/M6h9exsP2hQZcr2JHwgYrdO3a1fF8z549vpXFdHv37nU8z8nJ8a0s8Ab9w6z+4WU8bF9owPUqdiRssEJxcbGV3x79UFNT43jep08f38oCb9A/zOofXsVjx44d1i804HoVOxI2WMF9UT148KA6duyYb+UxlbTJoUOHHK+RsAUf/cOs/uFFPGShwdSpU61caNCE61V8SNhghaKiIpWWltbqNzO0bJMOHTqoXr160TQBR/8wq394EQ9ZyNCvXz9dhybXXXedFQsNmnC9ig8JG6wgq64KCgqsve3vlTVr1jieS5u5V6wheOgfZvUPL+Ihn7Fw4UJVXV2tBg8erDp37qzeeustZROuV/EhYYM1xowZ43heXl7uW1lM5W4Td5shuOgfZvUPr+IxYMAAtXHjRrVp0ybVvXt3ZROuV/EhYYM1xo8f73j+xRdfqLq6Ot/KY5qdO3eqLVu2tNpmCC76h1n9w8t4yLCoDI/ahOtV/EjYYI1hw4ap3Nxcx2uR9h9KVTI8Ei4vL08v70dqoH+Y1T+Ih1nxCAISNlgjIyND3XXXXS0Stm3btqlUt3Xr1hbJ65133qnbDKmB/mFW/yAeZsUjCEjYYJWZM2c6Jgk3NjaqKVOmpPR5dFJ3aQNpiybSRtJWSC30D7P6B/EwKx62I2GDVWT37ieeeMLxWlVVlSotLU3JpE3qLHX/9NNPHa/PmjXLmp3OkTz0D7P6B/EwKx7WCwGWOX78eKigoCAkf77hj5KSklBjY2MoVUhdpc7udigsLAzV19e362eXlZU5PlOew4y2on/43z+Ih7nxsBl32GCd7OxstXTp0hbzHZYtW6aGDx+u50cEndRR6ip1DidtsmTJEtWpUyffygZ/0T/M6h/Ew6x42IyEDVYaPXq0WrlyZYukTW61y75EM2bM0MvGg0bqJHWTOrqHFaQtpE2kbZDa6B9m9Q/iYVY8rOX3LT6gLSoqKkIZGRktbrM3PQYOHBiaM2dOqLq6OnT06FHrGlvKLGWXOkhdotVT2kDawisMidrRVvQPf/oH8TDrehUUafIffieNQFusXr1aTZ48We3evfus75W9fuRg5vz8fD1UIauTws/i83tC7qlTp1R9fb3au3evPmfPfVB1JIWFhXpYwctvqrLK68UXX2x+XlZWphYtWuTZ59vE77aif3jfP1pDPMyKh1X8zhiBZJBJq7Nnzw5lZmZG/VYXtIfUVersx4Rd7rDZ1Vb0D7MQDyTCjFsLQBvJpNU//elPavv27XrZuPtEhCCRu4RSR6mr1JkJuzgb+odZiAcSQcKGQJG9fF566SW1f/9+tW7dOp3Y9OrVS6WlpSlbSdmlDlIXqdO+fft0Hdm3CPGif5iFeCAenAOBQJIVSCNGjNAPIXPDdu3apeeFyePIkSPq5MmT+mGSrKws/cjJydFz7eQhyVr46Q5AW9E/zEI8EAsSNqQESXj69u2rHwDoHybjeoVIGBIFAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADEfCBgAAYDgSNgAAAMORsAEAABiOhA0AAMBwJGwAAACGI2EDAAAwHAkbAACA4UjYAAAADJfhdwEAL5w6dUrV1dWpmpoaVVtbqw4fPqxOnjypXzdJZmamysrKUl27dlXFxcWqT58+qqioSL8OtBf6h1mIByIhYUMgnT59Wm3YsEGVl5eryspK9e2336pQKKRslJaWpgoKCtSYMWPU+PHj1bBhw1RGBl0XiaN/mIV4ICYhIEBqampCpaWlodzcXMnOAvmQukkda2trfWvnsrIyR5nkOcxvK/qHWYgH4sEcNgRCfX29mj17turfv79avHix+v7771VQSd2kjlJXqbPUHWgN/cMsxAOJYFwF1lu9erWaNGmSHvY8m27duum5YT179lTZ2dmqY8eOqkMHM763nDlzRjU0NOiL+Z49e/Rcu4MHD7Y6z+Xpp59WK1asUEuWLFGjR4/2tLywA/3DrP5BPMyKh01I2GC1VatWqQkTJug5IJFcffXVet7XyJEj9QT+zp07K5scO3ZML5RYu3atWrlypdqyZUuL9+zevVvdeuut+ud33HGHL+WEmegfZvUP4mFWPKwT1wAqYJCKiopQRkZGizle6enpoenTp4d27twZChqZtyZ1kzq66y1tIW2SavOyTOdXW9E//OsfxMOs61VQkLDBSpWVlRGTtaFDh4a2bt0aCjqpo9Q10kVQ2qa9kbCZ3Vb0D3/7RyrGo6qqytjrVVCYMXkHiIPM8ZI5a+5h0JKSErV+/Xp1+eWXB749pY5SV6lzOGmTyZMnqxMnTvhWNviL/mFW/wh6PGTu7R/+8Af1t7/9zYp42IyEDdaZO3duiwUGciGQlZOmLCDwgtRV6uy+CMocEWkjpCb6h1n9I8jxkETr7rvvVvPmzVODBw+2Ih5W8/sWHxDvvkWZmZkthhUaGxtTtiGl7kOGDHG0ibRRe+7TxpComW1F/zCjf6RCPA4cOBC65pprmuu1Y8cO4+NhO7vTe6ScZ5991nGcVHp6ulq0aJH131TbQuoubSBt0UTa6JlnnvG1XPAe/cOs/hHUeGzfvl0NGjRIff755/r5BRdcoC677LKY/r9crxJn918NUorMd3j77bcdr02bNs36OSDJcMUVV+i2CFdRURF1uxMED/3DrP4R1HjIFkPXXnutY5hXkrd4klCuV4khYYM15GxQ9wkG7otwKps6darj+aFDh1RVVZVv5YG36B9m9Y8gxmP58uXq5ptv1vtDhjvb/LVIuF7Fj4QN1pCD3N2b4hYVFflWHtP07t1bDRw4sNU2Q3DRP8zqH0GKh6wEnTVrll4wEOmuZCIJG9er+JGwwRqVlZWO53KCAVSrbeJuMwQX/cOs/hGUeMhKUDlNZv78+RF/npaWpodEE8H1Kj4kbLCCTNx1L42X46bgNGrUKMdzabPwSc8IJvqHWf0jKPGQs4yHDx/eYi5euH79+qkuXbok9Pu5XsWHhA1WqKurky1oHK9deumlvpXHVHJeqnsoY9euXb6VB96gf5jVP4IQD/dK0GgSGQ5twvUqPiRssIIcgB6uW7du6vzzz/etPKaSw+3z8vJabTsED/3DrP5hezzWrFnTYiWokDtp7tWgbUnYuF7Fh4QNVqitrXU8Ly4u9q0spnN/ayVhCz76h1n9w+Z4LFu2LOJK0MLCQrVy5Up9VzJZCZvgehU7EjZY4fDhw47nPXv29K0spsvPz3c8P3LkiG9lgTfoH2b1Dxvj0bQSVM49bWxsdPxMhkY3b96sjh496ng9ng1zo+F6FbuMON4L+ObkyZOO59nZ2b6VxXTutnG3HYKH/mFW/7AtHnJA/QMPPBBxcYGs5HzttddUp06d1KZNmxw/i3fD3Ei4XsWOhA1WcK/k6tixo29lMV1mZqbjOQlb8NE/zOofNsXjhx9+0EOg0RYXdO/eXSdrwp2wtXU4VHC9ih1DorCS7WfxtSfaBvwNmNU/TI6HDGuWlpaq3NzciD9fsGCB3mtNFiJs2bIl6QmbyW1jGloKAIAUJQnTQw89pL755hs1ZcqUqAnU6NGjVUNDQ1I2zEViSNgAAEhxF154oVq4cKGqrq6O6f1t2TAXiSFhAwAAmnslaDTJGA5FfEjYAACAPp3hhhtuiKklSNi8xypRAAACSlbB7tixQx819fPPPzevis3KytKnL/Tv318/ZLXmo48+GvF3yGIDmd8WvkqUhM17JGwAAASEJGXl5eVq3bp16ssvv1Rff/11i41w3dLT0/WJA/LeSKc29O7dW23cuFHvxyab6/76669t3jAX8SNhAwDA8qHMqqoq9corr+hkTTbCjYckdJGStSuvvFIVFRU5VpOOHTtWvfPOO2zH4YPAz2H7n//5HzV9+nT129/+Vu8z8//+3/9Td9xxh/rkk0/8LhosVFdXp8477zx1++23R33PCy+8oN+zdOlST8sG+I3+4b21a9fqIc3hw4frO2DxJmutkTt08rvlM8JXk0riBu8F+g7bzp071cCBA1u8vmfPHv0N4aWXXtIbBgLxnLd3/PhxdeLEiajvkb2K5D3hexYBqYD+4Z39+/erxx57TL355psxvV+GNXv06NF8soCcxrBv3z7972RrvvrqKzVq1Cg1ceJE9dxzz6mLL744KeVH/AJ/h+26665TS5Ys0ZMmv//+e7V161ZVVlamf/b444+rX375xe8iAgAQ8/Cn/JvWt2/fqMmazEn73e9+p1588UX12WefqWPHjum5aBs2bFCrV6/WD/nf8trkyZNj+tw33nhDz1uTz4Y/An2HrWmiZLiuXbuqRYsW6Vu98ocsK2fYrRkAYLrTp0/rKT7yb1gkksQ9/PDD6r777tNngJ7NTz/9FDEBk4UF7777bot5bbKgQUaltm3bpp5//nmVkRHoFMI4gb/DFo3MMRI5OTl+FwUAgFbJFIsJEyZETNZkXpkkXnIDYubMmTElayLS8ObQoUPV3Llz9e9avHixPmvUTU5EkLIw7cNbHVJxF+e//OUv+iBbmaRZXFzsd5EAAIhKttEYN26cWrVqVYufPfjgg/pO2KRJk+JauSkL75r2ZAvXtMBAfpcMl8oZo/IZblIWKZOUDd5IifuZ//u//6sXH8iEWJks3rFjR33L+N///d/9LhosJRe7pru0blzAkOroH8n11FNPqffee8/xmvw79uqrr6p77rknaScaLF++XJ1zzjmO1/Ly8vTnyOHvsjo0/K6alGn27Nlqzpw5cZcB8ctIpZVL4f+g7tq1Sy9Bj7SK1GTS0ZK5bNsWpiVBsm9R+N+U6W2X7LKaFg+bpEI86B/Ji4eMBs2bN8/x2rnnnqvef/99PUqUiGgnGsj8t2juvfdedckll6jbbrvN8fcrZbvxxhvVyJEjEyoLYpcSCZusbJHJknIROXjwoPrggw/Uk08+qYYNG6aP7OjZs6eyhSRr0e7swDtyoXR/4w3fh03+vkyxbNky/YAZUiEe9I/kOHTokLr//vsdr8kdsI8++khdf/31Cf1OWWiwYMGCFq/LitFY4iqfPWLEiOYvCXITQcooC/nkbhzaT0rMYUtLS9NJTpcuXdSll16qV9n827/9m97SI9Y9bAD3snn5m4r0kKEKIJXRP5JDVmTKTYZw8+fPTzhZa22hgeyqEAv5bPcdvwMHDqhHHnkk4TIhNilxhy1aEid+/PFHZZPs7OyU3DtuxowZgb8r0V5KSkr0EvxkIh6JIx5mMTUeskrTvcjglltuiTqcmYyFBrGSMshQ7Ycfftj8WkVFhR6x6tevX8LlQwonbM8884xeZCArWXr16qV3eD58+HDzREnxT//0T8q2RFPmL6Qa90RYxNd2yf6bIR5tazviYQ5T4yGnCoS76KKL9OT/ppsN7bnQ4GxkBamURfZ9C7/pIWWW34f2EeghUblNK4mZZPxyZ0qGqmSMXSZWys7PcqaoTKAEAMCkf7tef/11x2tyQo+ch52oRBYatEb+LW06NajJihUrdNnRPgKdsMluzTLWfvXVV+uETXaJlm9SQ4YM0bery8vLE/62AgBAe5BNcMO3z5CbDVOnTk3497VloUFrpEzhc3alzBxd1X4CPSQq30aeeOIJ/Wj6Y2JCONpCJubKiuPWjmSRb7IyWbjpkGUgVdA/kuPjjz92PJdVmN26dfNtoUE0cqKC7Gn68ssvN7+2fv169cc//rFNvxcpeIfNjWQNyVpxnJWVFfU9Mh9E3sM8L6Qa+kfbyUhQdXW147WxY8f6vtAgGnfZpOxSByRfSiVsAACYTA5Wd2+OPmjQIN8XGkTjLptsqisrXJF8JGwAABhi8+bNjucybJnoYoNkLzSItvigqKio1TogOUjYAAAwxHfffed4PmDAAKMWGkTiLqO7DkgOEjYAAAwhe4eGkxN6TFpoEIm7jO46IDkCvUoUAACbPP7442rixIk66ZGHHLhu2kIDt2nTpukN6jt16qQfPXr0aJfPSXUkbAAAGCI/P18/EuXFQgO3q666Sj/QvhgSBQAgILxYaAB/kLABABAAXi40gPdI2AAACAAvFxrAeyRsAABYzuuFBvAeCRusdObMGb+LYCw/2oZ4mNU2xMOstmnvz/RjoUGy8LcaOxI2WMF9kHpDQ4NvZTHdqVOnHM9bO/c0UcSDeNgqiP3D5oUGXsQjKEjYYAV3J3aftYfobdMeF0DiETviYZagxcP2hQZexCMoSNhgha5duzqe79mzx7eymG7v3r2O5zk5OUn/DOJBPGwVtP5h+0IDL+IRFCRssEJxcbGV3x79UFNT43jep0+fpH8G8SAetgpS/9ixY4f1Cw28iEdQkLDBCu5OfPDgQXXs2DHfymMqaZNDhw61+wWQeBAPGwWpf8hCg6lTp1q50MDreAQFCRusUFRUpNLS0lr9ZoaWbdKhQwfVq1cv4uET4mGWIMVDFjL069dP16HJddddZ8VCA6/jERQkbLCCrLoqKCiw9ra/V9asWeN4Lm3mXrGWDMSDeNgoSP1DPmPhwoWqurpaDR48WHXu3Fm99dZbyiZexSMoSNhgjTFjxjiel5eX+1YWU7nbxN1myUQ8iIdtgtg/BgwYoDZu3Kg2bdqkunfvrmziZTyCgIQN1hg/frzj+RdffKHq6up8K49pdu7cqbZs2dJqmyUT8SAeNgly/5ChRBketYnX8QgCEjZYY9iwYSo3N9fxWqT9h1KVDI+Ey8vL08v72wvxIB42oX+kdjyCgIQN1sjIyFB33XVXi4Rt27ZtKtVt3bq1RfJ655136jZrL8SDeNiC/mEWP+IRCCHAIrW1taHMzMyQ/Ok2PYYOHRpqbGwMpSqp+5AhQxxtIm0kbdXeiAfxMB39wyx+xsN23GGDVWT37ieeeMLxWlVVlSotLU3JQ4SlzlL3Tz/91PH6rFmzPNnpnHgQD5PRP8zidzys53fGCMTr+PHjoYKCAsc3NHmUlJSk1J02qavU2d0OhYWFofr6es/KQTyIh4noH2YxJR42I2GDlSorK0MZGRktOr/cav/HP/4RCjqpo3tYQR7SJtI2XiMexMMk9A+zmBYPW5GwwVoVFRURk7b09PTQ9OnTAzknQuokdZM6Rrr4SZv4hXgQD7/RP8xicjxsRMIGq0VLEpoeAwcODM2ZMydUXV0dOnr0aMg2UmYpu9RB6hKtnqZc/IgH8fAS/cMstsXDNmnyH37PowPaYvXq1Wry5Mlq9+7dZ32v7PUjhwvn5+er7OxsfQxK+Fl8fk/IPXXqlKqvr1d79+7V5+y5D0aOpLCwUC1ZskSNHj1amYB4EI/2QP/gepXy/M4YgWSQSauzZ89useVHkB9SV6mziRN2iYdZiIdZiAcSQcKGwM2ZKC0tDeXm5vqeULXXIy8vT9fRhjl6xMMsxMMsxAPxYEgUgXT69Gm9P5scLlxZWamHS20d/U9LS9PDnnIwspy1J8e32LYjOPEwC/EwC/FALEjYkBJkbtiuXbv0vDB5HDlyRJ08eVI/TJKVlaUfOTk5eq6dPHr16qXn2gUJ8TAL8TAL8UAkJGwAAACGM2N5HAAAAKIiYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AAAAw5GwAQAAGI6EDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AAAAw5GwAQAAGI6EDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AAAAw5GwAQAAGI6EDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AAAAw5GwAQAAGI6EDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AAAAw5GwAQAAGI6EDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AAAAw5GwAQAAGI6EDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AAAAw5GwAQAAGI6EDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAABgOBI2AAAAw5GwAQAAGI6EDQAAwHAkbAAAAIYjYQMAADAcCRsAAIDhSNgAAAAMR8IGAACgzPb/AQCadKt/XEdaAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 600x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_bits = 4\n",
    "dev = pl.device(\"default.qubit\", wires=n_bits)\n",
    "\n",
    "def oracle(keys):\n",
    "    matrix = np.identity(2 ** n_bits)\n",
    "    indices = [np.ravel_multi_index(key, [2]*len(key)) for key in keys]\n",
    "    for i in range(len(keys)):\n",
    "        matrix[indices[i], indices[i]] = -1\n",
    "    return matrix\n",
    "\n",
    "@pl.qnode(dev)\n",
    "def deutschjozsa(keys):\n",
    "    for i in range(n_bits):\n",
    "        pl.Hadamard(wires=[i])\n",
    "    pl.QubitUnitary(oracle(keys), wires = list(range(n_bits)))\n",
    "    for i in range(n_bits):\n",
    "        pl.Hadamard(wires=[i])\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 4: Bernstein-Vazirani"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The value of a is [[0 1 1]]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\Users\\Mina\\.venv\\pennylane\\Lib\\site-packages\\pennylane\\devices\\device_api.py:207: PennyLaneDeprecationWarning: Setting shots on device is deprecated. Please use the `set_shots` transform on the respective QNode instead.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "data": {
      "image/png": "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1JgFNREfAhoAAADgNMIzmdUnEcPNEBuSAgAAkuKbb76Rw4cPm5914bwzzjiDPQ3ASYFAQK666qqonktAk3oENACAhPnoo49kwYIFJuPP3/72t9px5ZrJ6KKLLjIN/V133SUXX3wxex1AWmkW0C1btsjmzZvNly81WUGzs7PNlzA9e/Y0N802NmHChIivockAdH5NcJYzAprUI6ABADSaBi/jxo2T1atXR/y9BjY6/lxvmhnoyiuvNGPSNcgBgFTQoGXRokXyzjvvyMcffyyffvppnYUyw2VmZkphYaF5briKigrp1q2brFmzxqxHo4tvas90YxfUROwIaAAAjRqGMX36dHnkkUdMQx4tDXwuvfRSeeyxx8xFgGYFAoBknKPKysrkxRdfNMGMLpQZCw14IgUz2stcUFAQkg3t+uuvl9dee410y2ng+aQA+/fvl5deekmGDx8urVu3lhYtWsiKFSvSXSw4avv27eYzNGTIkHqf8+yzz5rnzJs3L6VlA9JxoTB+/Hh58MEHYwpmaujf6N/qa+hrIbE4X8Hv9HpPh4z179/f9KDEGsw0RHt49LWDryk1G5oGNkg9z/fQ6HCGL774IuSxkydPpq08cNupU6fk6NGjUl1dXe9zdGiNPic4Jz3gRdozM3v27Ea/jr5Gfn6+TJ06NSHlwnc4X8GvPv/8c7n//vvllVdeier5OmysY8eOZq6MOn78uHz22Weybdu2Bv/uk08+kYEDB8rIkSPlqaeeku9973sJKT9i5/keGl3d9Y477pBXX33V/A8ASMycGR1mlij6WvqaABAv7emdO3eufP/73683mNE5MUOHDpXnnntO3n//famsrDRzYVatWiXLli0zN/1ZHxszZkxU7/vyyy+beTP63kgPz/fQBDeQK1euTGtZAMArNAFAPMPM6qOvpa+pY90BIFY6+mbixIn19hprkKMZFm+99VZp3779aV/v66+/jhig6Jy/119/vc68Gk04UFxcLJs2bZKnn35asrI8f4ltFc/30AAAEp+aub5sZo2hr6nj0gEgFjrEu6ioKGIwo/NaNDDR1MyTJk2KKphRkYaP9e3bV6ZNm2Zea86cOdKqVas6z9HsjVoWhp2nFgENACAmus6Mi68NwHu0d/fGG2+UpUuX1vmdTjXQnpTRo0fHlHnsvffeq12TJlhNAgB9LR2OtnXr1ojTGbQs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AAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAMBZBDQAAAAAnEVAAwAAAEBc9f8BBFNLq3lOdZsAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x500 with 1 Axes>"
      ]
     },
     "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",
    "    pl.PauliX(wires = 3)\n",
    "    for i in range(4):\n",
    "        pl.Hadamard(wires = i)\n",
    "    oracle()\n",
    "    for i in range(3):\n",
    "        pl.Hadamard(wires = i)\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}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pennylane (3.14.7)",
   "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.14.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
