From 861f3178b49296753a873ed202350faae855eaad Mon Sep 17 00:00:00 2001 From: Tiago de Lima <33109618+Tiagoblima@users.noreply.github.com> Date: Fri, 23 Nov 2018 01:12:43 -0300 Subject: [PATCH 01/49] =?UTF-8?q?Adi=C3=A7=C3=A3o=20dos=20conceitos=20b?= =?UTF-8?q?=C3=A1sicos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Iniciou-se a introdução ao funcionamento do teletransporte. --- teletransporte.ipynb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/teletransporte.ipynb b/teletransporte.ipynb index e69de29..316fb41 100644 --- a/teletransporte.ipynb +++ b/teletransporte.ipynb @@ -0,0 +1,30 @@ + +##Teletransporte + +**Definição:** Teletransporte quântico é o processo pela qualum estado arbritário de qubits é transferido de uma localização para outra. + +### Em que se basea: + +Baseado no teorema da não-clonagem de que move bits quânticos é possível, porém copia-los é impossível. O algoritmo de teletransporte vai trabalhar com o emaranhamento de dois qubits um utilizado por um lado da comunicação e o outro bit pelo outro lado. Neste caso chamaremos uma pessoa de Alice e outra de Bob. + + + +### Ferramentas necessárias: + +Para darmos procegimento a ideia de teletransportar informações através de bits quânticos, precisamos saber que mudanças de bases de qubits canonicais e não canonicais pode ser últil. No nosso caso uma utilizaremos uma base canonical com quatro dimensões. Como mostrado a seguir: + +**Base canonica:** $\{|0_A0_B \rangle, |0_A1_B\rangle, |1_A0_B\rangle, |1_A1_B\rangle \}$ +
Enquanto isso uma base canonica é a chamada **Bell basis** que consiste em 4 vetores: + + $|\Psi+\rangle = \frac{|0_A1_B \rangle + |1_A0_B\rangle}{\sqrt{2}}$
+ $|\Psi-\rangle = \frac{|0_A1_B \rangle - |1_A0_B\rangle}{\sqrt{2}}$
+ $|\Phi+\rangle = \frac{|0_A0_B \rangle + |1_A1_B\rangle}{\sqrt{2}}$
+ $|\Phi-\rangle = \frac{|0_A0_B \rangle - |1_A1_B\rangle}{\sqrt{2}}$
+ + ### Como tudo funciona: + + Antes de tudo Alice possui um qubit $|\psi\rangle = \alpha|0\rangle + \beta|1\rangle$ a qual deseja teletransportar para Bob. + + Então são formados dois quibits emaranhados como $|\Phi+\rangle$ da seguinte forma: + + $|\varphi\rangle = |\psi\rangle\otimes|0\rangle\otimes|0\rangle$ From a927f4bb100669387687797beeec123d38623f65 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Sat, 24 Nov 2018 07:57:32 -0300 Subject: [PATCH 02/49] updates --- teletransporte.ipynb | 85 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/teletransporte.ipynb b/teletransporte.ipynb index e69de29..10128e6 100644 --- a/teletransporte.ipynb +++ b/teletransporte.ipynb @@ -0,0 +1,85 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Teletransporte\n", + "\n", + "**Definição:** Teletransporte quântico é o processo pela qualum estado arbritário de qubits é transferido de uma localização para outra." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Em que se basea: \n", + "\n", + "Baseado no teorema da não-clonagem de que move bits quânticos é possível, porém copia-los é impossível. O algoritmo de teletransporte vai trabalhar com o emaranhamento de dois qubits um utilizado por um lado da comunicação e o outro bit pelo outro lado. Neste caso chamaremos uma pessoa de Alice e outra de Bob.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ferramentas necessárias: \n", + "\n", + "Para darmos procegimento a ideia de teletransportar informações através de bits quânticos, precisamos saber que mudanças de bases de qubits canonicais e não canonicais pode ser últil. No nosso caso uma utilizaremos uma base canonical com quatro dimensões. Como mostrado a seguir:\n", + "\n", + "**Base canonica:** $\\{|0_A0_B \\rangle, |0_A1_B\\rangle, |1_A0_B\\rangle, |1_A1_B\\rangle \\}$\n", + "
Enquanto isso uma base canonica é a chamada **Bell basis** que consiste em 4 vetores:\n", + " \n", + " $|\\Psi+\\rangle = \\frac{|0_A1_B \\rangle + |1_A0_B\\rangle}{\\sqrt{2}}$
\n", + " $|\\Psi-\\rangle = \\frac{|0_A1_B \\rangle - |1_A0_B\\rangle}{\\sqrt{2}}$
\n", + " $|\\Phi+\\rangle = \\frac{|0_A0_B \\rangle + |1_A1_B\\rangle}{\\sqrt{2}}$
\n", + " $|\\Phi-\\rangle = \\frac{|0_A0_B \\rangle - |1_A1_B\\rangle}{\\sqrt{2}}$
\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " ### Como tudo funciona:\n", + " \n", + " Antes de tudo Alice possui um qubit $|\\Psi\\rangle = \\alpha|0\\rangle + \\beta|1\\rangle$ a qual deseja teletransportar para Bob. \n", + " \n", + " Então são formados dois quibits emaranhados como $|\\Psi\\rangle\\otimes|\\Phi+\\rangle$ da seguinte forma: $|\\psi\\rangle\\otimes|\\Phi+\\rangle$ de forma que o estado inicial é composto por três qubits da seguinte forma: \n", + " $$|\\psi_0\\rangle = |\\Psi\\rangle\\otimes|\\Phi+\\rangle = (\\alpha|0\\rangle + \\beta|1\\rangle)(\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}})$$\n", + "$$|\\psi_0\\rangle = \\alpha|0\\rangle(\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}}) + \\beta|1\\rangle(\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}})$$\n", + "$$|\\psi_0\\rangle = \\frac{\\alpha|000\\rangle + \\beta|100\\rangle + \\alpha|011\\rangle + \\beta|111\\rangle}{\\sqrt{2}}$$\n", + "\n", + "Dessa forma Alice controla os dois primeiros bits enquanto Bob apenas o último. A parti daí Alice usa o processo de decondificação dessa forma o qubit a ser transmitido e a metade emaranhada que ela possui podem ser combinadas. Para tal ela tem implementado o seguinte circuito quântico: $(C_not\\otimes I)$ seguido por $(H\\otimes I\\otimes I)$.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 0c778341cff41ab8b625f53e9fe1a339bce606de Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Sat, 24 Nov 2018 16:17:04 -0300 Subject: [PATCH 03/49] Terminada a parte teorica --- teletransporte.ipynb | 212 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 206 insertions(+), 6 deletions(-) diff --git a/teletransporte.ipynb b/teletransporte.ipynb index 10128e6..5a38c9f 100644 --- a/teletransporte.ipynb +++ b/teletransporte.ipynb @@ -38,19 +38,219 @@ ] }, { + "attachments": { + "image.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABG8AAAGkCAYAAACPRAghAAAgAElEQVR4AezdB3RcxdnG8WebmiX3btwbtsF0jDHG9NBCh0AghNACgUDohBJ6EsqXBAIESEhCj8Em9BIgdDC2AdsY3HDDvduyVbd9571mFZWVtJJW0t2r/z1HR7t3586d+c1alt6deccXj8fj4kAAAQQQQAABBBBAAAEEEEAAAQQQcKWA35WtolEIIIAAAggggAACCCCAAAIIIIAAAo4AwRveCAgggAACCCCAAAIIIIAAAggggICLBQjeuHhwaBoCCCCAAAIIIIAAAggggAACCCBA8Ib3AAIIIIAAAggggAACCCCAAAIIIOBiAYI3Lh4cmoYAAggggAACCCCAAAIIIIAAAggQvOE9gAACCCCAAAIIIIAAAggggAACCLhYgOCNiweHpiGAAAIIIIAAAggggAACCCCAAAIEb3gPIIAAAggggAACCCCAAAIIIIAAAi4WIHjj4sGhaQgggAACCCCAAAIIIIAAAggggADBG94DCCCAAAIIIIAAAggggAACCCCAgIsFCN64eHBoGgIIIIAAAggggAACCCCAAAIIIEDwhvcAAggggAACCCCAAAIIIIAAAggg4GIBgjcuHhyahgACCCCAAAIIIIAAAggggAACCBC84T2AAAIIIIAAAggggAACCCCAAAIIuFiA4I2LB4emIYAAAggggAACCCCAAAIIIIAAAgRveA8ggAACCCCAAAIIIIAAAggggAACLhYgeOPiwaFpCCCAAAIIIIAAAggggAACCCCAAMEb3gMIIIAAAggggAACCCCAAAIIIICAiwUI3rh4cGgaAggggAACCCCAAAIIIIAAAgggQPCG9wACCCCAAAIIIIAAAggggAACCCDgYgGCNy4eHJqGAAIIIIAAAggggAACCCCAAAIIELzhPYAAAggggAACCCCAAAIIIIAAAgi4WIDgjYsHh6YhgAACCCCAAAIIIIAAAggggAACBG94DyCAAAIIIIAAAggggAACCCCAAAIuFiB44+LBoWkIIIAAAggggAACCCCAAAIIIIAAwRveAwgggAACCCCAAAIIIIAAAggggICLBQjeuHhwaBoCCCCAAAIIIIAAAggggAACCCBA8Ib3AAIIIIAAAggggAACCCCAAAIIIOBiAYI3Lh4cmoYAAggggAACCCCAAAII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owDBmzRiUhUCCCCAAAIIIIAAAggggAACCCCQbgGCN+kWpT4EEEAAAQQQQAABBBBAAAEEEEAgjQIEb9KISVUIIIAAAggggAACCCCAAAIIIIBAugUI3qRblPoQQAABBBBAAAEEEEAAAQQQQACBNAoQvEkjJlUhgAACCCCAAAIIIIAAAggggAAC6RYgeJNuUepDAAEEEEAAAQQQQAABBBBAAAEE0ihA8CaNmFSFAAIIIIAAAggggAACCCCAAAIIpFuA4E26RakPAQQQQAABBBBAAAEEEEAAAQQQSKMAwZs0YlIVAggggAACCCCAAAIIIIAAAgggkG4BgjfpFqU+BBBAAAEEEEAAAQQQQAABBBBAII0CBG/SiElVCCCAAAIIIIAAAggggAACCCCAQLoFCN6kWfS///2vysrK6qw1HA7rzTffVDwer7McLyKAAAIIIIAAAggggAACCCCAAAJBrxFce+21mjp1qtOtjh076vnnn6/oYjQa1bx58/T1119r7dq1ysnJ0ejRo7XHHnvI768ax3rooYf07LPPOtfm5ubqr3/9q3r37l1RV20PnnrqKe28887q1q1bbUWcoM3DDz+svffeW506daq1HC8ggAACCCCAAAIIIIAAAggggAACngvezJo1SzNnztSvfvUr5efnVxnhs88+W48//rhCoZDzWnFxsTNLZuzYsc75IUOGVJQfOnSoDj74YL3zzjv64IMPVFpaWvFaUx9kZWXp0EMP1RtvvKHTTjutqdVxPQIIIIAAAggggAACCCCAAAIIeFjAc8EbG6vOnTvr+uuvrzGbxgImxxxzjDPbpl27diopKZHNlLntttt00UUXOcEUn8/nDLcFbuzLljhNmzatUW+BWCzmzAKy4I8Fkmw51RlnnOHMyrF2XH311frRj35Uo52NuhkXIYAAAggggAACCCCAAAIIIICAJwUyJnhj+WHWrFmjb7/9Vh06dNCoUaNky6AsAJOXl6dgsP6uWOCk+nHjjTfqrbfe0scff6zNmzendRnTe++9pz/+8Y+aOHGi08Yvv/zSCd7Y8z59+jgBnQULFmj48OHVm8VzBBBAAAEEEEAAAQQQQAABBBBAwBGomujFpSg2Y+Xmm2/W4MGDddhhh2nffffVgQce6OSh6dmzp95///0mtdyWMdlSKvueriMSiei6667TmWee6QRurN5dd93Vefz0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IICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN6keVxLS0sVj8frrNVet3IcCCCAAAIIIIAAAggggAACCCCAQH0CwfoKZNrr06ZN09q1a51mZ2dn65BDDmlUF+bMmaNFixY51waDQY0fP155eXn11vXrX/9aN954ozp37lxrWQvc/OIXv9BDDz0kayMHAggggAACCCCAAAIIIIAAAgggUJuA54I3N910k95++2317t1bXbp00eeff15b3/XUU0/pb3/7m7p3766HH35YHTt2rCj773//W4888oi2bNmiSCSimTNnatCgQRWv1/agsLBQ0Wi0tped8zk5OSooKJAFiHbdddc6y/IiAggggAACCCCAAAIIIIAAAgi0bQFPLpvaYYcd9OWXX+rdd9+tdXQXL16sa665Rh9++KE+/fRTJ0BTufBll13mBGx+/vOfVz7d4Mex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fTX0OOuss9S+ffs6L7PZNrYEjEz0dTLxIgIIIIAAAggggAACCCCAAAIISMro4M0ee+yhp59+2lUDOX78+HrbYztfWT4cDgQQQAABBBBAAAEEEEAAAQQQQKA+gYzYbaq+TvA6AggggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCDw/+3dW4wW1R0A8D8uclFuAgILckeugpdasWpTWy+1iYnRRJ+M9kFj1Nik6oN9atPWJk0fTaz60FRfmqjR6IONTdpUrdZIWVjwLhd3uRSoIBdhF1RozpRvuizwfcvsMu7O/k6yfPPNzDlnzm82Ox//71wIECBAgACBSggI3lTiNmoEAQIECBAgQIAAAQIECBAgUFUBwZuq3lntIkCAAAECBAgQIECAAAECBCohIHhTiduoEQQI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sXH9+rzi6TNnxrDhw/P3NggQIECAAAECBAgQOP0C24/OP5mmMOia0opTabGS2vGux2wTIECgqIDgTVG5byjf7s8/j107d2a1pwfDrDlzvqErUS0BAgQIECBAgACBwSuQlgZPKX0m756ampqyCZ677/eeAAECRQWO/0tTtCT5ShFID4nU+yalieeeG90j/aVchEoIECBAgAABAgQIDHKBsWPHZgJpfpuuKS0u0tHREbXjXY/ZJkCAQFEBc94UlfuG8qWAzbKLL469e/bEgkWLThjp/4YuTbUECBAgQIAAAQIEBo1AbSWpLVu2HNPm/fv3x+7du600dYyKNwQI9FZAz5veCpacP3XLnL9gQVx62WUxevTokmtXHQECBAgQIECAAAECSSAtnT5t2rRYsWJFpN42tZTep3TdddfVdnklQIBArwUEb3pNqAACBAgQIECAAAECBAabwMSJE+POO++Ml19+ObZt25Y1P01x8Ic//CGWL18eV1555WAj0V4CBE6jwJAjXcPEp7EiRRMgQIAAAQIECBAgMPAE2tvb47777os0HOiNN96I2bNnZ0OCfvSjH8X9998/8BrUh1d88ODBLIDzySefxG233Zb1wlm3bl08++yzMX/+/D6sSVEECAx2AcGbwf4boP0ECBAgQIAAAQIE6ggcOnQo2trajjsjTcg7adKk4/YPth3JZ82aNfHRRx9lHt/+9rctKjLYfgm0l0AJAoI3JSCrggABAgQIECBAgAABAgQIECBQVMCcN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChB4L+DoW19/ZFRAwAAAABJRU5ErkJggg==" + } + }, "cell_type": "markdown", "metadata": {}, "source": [ " ### Como tudo funciona:\n", " \n", - " Antes de tudo Alice possui um qubit $|\\Psi\\rangle = \\alpha|0\\rangle + \\beta|1\\rangle$ a qual deseja teletransportar para Bob. \n", + " Antes de tudo Alice possui um qubit $|\\psi\\rangle = \\alpha|0\\rangle + \\beta|1\\rangle$ a qual deseja teletransportar para Bob. \n", " \n", - " Então são formados dois quibits emaranhados como $|\\Psi\\rangle\\otimes|\\Phi+\\rangle$ da seguinte forma: $|\\psi\\rangle\\otimes|\\Phi+\\rangle$ de forma que o estado inicial é composto por três qubits da seguinte forma: \n", - " $$|\\psi_0\\rangle = |\\Psi\\rangle\\otimes|\\Phi+\\rangle = (\\alpha|0\\rangle + \\beta|1\\rangle)(\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}})$$\n", - "$$|\\psi_0\\rangle = \\alpha|0\\rangle(\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}}) + \\beta|1\\rangle(\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}})$$\n", - "$$|\\psi_0\\rangle = \\frac{\\alpha|000\\rangle + \\beta|100\\rangle + \\alpha|011\\rangle + \\beta|111\\rangle}{\\sqrt{2}}$$\n", + " Então mais dois quibits emaranhados são colocados no sistema de forma que o estado inicial é composto por três qubits da seguinte forma: $|\\Psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle$ aplicando ao circuito\n", + " $(C_not\\otimes I)(H\\otimes I)$ afim de obtermos o estado $|\\Phi+\\rangle$ (ou qualquer outro estado vetor da base não-canonica de Bell) para realizarmos a transmição do qubit de interesse.\n", + "$$|\\varphi_0\\rangle = |\\psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle = (\\alpha|0\\rangle + \\beta|1\\rangle)\\otimes|00\\rangle$$\n", + "$$|\\varphi_1\\rangle = |\\psi\\rangle\\otimes\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\otimes|0\\rangle$$\n", + "$$|\\varphi_2\\rangle = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |10\\rangle}{\\sqrt{2}} = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}} $$ \n", + "$$|\\varphi_2\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|00\\rangle + |11\\rangle)}{\\sqrt{2}} = |\\psi\\rangle\\otimes|\\Phi+\\rangle$$\n", + "Dessa forma Alice controla os dois primeiros bits enquanto Bob apenas o último. A parti daí Alice usa o processo de decondificação dessa forma o qubit a ser transmitido e a metade emaranhada que ela possui podem ser combinadas. Para tal ela tem implementado o seguinte circuito quântico: $(C_not\\otimes I)$ seguido por $(H\\otimes I\\otimes I)$,\n", + "sendo assim $(H\\otimes I\\otimes I)(C_not\\otimes I)(|\\psi\\rangle\\otimes|\\Phi+\\rangle)$ Ao passar pelo circuito teremos:\n", + "\n", + "$$|\\varphi_3\\rangle = \\frac{\\alpha(|0\\rangle + |1\\rangle)(|00\\rangle + |11\\rangle) + \\beta(|0\\rangle - |1\\rangle)(|10\\rangle + |01\\rangle)}{2}$$\n", + "$$|\\varphi_4\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|10\\rangle + |01\\rangle)}{2}$$\n", + "$$|\\varphi_4\\rangle = \\frac{\\alpha|000\\rangle + |011\\rangle + |100\\rangle + |111\\rangle + \\beta|010\\rangle + |001\\rangle + -|110\\rangle + |101\\rangle }{2}$$\n", + "$$|\\varphi_4\\rangle = \\frac{|00\\rangle(\\alpha|0\\rangle + \\beta|1\\rangle) + |01\\rangle(\\beta|1\\rangle + \\alpha|0\\rangle) + |10\\rangle(\\alpha|0\\rangle - \\beta|1\\rangle) + |11\\rangle(-\\beta|0\\rangle + \\alpha|1\\rangle)}{2}$$\n", + "\n", + "\n", + "O circuito completo:\n", + "\n", + "\n", + "![image.png](attachment:image.png)\n", + "\n", + "Neste momento os dois qubits de Alice são medidos e então os três qubits colapsão para um das quatro possibilidades. Supondo que \n", + "o bit colapsado seja $|01\\rangle$ temos que lidar com dois problemas:\n", + "\n", + "(a) Apesar de Alice saber o estado Bob não sabe.
\n", + "(b) Bob $\\alpha|0\\rangle - \\beta|1\\rangle$, mas não o qubit desejado.
\n", + "\n", + "A fim de resolver este problema Alice envia uma copia de dois bits que usa essa informação para alcançar o estado desejado.\n", + "Rebendo $|01\\rangle$ então ele sabe o qubit está no estado:\n", + "\n", + " \n", + "$$ \n", + "\\begin{equation*}\n", + "\\alpha|0\\rangle - \\beta|1\\rangle = \\begin{vmatrix}\n", + " \\alpha \\\\\n", + " -\\beta \\\\\n", + "\\end{vmatrix}\n", + "\\end{equation*};\n", + "$$\n", + "Após este vetor agir sobre a seguinte base \n", + "$\n", + "\\begin{vmatrix}\n", + " 1 & 0 \\\\ \n", + " 0 & -1 \\\\\n", + "\\end{vmatrix}\n", + "$ teremos:\n", + "\n", + "$\n", + "\\begin{vmatrix}\n", + " 1 & 0 \\\\ \n", + " 0 & -1 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "$\n", + "\\begin{vmatrix}\n", + "\\alpha \\\\\n", + "-\\beta \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "$\n", + "= \n", + "\\begin{vmatrix}\n", + "\\alpha \\\\\n", + "\\beta \\\\\n", + "\\end{vmatrix}\n", + "= \n", + "$\n", + "$\\alpha|0\\rangle + \\beta|1\\rangle = |\\psi\\rangle$\n", "\n", - "Dessa forma Alice controla os dois primeiros bits enquanto Bob apenas o último. A parti daí Alice usa o processo de decondificação dessa forma o qubit a ser transmitido e a metade emaranhada que ela possui podem ser combinadas. Para tal ela tem implementado o seguinte circuito quântico: $(C_not\\otimes I)$ seguido por $(H\\otimes I\\otimes I)$.\n" + "E agora Bob tem a informação que estava com Alice.
\n", + "**Matriz de reconstrução de Bob:** \n", + "
\n", + "1.\n", + "$\n", + "\\begin{vmatrix}\n", + " 0 & 1 \\\\ \n", + " 1 & 0 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "
\n", + "2.\n", + "$\n", + "\\begin{vmatrix}\n", + " 0 & 1 \\\\ \n", + " 1 & 0 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "
\n", + "3.\n", + "$\n", + "\\begin{vmatrix}\n", + " 1 & 0 \\\\ \n", + " 0 & -1 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "
\n", + "4.\n", + "$\n", + "\\begin{vmatrix}\n", + " 0 & 1 \\\\ \n", + "-1 & 0 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "
\n", + "
\n", + "**Bit recebido:**\n", + "1. $|00\\rangle$\n", + "2. $|01\\rangle$\n", + "3. $|10\\rangle$\n", + "4. $|11\\rangle$\n", + "\n", + "Pontos a serem observados:\n", + "\n", + "1. Alice não possui mais o estado $|psi\\rangle$.\n", + "2. Os bits clássicos navegam em um canal clássico e é impossível que Bob chegue a informação sem que este bits sejam transmitidos.\n", + "3. $\\alpha$ e $\\beta$ são números complexos arbritarios que satisfazem a equação $|\\alpha|^{2} + |\\beta|^{2} = 1$ podendo ter uma expansão infinito decimal porém toda essa informação. Contudo essa informação é passada na forma de qubit que quando colapsa quando passado para Bob e inutil quando medido.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simulação do circuito:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('00011', 22)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"c[5]\",\"n\"\n", + "\"00001\",34\n", + "\"00000\",24\n", + "\"00010\",20\n", + "\"00011\",22\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 3)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m3\u001b[0m\n\u001b[1;33m OPENQASM 2.0;\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "# Name of Experiment: Experiment #Teleportation v1\n", + "\n", + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "\n", + "\n", + "qreg q[2];\n", + "creg c[2];\n", + "\n", + "h q[1];\n", + "cx q[2],q[1];\n", + "cx q[1],q[0];\n", + "h q[0];\n", + "measure q[1] -> c[1];\n", + "measure q[0] -> c[0];\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'qiskit'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mqiskit\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mqskit\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'qiskit'" + ] + } + ], + "source": [ + "import qiskit as qskit\n", + "\n", + "\n" ] }, { From 89335b7123af3c9e81062eab2c490c90bb60baec Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Sun, 25 Nov 2018 08:41:13 -0300 Subject: [PATCH 04/49] =?UTF-8?q?Preparando=20para=20atualiza=C3=A7=C3=B5e?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- superdense.ipynb | 32 +++++++++++++++++++ teletransporte.ipynb | 75 +++++++++----------------------------------- 2 files changed, 47 insertions(+), 60 deletions(-) diff --git a/superdense.ipynb b/superdense.ipynb index e69de29..81f040b 100644 --- a/superdense.ipynb +++ b/superdense.ipynb @@ -0,0 +1,32 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/teletransporte.ipynb b/teletransporte.ipynb index be40855..968aee1 100644 --- a/teletransporte.ipynb +++ b/teletransporte.ipynb @@ -1,4 +1,3 @@ -<<<<<<< HEAD { "cells": [ { @@ -175,30 +174,6 @@ "### Simulação do circuito:" ] }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('00011', 22)" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"c[5]\",\"n\"\n", - "\"00001\",34\n", - "\"00000\",24\n", - "\"00010\",20\n", - "\"00011\",22\n" - ] - }, { "cell_type": "code", "execution_count": 3, @@ -249,17 +224,29 @@ } ], "source": [ - "import qiskit as qskit\n", - "\n", + "import qiskit as qkit\n", + "from qiskit.tools.visualization import cirtcuit_drawer\n", + "from qiskit.tools.visualization import plot_histogram\n", + "import time\n", + "from qiskit import Aer\n", "\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Inicializando os registradores quânticos e classicos:" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "rq = qkit.QuantumRegister(size=3)\n" + ] } ], "metadata": { @@ -284,35 +271,3 @@ "nbformat": 4, "nbformat_minor": 2 } -======= - -##Teletransporte - -**Definição:** Teletransporte quântico é o processo pela qualum estado arbritário de qubits é transferido de uma localização para outra. - -### Em que se basea: - -Baseado no teorema da não-clonagem de que move bits quânticos é possível, porém copia-los é impossível. O algoritmo de teletransporte vai trabalhar com o emaranhamento de dois qubits um utilizado por um lado da comunicação e o outro bit pelo outro lado. Neste caso chamaremos uma pessoa de Alice e outra de Bob. - - - -### Ferramentas necessárias: - -Para darmos procegimento a ideia de teletransportar informações através de bits quânticos, precisamos saber que mudanças de bases de qubits canonicais e não canonicais pode ser últil. No nosso caso uma utilizaremos uma base canonical com quatro dimensões. Como mostrado a seguir: - -**Base canonica:** $\{|0_A0_B \rangle, |0_A1_B\rangle, |1_A0_B\rangle, |1_A1_B\rangle \}$ -
Enquanto isso uma base canonica é a chamada **Bell basis** que consiste em 4 vetores: - - $|\Psi+\rangle = \frac{|0_A1_B \rangle + |1_A0_B\rangle}{\sqrt{2}}$
- $|\Psi-\rangle = \frac{|0_A1_B \rangle - |1_A0_B\rangle}{\sqrt{2}}$
- $|\Phi+\rangle = \frac{|0_A0_B \rangle + |1_A1_B\rangle}{\sqrt{2}}$
- $|\Phi-\rangle = \frac{|0_A0_B \rangle - |1_A1_B\rangle}{\sqrt{2}}$
- - ### Como tudo funciona: - - Antes de tudo Alice possui um qubit $|\psi\rangle = \alpha|0\rangle + \beta|1\rangle$ a qual deseja teletransportar para Bob. - - Então são formados dois quibits emaranhados como $|\Phi+\rangle$ da seguinte forma: - - $|\varphi\rangle = |\psi\rangle\otimes|0\rangle\otimes|0\rangle$ ->>>>>>> master From 43f6ceb524d1e39b86ec1f98e4a166d00c323d21 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Wed, 28 Nov 2018 20:57:23 -0300 Subject: [PATCH 05/49] =?UTF-8?q?Projeto=20atualiza=C3=A7=C3=B5es=20finais?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superdense-checkpoint.ipynb | 221 ++++++++++ .../teletransporte-checkpoint.ipynb | 295 +++++++++++++ superdense.ipynb | 193 ++++++++- teletransporte.ipynb | 386 +++++++++++++++--- 4 files changed, 1028 insertions(+), 67 deletions(-) create mode 100644 .ipynb_checkpoints/superdense-checkpoint.ipynb create mode 100644 .ipynb_checkpoints/teletransporte-checkpoint.ipynb diff --git a/.ipynb_checkpoints/superdense-checkpoint.ipynb b/.ipynb_checkpoints/superdense-checkpoint.ipynb new file mode 100644 index 0000000..4f13ccf --- /dev/null +++ b/.ipynb_checkpoints/superdense-checkpoint.ipynb @@ -0,0 +1,221 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Superdense\n", + "\n", + "**Definição:** Dense code usa um qubit compartilhado com um pars EPR para decondificar e transmitir dois bits clássicos.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " *Obs.:* EPR ou Einstein–Podolsky–Rosen paradox (EPR paradox) é um paradoxo que avalia que em certas circunstancias a medição do estado de A pode determinar com um precisão arbritária o estado de outro qubit B, mesmo a longas distâncias desde que estejam emaranhados.
Fonte: https://phys.org/news/2018-04-einstein-podolsky-rosen-paradox-many-particle.html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Como funciona?\n", + "\n", + "Agora iremos supor que Alice e Bob querem se comunicar e que Alice tem o primeiro qubit e Bob o segundo.\n", + "\n", + "
1.Inicialmente irimos ter dois bits emaranhados:\n", + "\n", + "$|\\psi_0\\rangle = \\frac{1}{\\sqrt{2}}(|0_A0_B\\rangle + |1_A1_B)$\n", + "\n", + "Sabendo disso, devemos ter em mente que Alice só pode transforma o qubit dela e Bob só poderá transformar o qubit dele. Isso poderá ser feito da seguinte forma: Se alice tem n qubits e Bob m qubits, temos que a transformação realizada por alice será $I^{m}\\otimes U$, onde U é a matrix de transformação para n qubits, enquanto a de Bob $I^n\\otimes U$ onde U é a matrix de transformação para m qubits." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### O que é feito?\n", + "\n", + "\n", + "Alice que transmiti dois bits que representam valores entre 0 e 3 para isso ele realiza uma transformação no seu qubit $|\\psi_0\\rangle$.\n", + "\n", + "Valor______Transformação_______Novo Estado\n", + "
\n", + "\n", + "\n", + "0 || $|\\psi_0\\rangle = (I\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle)$
\n", + "1 || $|\\psi_0\\rangle = (X \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle)$
\n", + "2 || $|\\psi_0\\rangle = (Z \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle)$
\n", + "3 || $|\\psi_0\\rangle = (Y\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle)$
\n", + "\n", + "Depois disso Bob usa C_not e nos dois bits emaranhados e depois apliaca Hadamard: \n", + "
\n", + "$ \\begin{cases}\n", + "\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle) \\\\\n", + "\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle) \\\\ \n", + "\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle) \\\\ \n", + "\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle) \\\\ \n", + "\\end{cases} $\n", + "\n", + "$C_not$\n", + "$\\rightarrow$\n", + "\n", + "$ \\begin{cases}\n", + "\\frac{1}{\\sqrt{2}}(|00\\rangle + |10\\rangle) \\\\\n", + "\\frac{1}{\\sqrt{2}}(|11\\rangle - |01\\rangle) \\\\ \n", + "\\frac{1}{\\sqrt{2}}(|00\\rangle - |10\\rangle) \\\\ \n", + "\\frac{1}{\\sqrt{2}}(-|11\\rangle + |01\\rangle) \\\\ \n", + "\\end{cases} $\n", + "=\n", + "$ \\begin{cases}\n", + "\\frac{1}{\\sqrt{2}}(|0\\rangle + |1\\rangle)\\otimes|0\\rangle \\\\\n", + "\\frac{1}{\\sqrt{2}}(|1\\rangle - |0\\rangle)\\otimes|1\\rangle \\\\ \n", + "\\frac{1}{\\sqrt{2}}(|0\\rangle - |1\\rangle)\\otimes|0\\rangle \\\\ \n", + "\\frac{1}{\\sqrt{2}}(-|1\\rangle + |0\\rangle)\\otimes|1\\rangle \\\\ \n", + "\\end{cases} $\n", + "\n", + "$H\\otimes I$ \n", + "$\\rightarrow$\n", + "\n", + "$ \\begin{cases}\n", + " |00\\rangle \\\\\n", + " |01\\rangle \\\\ \n", + " |10\\rangle \\\\ \n", + " |11\\rangle \\\\ \n", + "\\end{cases} $\n", + "\n", + "\n", + "Ao final do processo Bob terá os mesmo bits que foram enviados por Alice." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exemplo: Supondo que o bit represente o valor 1" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import qiskit as qkit \n", + "import time\n", + "from qiskit import Aer\n", + "from qiskit.tools.visualization import circuit_drawer\n", + "from qiskit.tools.visualization import plot_histogram\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Iniciando os registradores quânticos e clássicos" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "rq = qkit.QuantumRegister(size=2)\n", + "rc = qkit.ClassicalRegister(size=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "superdense = qkit.QuantumCircuit(rq, rc)\n", + "\n", + "\n", + "superdense.h(rq[0])\n", + "superdense.cx(rq[0], rq[1])\n", + "\n", + "superdense.x(rq[0])\n", + "\n", + "superdense.cx(rq[0], rq[1])\n", + "superdense.h(rq[0])\n", + "superdense.measure(rq[0], rc[0])\n", + "superdense.measure(rq[1], rc[1])\n", + "circuit_drawer(superdense)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'teleport' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mshots\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m50\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mjob\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mqkit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mteleport\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbackend\u001b[0m\u001b[1;33m=\u001b[0m \u001b[0mAer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_backend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"qasm_simulator_py\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshots\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mshots\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mk\u001b[0m \u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mwait_time\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'teleport' is not defined" + ] + } + ], + "source": [ + "\n", + "shots = 50\n", + "job = qkit.execute(teleport, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", + "k =0 \n", + "wait_time = 1 \n", + "while k < shots:\n", + " print(job.status)\n", + " print(\"Faltam {0} segundos\".format(k))\n", + " k = k + wait_time\n", + " time.sleep(wait_time)\n", + " \n", + "results_sim = job.result()\n", + "outputs_sim = results_sim.get_counts()\n", + "\n", + "plot_histogram(outputs_sim)" + ] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/.ipynb_checkpoints/teletransporte-checkpoint.ipynb b/.ipynb_checkpoints/teletransporte-checkpoint.ipynb new file mode 100644 index 0000000..753a7fd --- /dev/null +++ b/.ipynb_checkpoints/teletransporte-checkpoint.ipynb @@ -0,0 +1,295 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Teletransporte\n", + "\n", + "**Definição:** Teletransporte quântico é o processo pela qualum estado arbritário de qubits é transferido de uma localização para outra." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Em que se basea: \n", + "\n", + "Baseado no teorema da não-clonagem de que move bits quânticos é possível, porém copia-los é impossível. O algoritmo de teletransporte vai trabalhar com o emaranhamento de dois qubits um utilizado por um lado da comunicação e o outro bit pelo outro lado. Neste caso chamaremos uma pessoa de Alice e outra de Bob.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Ferramentas necessárias: \n", + "\n", + "Para darmos procegimento a ideia de teletransportar informações através de bits quânticos, precisamos saber que mudanças de bases de qubits canonicais e não canonicais pode ser últil. No nosso caso uma utilizaremos uma base canonical com quatro dimensões. Como mostrado a seguir:\n", + "\n", + "**Base canonica:** $\\{|0_A0_B \\rangle, |0_A1_B\\rangle, |1_A0_B\\rangle, |1_A1_B\\rangle \\}$\n", + "
Enquanto isso uma base canonica é a chamada **Bell basis** que consiste em 4 vetores:\n", + " \n", + " $|\\Psi+\\rangle = \\frac{|0_A1_B \\rangle + |1_A0_B\\rangle}{\\sqrt{2}}$
\n", + " $|\\Psi-\\rangle = \\frac{|0_A1_B \\rangle - |1_A0_B\\rangle}{\\sqrt{2}}$
\n", + " $|\\Phi+\\rangle = \\frac{|0_A0_B \\rangle + |1_A1_B\\rangle}{\\sqrt{2}}$
\n", + " $|\\Phi-\\rangle = \\frac{|0_A0_B \\rangle - |1_A1_B\\rangle}{\\sqrt{2}}$
\n", + " \n" + ] + }, + { + "attachments": { + "image.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABG8AAAGkCAYAAACPRAghAAAgAElEQVR4AezdB3RcxdnG8WebmiX3btwbtsF0jDHG9NBCh0AghNACgUDohBJ6EsqXBAIESEhCj8Em9BIgdDC2AdsY3HDDvduyVbd9571mFZWVtJJW0t2r/z1HR7t3586d+c1alt6deccXj8fj4kAAAQQQQAABBBBAAAEEEEAAAQQQcKWA35WtolEIIIAAAggggAACCCCAAAIIIIAAAo4AwRveCAgggAACCCCAAAIIIIAAAggggICLBQjeuHhwaBoCCCCAAAIIIIAAAggggAACCCBA8Ib3AAIIIIAAAggggAACCCCAAAIIIOBiAYI3Lh4cmoYAAggggAACCCCAAAIIIIAAAggQvOE9gAACCCCAAAIIIIAAAggggAACCLhYgOCNiweHpiGAAAIIIIAAAggggAACCCCAAAIEb3gPIIAAAggggAACCCCAAAIIIIAAAi4WIHjj4sGhaQgggAACCCCAAAIIIIAAAggggADBG94DCCCAAAIIIIAAAggggAACCCCAgIsFCN64eHBoGgIIIIAAAggggAACCCCAAAIIIEDwhvcAAggggAACCCCAAAIIIIAAAggg4GIBgjcuHhyahgACCCCAAAIIIIAAAggggAACCBC84T2AAAIIIIAAAggggAACCCCAAAIIuFiA4I2LB4emIYAAAggggAACCCCAAAIIIIAAAgRveA8ggAACCCCAAAIIIIAAAggggAACLhYgeOPiwaFpCCCAAAIIIIAAAggggAACCCCAAMEb3gMIIIAAAggggAACCCCAAAIIIICAiwUI3rh4cGgaAggggAACCCCAAAIIIIAAAgggQPCG9wACCCCAAAIIIIAAAggggAACCCDgYgGCNy4eHJqGAAIIIIAAAggggAACCCCAAAIIELzhPYAAAggggAACCCCAAAIIIIAAAgi4WIDgjYsHh6YhgAACCCCAAAIIIIAAAggggAACBG94DyCAAAIIIIAAAggggAACCCCAAAIuFiB44+LBoWkIIIAAAggggAACCCCAAAIIIIAAwRveAwgggAACCCCAAAIIIIAAAggggICLBQjeuHhwaBoCCCCAAAIIIIAAAggggAACCCBA8Ib3AAIIIIAAAggggAACCCCAAAIIIOBiAYI3Lh4cmoYAAggggAACCCCAAAII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owDBmzRiUhUCCCCAAAIIIIAAAggggAACCCCQbgGCN+kWpT4EEEAAAQQQQAABBBBAAAEEEEAgjQIEb9KISVUIIIAAAggggAACCCCAAAIIIIBAugUI3qRblPoQQAABBBBAAAEEEEAAAQQQQACBNAoQvEkjJlUhgAACCCCAAAIIIIAAAggggAAC6RYgeJNuUepDAAEEEEAAAQQQQAABBBBAAAEE0ihA8CaNmFSFAAIIIIAAAggggAACCCCAAAIIpFuA4E26RakPAQQQQAABBBBAAAEEEEAAAQQQSKMAwZs0YlIVAggggAACCCCAAAIIIIAAAgggkG4BgjfpFqU+BBBAAAEEEEAAAQQQQAABBBBAII0CBG/SiElVCCCAAAIIIIAAAggggAACCCCAQLoFCN6kWfS///2vysrK6qw1HA7rzTffVDwer7McLyKAAAIIIIAAAggggAACCCCAAAJBrxFce+21mjp1qtOtjh076vnnn6/oYjQa1bx58/T1119r7dq1ysnJ0ejRo7XHHnvI768ax3rooYf07LPPOtfm5ubqr3/9q3r37l1RV20PnnrqKe28887q1q1bbUWcoM3DDz+svffeW506daq1HC8ggAACCCCAAAIIIIAAAggggAACngvezJo1SzNnztSvfvUr5efnVxnhs88+W48//rhCoZDzWnFxsTNLZuzYsc75IUOGVJQfOnSoDj74YL3zzjv64IMPVFpaWvFaUx9kZWXp0EMP1RtvvKHTTjutqdVxPQIIIIAAAggggAACCCCAAAIIeFjAc8EbG6vOnTvr+uuvrzGbxgImxxxzjDPbpl27diopKZHNlLntttt00UUXOcEUn8/nDLcFbuzLljhNmzatUW+BWCzmzAKy4I8Fkmw51RlnnOHMyrF2XH311frRj35Uo52NuhkXIYAAAggggAACCCCAAAIIIICAJwUyJnhj+WHWrFmjb7/9Vh06dNCoUaNky6AsAJOXl6dgsP6uWOCk+nHjjTfqrbfe0scff6zNmzendRnTe++9pz/+8Y+aOHGi08Yvv/zSCd7Y8z59+jgBnQULFmj48OHVm8VzBBBAAAEEEEAAAQQQQAABBBBAwBGomujFpSg2Y+Xmm2/W4MGDddhhh2nffffVgQce6OSh6dmzp95///0mtdyWMdlSKvueriMSiei6667TmWee6QRurN5dd93Vefz0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IICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN6keVxLS0sVj8frrNVet3IcCCCAAAIIIIAAAggggAACCCCAQH0CwfoKZNrr06ZN09q1a51mZ2dn65BDDmlUF+bMmaNFixY51waDQY0fP155eXn11vXrX/9aN954ozp37lxrWQvc/OIXv9BDDz0kayMHAggggAACCCCAAAIIIIAAAgggUJuA54I3N910k95++2317t1bXbp00eeff15b3/XUU0/pb3/7m7p3766HH35YHTt2rCj773//W4888oi2bNmiSCSimTNnatCgQRWv1/agsLBQ0Wi0tped8zk5OSooKJAFiHbdddc6y/IiAggggAACCCCAAAIIIIAAAgi0bQFPLpvaYYcd9OWXX+rdd9+tdXQXL16sa665Rh9++KE+/fRTJ0BTufBll13mBGx+/vOfVz7d4Mex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fTX0OOuss9S+ffs6L7PZNrYEjEz0dTLxIgIIIIAAAggggAACCCCAAAIISMro4M0ee+yhp59+2lUDOX78+HrbYztfWT4cDgQQQAABBBBAAAEEEEAAAQQQQKA+gYzYbaq+TvA6AggggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCDw/+3dW4wW1R0A8D8uclFuAgILckeugpdasWpTWy+1iYnRRJ+M9kFj1Nik6oN9atPWJk0fTaz60FRfmqjR6IONTdpUrdZIWVjwLhd3uRSoIBdhF1RozpRvuizwfcvsMu7O/k6yfPPNzDlnzm82Ox//71wIECBAgACBSggI3lTiNmoEAQIECBAgQIAAAQIECBAgUFUBwZuq3lntIkCAAAECBAgQIECAAAECBCohIHhTiduoEQQI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sXH9+rzi6TNnxrDhw/P3NggQIECAAAECBAgQOP0C24/OP5mmMOia0opTabGS2vGux2wTIECgqIDgTVG5byjf7s8/j107d2a1pwfDrDlzvqErUS0BAgQIECBAgACBwSuQlgZPKX0m756ampqyCZ677/eeAAECRQWO/0tTtCT5ShFID4nU+yalieeeG90j/aVchEoIECBAgAABAgQIDHKBsWPHZgJpfpuuKS0u0tHREbXjXY/ZJkCAQFEBc94UlfuG8qWAzbKLL469e/bEgkWLThjp/4YuTbUECBAgQIAAAQIEBo1AbSWpLVu2HNPm/fv3x+7du600dYyKNwQI9FZAz5veCpacP3XLnL9gQVx62WUxevTokmtXHQECBAgQIECAAAECSSAtnT5t2rRYsWJFpN42tZTep3TdddfVdnklQIBArwUEb3pNqAACBAgQIECAAAECBAabwMSJE+POO++Ml19+ObZt25Y1P01x8Ic//CGWL18eV1555WAj0V4CBE6jwJAjXcPEp7EiRRMgQIAAAQIECBAgMPAE2tvb47777os0HOiNN96I2bNnZ0OCfvSjH8X9998/8BrUh1d88ODBLIDzySefxG233Zb1wlm3bl08++yzMX/+/D6sSVEECAx2AcGbwf4boP0ECBAgQIAAAQIE6ggcOnQo2trajjsjTcg7adKk4/YPth3JZ82aNfHRRx9lHt/+9rctKjLYfgm0l0AJAoI3JSCrggABAgQIECBAgAABAgQIECBQVMCcN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChB4L+DoW19/ZFRAwAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + " ### Como tudo funciona:\n", + " \n", + " Antes de tudo Alice possui um qubit $|\\psi\\rangle = \\alpha|0\\rangle + \\beta|1\\rangle$ a qual deseja teletransportar para Bob. \n", + " \n", + " Então mais dois quibits emaranhados são colocados no sistema de forma que o estado inicial é composto por três qubits da seguinte forma: $|\\Psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle$ aplicando ao circuito\n", + " $(C_not\\otimes I)(H\\otimes I)$ afim de obtermos o estado $|\\Phi+\\rangle$ (ou qualquer outro estado vetor da base não-canonica de Bell) para realizarmos a transmição do qubit de interesse.\n", + "$$|\\varphi_0\\rangle = |\\psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle = (\\alpha|0\\rangle + \\beta|1\\rangle)\\otimes|00\\rangle$$\n", + "$$|\\varphi_1\\rangle = |\\psi\\rangle\\otimes\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\otimes|0\\rangle$$\n", + "$$|\\varphi_2\\rangle = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |10\\rangle}{\\sqrt{2}} = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}} $$ \n", + "$$|\\varphi_2\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|00\\rangle + |11\\rangle)}{\\sqrt{2}} = |\\psi\\rangle\\otimes|\\Phi+\\rangle$$\n", + "Dessa forma Alice controla os dois primeiros bits enquanto Bob apenas o último. A parti daí Alice usa o processo de decondificação dessa forma o qubit a ser transmitido e a metade emaranhada que ela possui podem ser combinadas. Para tal ela tem implementado o seguinte circuito quântico: $(C_not\\otimes I)$ seguido por $(H\\otimes I\\otimes I)$,\n", + "sendo assim $(H\\otimes I\\otimes I)(C_not\\otimes I)(|\\psi\\rangle\\otimes|\\Phi+\\rangle)$ Ao passar pelo circuito teremos:\n", + "\n", + "$$|\\varphi_3\\rangle = \\frac{\\alpha(|0\\rangle + |1\\rangle)(|00\\rangle + |11\\rangle) + \\beta(|0\\rangle - |1\\rangle)(|10\\rangle + |01\\rangle)}{2}$$\n", + "$$|\\varphi_4\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|10\\rangle + |01\\rangle)}{2}$$\n", + "$$|\\varphi_4\\rangle = \\frac{\\alpha|000\\rangle + |011\\rangle + |100\\rangle + |111\\rangle + \\beta|010\\rangle + |001\\rangle + -|110\\rangle + |101\\rangle }{2}$$\n", + "$$|\\varphi_4\\rangle = \\frac{|00\\rangle(\\alpha|0\\rangle + \\beta|1\\rangle) + |01\\rangle(\\beta|1\\rangle + \\alpha|0\\rangle) + |10\\rangle(\\alpha|0\\rangle - \\beta|1\\rangle) + |11\\rangle(-\\beta|0\\rangle + \\alpha|1\\rangle)}{2}$$\n", + "\n", + "\n", + "O circuito completo:\n", + "\n", + "\n", + "![image.png](attachment:image.png)\n", + "\n", + "Neste momento os dois qubits de Alice são medidos e então os três qubits colapsão para um das quatro possibilidades. Supondo que \n", + "o bit colapsado seja $|01\\rangle$ temos que lidar com dois problemas:\n", + "\n", + "(a) Apesar de Alice saber o estado Bob não sabe.
\n", + "(b) Bob $\\alpha|0\\rangle - \\beta|1\\rangle$, mas não o qubit desejado.
\n", + "\n", + "A fim de resolver este problema Alice envia uma copia de dois bits que usa essa informação para alcançar o estado desejado.\n", + "Rebendo $|01\\rangle$ então ele sabe o qubit está no estado:\n", + "\n", + " \n", + "$$ \n", + "\\begin{equation*}\n", + "\\alpha|0\\rangle - \\beta|1\\rangle = \\begin{vmatrix}\n", + " \\alpha \\\\\n", + " -\\beta \\\\\n", + "\\end{vmatrix}\n", + "\\end{equation*};\n", + "$$\n", + "Após este vetor agir sobre a seguinte base \n", + "$\n", + "\\begin{vmatrix}\n", + " 1 & 0 \\\\ \n", + " 0 & -1 \\\\\n", + "\\end{vmatrix}\n", + "$ teremos:\n", + "\n", + "$\n", + "\\begin{vmatrix}\n", + " 1 & 0 \\\\ \n", + " 0 & -1 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "$\n", + "\\begin{vmatrix}\n", + "\\alpha \\\\\n", + "-\\beta \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "$\n", + "= \n", + "\\begin{vmatrix}\n", + "\\alpha \\\\\n", + "\\beta \\\\\n", + "\\end{vmatrix}\n", + "= \n", + "$\n", + "$\\alpha|0\\rangle + \\beta|1\\rangle = |\\psi\\rangle$\n", + "\n", + "E agora Bob tem a informação que estava com Alice.
\n", + "**Matriz de reconstrução de Bob:** \n", + "
\n", + "1.\n", + "$\n", + "\\begin{vmatrix}\n", + " 0 & 1 \\\\ \n", + " 1 & 0 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "
\n", + "2.\n", + "$\n", + "\\begin{vmatrix}\n", + " 0 & 1 \\\\ \n", + " 1 & 0 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "
\n", + "3.\n", + "$\n", + "\\begin{vmatrix}\n", + " 1 & 0 \\\\ \n", + " 0 & -1 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "
\n", + "4.\n", + "$\n", + "\\begin{vmatrix}\n", + " 0 & 1 \\\\ \n", + "-1 & 0 \\\\\n", + "\\end{vmatrix}\n", + "$\n", + "
\n", + "
\n", + "**Bit recebido:**\n", + "1. $|00\\rangle$\n", + "2. $|01\\rangle$\n", + "3. $|10\\rangle$\n", + "4. $|11\\rangle$\n", + "\n", + "Pontos a serem observados:\n", + "\n", + "1. Alice não possui mais o estado $|psi\\rangle$.\n", + "2. Os bits clássicos navegam em um canal clássico e é impossível que Bob chegue a informação sem que este bits sejam transmitidos.\n", + "3. $\\alpha$ e $\\beta$ são números complexos arbritarios que satisfazem a equação $|\\alpha|^{2} + |\\beta|^{2} = 1$ podendo ter uma expansão infinito decimal porém toda essa informação. Contudo essa informação é passada na forma de qubit que quando colapsa quando passado para Bob e inutil quando medido.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simulação do circuito:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "('00011', 22)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"c[5]\",\"n\"\n", + "\"00001\",34\n", + "\"00000\",24\n", + "\"00010\",20\n", + "\"00011\",22\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 3)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m3\u001b[0m\n\u001b[1;33m OPENQASM 2.0;\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "# Name of Experiment: Experiment #Teleportation v1\n", + "\n", + "OPENQASM 2.0;\n", + "include \"qelib1.inc\";\n", + "\n", + "\n", + "qreg q[2];\n", + "creg c[2];\n", + "\n", + "h q[1];\n", + "cx q[2],q[1];\n", + "cx q[1],q[0];\n", + "h q[0];\n", + "measure q[1] -> c[1];\n", + "measure q[0] -> c[0];\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'qiskit'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mqiskit\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mqskit\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'qiskit'" + ] + } + ], + "source": [ + "import qiskit as qskit\n", + "from qiskit.tools.visualization import cirtcuit_drawer\n", + "from qiskit.tools.visualization import plot_histogram\n", + "import time\n", + "from qiskit import Aer\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/superdense.ipynb b/superdense.ipynb index 81f040b..4f13ccf 100644 --- a/superdense.ipynb +++ b/superdense.ipynb @@ -1,11 +1,200 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Superdense\n", + "\n", + "**Definição:** Dense code usa um qubit compartilhado com um pars EPR para decondificar e transmitir dois bits clássicos.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " *Obs.:* EPR ou Einstein–Podolsky–Rosen paradox (EPR paradox) é um paradoxo que avalia que em certas circunstancias a medição do estado de A pode determinar com um precisão arbritária o estado de outro qubit B, mesmo a longas distâncias desde que estejam emaranhados.
Fonte: https://phys.org/news/2018-04-einstein-podolsky-rosen-paradox-many-particle.html" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Como funciona?\n", + "\n", + "Agora iremos supor que Alice e Bob querem se comunicar e que Alice tem o primeiro qubit e Bob o segundo.\n", + "\n", + "
1.Inicialmente irimos ter dois bits emaranhados:\n", + "\n", + "$|\\psi_0\\rangle = \\frac{1}{\\sqrt{2}}(|0_A0_B\\rangle + |1_A1_B)$\n", + "\n", + "Sabendo disso, devemos ter em mente que Alice só pode transforma o qubit dela e Bob só poderá transformar o qubit dele. Isso poderá ser feito da seguinte forma: Se alice tem n qubits e Bob m qubits, temos que a transformação realizada por alice será $I^{m}\\otimes U$, onde U é a matrix de transformação para n qubits, enquanto a de Bob $I^n\\otimes U$ onde U é a matrix de transformação para m qubits." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### O que é feito?\n", + "\n", + "\n", + "Alice que transmiti dois bits que representam valores entre 0 e 3 para isso ele realiza uma transformação no seu qubit $|\\psi_0\\rangle$.\n", + "\n", + "Valor______Transformação_______Novo Estado\n", + "
\n", + "\n", + "\n", + "0 || $|\\psi_0\\rangle = (I\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle)$
\n", + "1 || $|\\psi_0\\rangle = (X \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle)$
\n", + "2 || $|\\psi_0\\rangle = (Z \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle)$
\n", + "3 || $|\\psi_0\\rangle = (Y\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle)$
\n", + "\n", + "Depois disso Bob usa C_not e nos dois bits emaranhados e depois apliaca Hadamard: \n", + "
\n", + "$ \\begin{cases}\n", + "\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle) \\\\\n", + "\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle) \\\\ \n", + "\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle) \\\\ \n", + "\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle) \\\\ \n", + "\\end{cases} $\n", + "\n", + "$C_not$\n", + "$\\rightarrow$\n", + "\n", + "$ \\begin{cases}\n", + "\\frac{1}{\\sqrt{2}}(|00\\rangle + |10\\rangle) \\\\\n", + "\\frac{1}{\\sqrt{2}}(|11\\rangle - |01\\rangle) \\\\ \n", + "\\frac{1}{\\sqrt{2}}(|00\\rangle - |10\\rangle) \\\\ \n", + "\\frac{1}{\\sqrt{2}}(-|11\\rangle + |01\\rangle) \\\\ \n", + "\\end{cases} $\n", + "=\n", + "$ \\begin{cases}\n", + "\\frac{1}{\\sqrt{2}}(|0\\rangle + |1\\rangle)\\otimes|0\\rangle \\\\\n", + "\\frac{1}{\\sqrt{2}}(|1\\rangle - |0\\rangle)\\otimes|1\\rangle \\\\ \n", + "\\frac{1}{\\sqrt{2}}(|0\\rangle - |1\\rangle)\\otimes|0\\rangle \\\\ \n", + "\\frac{1}{\\sqrt{2}}(-|1\\rangle + |0\\rangle)\\otimes|1\\rangle \\\\ \n", + "\\end{cases} $\n", + "\n", + "$H\\otimes I$ \n", + "$\\rightarrow$\n", + "\n", + "$ \\begin{cases}\n", + " |00\\rangle \\\\\n", + " |01\\rangle \\\\ \n", + " |10\\rangle \\\\ \n", + " |11\\rangle \\\\ \n", + "\\end{cases} $\n", + "\n", + "\n", + "Ao final do processo Bob terá os mesmo bits que foram enviados por Alice." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exemplo: Supondo que o bit represente o valor 1" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "import qiskit as qkit \n", + "import time\n", + "from qiskit import Aer\n", + "from qiskit.tools.visualization import circuit_drawer\n", + "from qiskit.tools.visualization import plot_histogram\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Iniciando os registradores quânticos e clássicos" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "rq = qkit.QuantumRegister(size=2)\n", + "rc = qkit.ClassicalRegister(size=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "superdense = qkit.QuantumCircuit(rq, rc)\n", + "\n", + "\n", + "superdense.h(rq[0])\n", + "superdense.cx(rq[0], rq[1])\n", + "\n", + "superdense.x(rq[0])\n", + "\n", + "superdense.cx(rq[0], rq[1])\n", + "superdense.h(rq[0])\n", + "superdense.measure(rq[0], rc[0])\n", + "superdense.measure(rq[1], rc[1])\n", + "circuit_drawer(superdense)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'teleport' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mshots\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m50\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mjob\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mqkit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mteleport\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbackend\u001b[0m\u001b[1;33m=\u001b[0m \u001b[0mAer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_backend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"qasm_simulator_py\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshots\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mshots\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mk\u001b[0m \u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mwait_time\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'teleport' is not defined" + ] + } + ], + "source": [ + "\n", + "shots = 50\n", + "job = qkit.execute(teleport, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", + "k =0 \n", + "wait_time = 1 \n", + "while k < shots:\n", + " print(job.status)\n", + " print(\"Faltam {0} segundos\".format(k))\n", + " k = k + wait_time\n", + " time.sleep(wait_time)\n", + " \n", + "results_sim = job.result()\n", + "outputs_sim = results_sim.get_counts()\n", + "\n", + "plot_histogram(outputs_sim)" + ] } ], "metadata": { diff --git a/teletransporte.ipynb b/teletransporte.ipynb index 968aee1..68574f0 100644 --- a/teletransporte.ipynb +++ b/teletransporte.ipynb @@ -6,7 +6,7 @@ "source": [ "## Teletransporte\n", "\n", - "**Definição:** Teletransporte quântico é o processo pela qualum estado arbritário de qubits é transferido de uma localização para outra." + "**Definição:** Teletransporte quântico é o processo pela qual um estado arbritário de qubits é transferido de uma localização para outra." ] }, { @@ -28,7 +28,7 @@ "Para darmos procegimento a ideia de teletransportar informações através de bits quânticos, precisamos saber que mudanças de bases de qubits canonicais e não canonicais pode ser últil. No nosso caso uma utilizaremos uma base canonical com quatro dimensões. Como mostrado a seguir:\n", "\n", "**Base canonica:** $\\{|0_A0_B \\rangle, |0_A1_B\\rangle, |1_A0_B\\rangle, |1_A1_B\\rangle \\}$\n", - "
Enquanto isso uma base canonica é a chamada **Bell basis** que consiste em 4 vetores:\n", + "
Enquanto isso uma base não-canonica chamada **Bell basis** que consiste em 4 vetores:\n", " \n", " $|\\Psi+\\rangle = \\frac{|0_A1_B \\rangle + |1_A0_B\\rangle}{\\sqrt{2}}$
\n", " $|\\Psi-\\rangle = \\frac{|0_A1_B \\rangle - |1_A0_B\\rangle}{\\sqrt{2}}$
\n", @@ -38,11 +38,7 @@ ] }, { - "attachments": { - "image.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABG8AAAGkCAYAAACPRAghAAAgAElEQVR4AezdB3RcxdnG8WebmiX3btwbtsF0jDHG9NBCh0AghNACgUDohBJ6EsqXBAIESEhCj8Em9BIgdDC2AdsY3HDDvduyVbd9571mFZWVtJJW0t2r/z1HR7t3586d+c1alt6deccXj8fj4kAAAQQQQAABBBBAAAEEEEAAAQQQcKWA35WtolEIIIAAAggggAACCCCAAAIIIIAAAo4AwRveCAgggAACCCCAAAIIIIAAAggggICLBQjeuHhwaBoCCCCAAAIIIIAAAggggAACCCBA8Ib3AAIIIIAAAggggAACCCCAAAIIIOBiAYI3Lh4cmoYAAggggAACCCCAAAIIIIAAAggQvOE9gAACCCCAAAIIIIAAAggggAACCLhYgOCNiweHpiGAAAIIIIAAAggggAACCCCAAAIEb3gPIIAAAggggAACCCCAAAIIIIAAAi4WIHjj4sGhaQgggAACCCCAAAIIIIAAAggggADBG94DCCCAAAIIIIAAAggggAACCCCAgIsFCN64eHBoGgIIIIAAAggggAACCCCAAAIIIEDwhvcAAggggAACCCCAAAIIIIAAAggg4GIBgjcuHhyahgACCCCAAAIIIIAAAggggAACCBC84T2AAAIIIIAAAggggAACCCCAAAIIuFiA4I2LB4emIYAAAggggAACCCCAAAIIIIAAAgRveA8ggAACCCCAAAIIIIAAAggggAACLhYgeOPiwaFpCCCAAAIIIIAAAggggAACCCCAAMEb3gMIIIAAAggggAACCCCAAAIIIICAiwUI3rh4cGgaAggggAACCCCAAAIIIIAAAgggQPCG9wACCCCAAAIIIIAAAggggAACCCDgYgGCNy4eHJqGAAIIIIAAAggggAACCCCAAAIIELzhPYAAAggggAACCCCAAAIIIIAAAgi4WIDgjYsHh6YhgAACCCCAAAIIIIAAAggggAACBG94DyCAAAIIIIAAAggggAACCCCAAAIuFiB44+LBoWkIIIAAAggggAACCCCAAAIIIIAAwRveAwgggAACCCCAAAIIIIAAAggggICLBQjeuHhwaBoCCCCAAAIIIIAAAggggAACCCBA8Ib3AAIIIIAAAggggAACCCCAAAIIIOBiAYI3Lh4cmoYAAggggAACCCCAAAII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owDBmzRiUhUCCCCAAAIIIIAAAggggAACCCCQbgGCN+kWpT4EEEAAAQQQQAABBBBAAAEEEEAgjQIEb9KISVUIIIAAAggggAACCCCAAAIIIIBAugUI3qRblPoQQAABBBBAAAEEEEAAAQQQQACBNAoQvEkjJlUhgAACCCCAAAIIIIAAAggggAAC6RYgeJNuUepDAAEEEEAAAQQQQAABBBBAAAEE0ihA8CaNmFSFAAIIIIAAAggggAACCCCAAAIIpFuA4E26RakPAQQQQAABBBBAAAEEEEAAAQQQSKMAwZs0YlIVAggggAACCCCAAAIIIIAAAgggkG4BgjfpFqU+BBBAAAEEEEAAAQQQQAABBBBAII0CBG/SiElVCCCAAAIIIIAAAggggAACCCCAQLoFCN6kWfS///2vysrK6qw1HA7rzTffVDwer7McLyKAAAIIIIAAAggggAACCCCAAAJBrxFce+21mjp1qtOtjh076vnnn6/oYjQa1bx58/T1119r7dq1ysnJ0ejRo7XHHnvI768ax3rooYf07LPPOtfm5ubqr3/9q3r37l1RV20PnnrqKe28887q1q1bbUWcoM3DDz+svffeW506daq1HC8ggAACCCCAAAIIIIAAAggggAACngvezJo1SzNnztSvfvUr5efnVxnhs88+W48//rhCoZDzWnFxsTNLZuzYsc75IUOGVJQfOnSoDj74YL3zzjv64IMPVFpaWvFaUx9kZWXp0EMP1RtvvKHTTjutqdVxPQIIIIAAAggggAACCCCAAAIIeFjAc8EbG6vOnTvr+uuvrzGbxgImxxxzjDPbpl27diopKZHNlLntttt00UUXOcEUn8/nDLcFbuzLljhNmzatUW+BWCzmzAKy4I8Fkmw51RlnnOHMyrF2XH311frRj35Uo52NuhkXIYAAAggggAACCCCAAAIIIICAJwUyJnhj+WHWrFmjb7/9Vh06dNCoUaNky6AsAJOXl6dgsP6uWOCk+nHjjTfqrbfe0scff6zNmzendRnTe++9pz/+8Y+aOHGi08Yvv/zSCd7Y8z59+jgBnQULFmj48OHVm8VzBBBAAAEEEEAAAQQQQAABBBBAwBGomujFpSg2Y+Xmm2/W4MGDddhhh2nffffVgQce6OSh6dmzp95///0mtdyWMdlSKvueriMSiei6667TmWee6QRurN5dd93Vefz0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IICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN6keVxLS0sVj8frrNVet3IcCCCAAAIIIIAAAggggAACCCCAQH0CwfoKZNrr06ZN09q1a51mZ2dn65BDDmlUF+bMmaNFixY51waDQY0fP155eXn11vXrX/9aN954ozp37lxrWQvc/OIXv9BDDz0kayMHAggggAACCCCAAAIIIIAAAgggUJuA54I3N910k95++2317t1bXbp00eeff15b3/XUU0/pb3/7m7p3766HH35YHTt2rCj773//W4888oi2bNmiSCSimTNnatCgQRWv1/agsLBQ0Wi0tped8zk5OSooKJAFiHbdddc6y/IiAggggAACCCCAAAIIIIAAAgi0bQFPLpvaYYcd9OWXX+rdd9+tdXQXL16sa665Rh9++KE+/fRTJ0BTufBll13mBGx+/vOfVz7d4Mex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fTX0OOuss9S+ffs6L7PZNrYEjEz0dTLxIgIIIIAAAggggAACCCCAAAIISMro4M0ee+yhp59+2lUDOX78+HrbYztfWT4cDgQQQAABBBBAAAEEEEAAAQQQQKA+gYzYbaq+TvA6AggggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCDw/+3dW4wW1R0A8D8uclFuAgILckeugpdasWpTWy+1iYnRRJ+M9kFj1Nik6oN9atPWJk0fTaz60FRfmqjR6IONTdpUrdZIWVjwLhd3uRSoIBdhF1RozpRvuizwfcvsMu7O/k6yfPPNzDlnzm82Ox//71wIECBAgACBSggI3lTiNmoEAQIECBAgQIAAAQIECBAgUFUBwZuq3lntIkCAAAECBAgQIECAAAECBCohIHhTiduoEQQIECBAgAABAgQIECBAgEBVBQRvqnpntYsAAQIECBAgQIAAAQIECBCohIDgTSVuo0YQIECAAAECBAgQIECAAAECVRUQvKnqndUuAgQIECBAgAABAgQIECBAoBICgjeVuI0aQYAAAQIECBAgQIAAAQIECFRVQPCmqndWuwgQIECAAAECBAgQIECAAIFKCAjeVOI2agQBAgQIECBAgAABAgQIECBQVQHBm6reWe0iQIAAAQIECBAgQIAAAQIEKiEgeFOJ26gRBAgQIECAAAECBAgQIECAQFUFBG+qeme1iwABAgQIECBAgAABAgQIEKiEgOBNJW6jRhAgQIAAAQIECBAgQIAAAQJVFRC8qeqd1S4CBAgQIECAAAECBAgQIECgEgKCN5W4jRpBgAABAgQIECBAgAABAgQIVFVA8Kaqd1a7CBAgQIAAAQIECBAgQIAAgUoICN5U4jZqBAECBAgQIECAAAECBAgQIFBVgaFVbVhV2nXXXXfFihUr8uZcfvnl8eSTT+bvbRAgQIAAAQIECBAgQIAAAQLVFhC86ef394wzzog///nP+VUOHz4832608fXXX0dnZ2eMGDEimpqaGp3uOAECBAgQIECAAAECBAgQINAPBQRv+uFN6XpJKegyadKk2L9/f4waNarHQZgjR47EO//8Z2zZvDmam5vj8quu6nHervXbJkCAAAECBAgQIECAAAECBL5ZAcGbb9a/Ye379u2Ln/zkJzFhwoRYs2ZN3HHHHXHzzTdH6pFTL+3auTO2btmSnbJjx4748ssvBW/qgTlGgAABAgQIEBjkAunLv/SZ8cwzz4whQ4acksbBzs44c9iwhp9RT6nQfnRyUZuU79ChQzEsmTb4/N6PmutSCBDohwKCN/3wpnS9pJ/97Gcxf/787CG6YcOGuPLKK2PZsmVx/vnndz3tmO30kPh0w4ZIrylNmDgxhg0bdsw53hAgQIAAAQIECBCoCdQ+P3784Yex/DvfiXHjx9cONXxNwYk3X389y3PBsmWV+9x5+PDh2Lh+fXzy8cdx1Xe/G6PGjGloUjshBcNe++tfY3JzcyxZujT7MvVUA2O1srwSIDC4Bep33xjcNv2i9UuWLMkCN+li5syZE+PHj49Vq1bVvbbOjo7YvGlTfs6cuXMr+y1I3kgbBAgQIECAAAEChQRS4GbVypWxcsWKSL2+V7W0xFdffdWjslLed9esiV27dsWGdevitb/9Leu906PMA+SkFW+/nfl8cdQmzSvZk3T466+zfHv37o1PPvoo3vj73yMFgiQCBAgUERC8KaJWUp70EPzTn/6U15YeFOmBOnbs2HzfiTY2tbfnD82RZ50VzVOnnug0+wgQIECAAAECBAhkQ6SmTpuWD5Xa+dlnWSCm1ov7ZETpeJpfMfX4rqX0uXPo0Gp17p963nm5zfZt26Lt009rza372t7WFpvb2/NzknGjqQ/yk20QIECgm4DgTTeQk73dvXt3vP322/Haa69FGr7U6GF2snJOZX+apPiXv/xltLS0ZBMWP/HEEzFjxoxIy4WfLKVvST7duDE/PGvOnGiq2AM0b5wNAgQIECBAgACBPhGYPGVKzJw9Oy/rw/ffj9RjpF7q6OiI1StX5r1JJk6cGAsWLcoDHfXyDqRj0847L6ZNn55f8ru2vk+xAAAR2klEQVStrXHgwIH8/Yk29u3dG2tbW/P/M6RhU/Pmz6+czYnabh8BAqdHQPCmgeuePXvi/vvvj+nTp8fVV18dN954YyxcuDBuuOGGhn+0GxTd8PDUqVPjj3/8Y7z66qvx6KOPZt9ivPLKK3V73uzYvj1/0KZvPWbMnNmwHicQIECAAAECBAgMboE0D8sFS5fG2aNGZRBpHpvVLS15YKa7TvrCsOVf/4rOzs7sUJrk+FvLl+fD/bufP5Dfp94yyy66KEaMGJE1I9m0rlpV12blO+/EwYMHs/NHjhwZF3/rWxYPGci/BK6dQD8QqFafxj4GTX9w77nnnnjxxRezFZ9uv/32OPvss6O9vT1ef/31PJLex9XmxaVlwpcvX5795DvrbKTeQBtTt9WjExVPaW7Olhevk8UhAgQIECBAgAABApnAiJEjY+mFF8bbb76Zvf/P9u3RtnFjnNel10k6kD5zbli/PrZt3fo/uSFDsnyjjgZ+/rezWv+mAMySZcsiBWVS2rp5czZkbPqMGcc0NNmkSZ8/++yzfP+Fl1yS/R8i32GDAAECBQQEb+qg/eMf/4hnn302Hnzwwfjtb3+bj1GdN29e/OAHP6iT8+SHskh9a2s2d01aNSp1L+2rtP+LL/7/EE0THM+bp2tmX+EqhwABAgQIECAwCATSvCzTZ86MTW1tWWvTZMTnTJhwTMt3f/55vLd2bb4vBTDSUP0qr6KU2jZz1qzYsmlTbPv3v7MA1prVq4/7LP/Zjh3x0Qcf5Daz5849LviVH7RBgACBUxAwbKoO1l/+8pfsD/Pdd9+dB27qnN7w0NatW+Ouu+7KZuOfMmVK/OY3v4nnnnuuYb6enFDrdZNeUxo3bly2RHhP8jqHAAECBAgQIECAQBJIQ4RS75vaEKHUE33t6tV5j/P0WfP9d9+Nr4+uRpWGWaUhRYNhIt7a8Knhw4dnvywdBw5kK23VPn+nne+uXRu11ajGjhsXael0iQABAn0hIHhTR3HLli3Z2NQ0SXBvUxoX/NBDD2Xz5vzwhz+MxYsXxyOPPJJNSLx58+beFh+pR0/tG5JUWDZRcVNTr8tVAAECBAgQIECAwOASOOuss44JOqQVlrpO0Js+d6aUeqNccumlkYYUDZY0esyYWLh4cd7ctra2Y+a+OXR0nps0/UGa56YW6Mkz2CBAgEBBAcGbOnDpG4cUOa9NNlbn1IaHNm3aFC+88EJce+21+bmTJk3KVo96+umn831FN9KY49pDNT0kzuuDgFPRa5GPAAECBAgQIEBgYAukRS/SEtm1dPjw4dpm/jp/0aJIq1QNppQCVnPPPz8mnnvu/5p95EjeK6mrw+ILLtALviuIbQIEei0geFOH8MILL8yOprlveptWHZ2R/pxzzjmmqObm5njrrbdO+Ef/mBPrvEkP0zRpXC2lwE2tq2ttn1cCBAgQIECAAAECPRU4o6kpGw6VVpE6UUrzNi5ctOhEhyq/Lw2fSpMQn8wmBbQsC175XwMNJFC6gOBNHfKbbropm4Ts5z//eaT5amopjWvduXNnpKFQPU07duyIYcOGHTceOK1etWvXrlMqq3udn+/aFeknpfQwmTV7dvdTvCdAgAABAgQIECBwSgLpc+ripUuPy5OCFhdfeulJgxfHZajgjvSF7PyFC49rWfoC9aJLLrEs+HEydhAg0FsBq03VEZw+fXo89dRT8eMf/zguuuiiuOGGG2Ls2LHx8ccfZ8GcN998M8aMGVOnhP8f2rt37//fdNlKwZaOjo748ssv6z4AU6Dog/feizS7f/f0xRdf5GNtU1fOta2tlZ7tv3v7vSdAgAABAgQIEDg9AqmH95AzzogjXYZNNQ0dGq2rVg36z5tpeoX02bvrhMWpx9LqlpbTczOUSoDAaREYOnRofOeqq05L2X1ZqOBNHc30x/jmm2+O2bNnR5qXJg19SkGUOXPmxL333htpMrdTSV3/sNfypQdimtAsBXHqpTRRXNdlB092bnqI7Ni+/WSH7SdAgAABAgQIECDQK4HOjo5IP9LxAgf274/0IxEgMHAE0giZgZAEb3pwl1Kvm/TTm5S6VqbeNd0ne0uz9acgUKNfmBEjR2YBnu75e3NN8hIgQIAAAQIECBAgQIAAAQL9X0DwpqR7lJYGT712du/eHaNHj85rTXPhzJ07t2HPm/Hjx8fV114b+/bsyfOm8t5buzZbJjztnDFrVkyaPDmG5GfYIECAAAECBAgQINB7gSMR2SqsQ5uael9YxUo4nFacOtqbvmJN0xwCg0Kg0SiY/oIgeFPSnVi6dGnMmzcv1q9fH2kunZTSEuTt7e3xyCOPNLyKNIQrBXDSTy2l5cFTz52U0ji9RYsXx+gezsFTK8MrAQIECBAgQIAAgZ4IpCkA0mfP9B+dk6201JNyqnZOcklTF6QvVms26bO7RIAAgb4UqD/RSl/WNMjLShMb//rXv44nn3wym6A4cbz66qsxZcqUSKtaFUnr1q3Ls01pbha4yTVsECBAgAABAgQI9KVACto89thjMWPGjPjVr37Vl0UP+LKef/75+N73vhfXXXddXHHFFfGLX/wiOjs7B3y7NIAAgf4loOdNiffj1ltvjQkTJsTjjz8eI0eOzGp+5plnsl4zp3oZ+/bujf90mZh4zrx5p1qE8wkQIECAAAECBAg0FEgrrf70pz/Nepbs2bMn62XSMNMgOeGVV16Ju+++O1vc5Prrr49NmzZlX8zu27cvfve731kyfJD8HmgmgTIEhhw50RJIZdSsjsIC6ZaluW4+fP/9rIxx48Zl8+GkoVMSAQIECBAgQIAAgb4USKuujho1KpYsWRKXXXZZPPDAA/Hoo4/2ZRUDsqwDBw7E97///Zg8eXK8+OKLeaDm97//fTz88MPR0tISCxYsGJBtc9EECPQ/AcOm+t89aXhFadWqto0b8/Nmz52bPyzynTYIECBAgAABAgQI9IHAHXfcEbfcckvDBTb6oKoBVUSawmDlypVxzTXXHPNZPPXASYGdl156aUC1x8USINC/BXTV6N/354RX9++tW/N5c9JkcdNnzAiTop2Qyk4CBAgQIECAAIFeCviceWLAtWvXZkPI0sqxXVOa0zJNkdDa2tp1t20CBAj0SkDPm17xlZ/58OHDsXH9+rzi6TNnxrDhw/P3NggQIECAAAECBAgQOP0C24/OP5mmMOia0opTabGS2vGux2wTIECgqIDgTVG5byjf7s8/j107d2a1pwfDrDlzvqErUS0BAgQIECBAgACBwSuQlgZPKX0m756ampqyCZ677/eeAAECRQWO/0tTtCT5ShFID4nU+yalieeeG90j/aVchEoIECBAgAABAgQIDHKBsWPHZgJpfpuuKS0u0tHREbXjXY/ZJkCAQFEBc94UlfuG8qWAzbKLL469e/bEgkWLThjp/4YuTbUECBAgQIAAAQIEBo1AbSWpLVu2HNPm/fv3x+7du600dYyKNwQI9FZAz5veCpacP3XLnL9gQVx62WUxevTokmtXHQECBAgQIECAAAECSSAtnT5t2rRYsWJFpN42tZTep3TdddfVdnklQIBArwUEb3pNqAACBAgQIECAAAECBAabwMSJE+POO++Ml19+ObZt25Y1P01x8Ic//CGWL18eV1555WAj0V4CBE6jwJAjXcPEp7EiRRMgQIAAAQIECBAgMPAE2tvb47777os0HOiNN96I2bNnZ0OCfvSjH8X9998/8BrUh1d88ODBLIDzySefxG233Zb1wlm3bl08++yzMX/+/D6sSVEECAx2AcGbwf4boP0ECBAgQIAAAQIE6ggcOnQo2trajjsjTcg7adKk4/YPth3JZ82aNfHRRx9lHt/+9rctKjLYfgm0l0AJAoI3JSCrggABAgQIECBAgAABAgQIECBQVMCcN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChB4L+DoW19/ZFRAwAAAABJRU5ErkJggg==" - } - }, + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -51,32 +47,83 @@ " Antes de tudo Alice possui um qubit $|\\psi\\rangle = \\alpha|0\\rangle + \\beta|1\\rangle$ a qual deseja teletransportar para Bob. \n", " \n", " Então mais dois quibits emaranhados são colocados no sistema de forma que o estado inicial é composto por três qubits da seguinte forma: $|\\Psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle$ aplicando ao circuito\n", - " $(C_not\\otimes I)(H\\otimes I)$ afim de obtermos o estado $|\\Phi+\\rangle$ (ou qualquer outro estado vetor da base não-canonica de Bell) para realizarmos a transmição do qubit de interesse.\n", + " $(C_not\\otimes I)(H\\otimes I)$ afim de obtermos o estado $|\\Phi+\\rangle$ (ou qualquer outro estado vetor da base não-canonica de Bell a depender dos bits de entrada) para realizarmos a transmição do qubit de interesse.\n", + " \n", + "os bits de entrada e os elementos da base não-canonica de Bells que geram:\n", + "\n", + "$$|00\\rangle \\rightarrow |\\Phi+\\rangle, |01\\rangle \\rightarrow |\\Psi+\\rangle, |10\\rangle \\rightarrow |\\Phi-\\rangle,|11\\rangle \\rightarrow |\\Psi-\\rangle$$\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Gerando a base não-canônica de Bell:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "$$|\\varphi_0\\rangle = |\\psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle = (\\alpha|0\\rangle + \\beta|1\\rangle)\\otimes|00\\rangle$$\n", "$$|\\varphi_1\\rangle = |\\psi\\rangle\\otimes\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\otimes|0\\rangle$$\n", "$$|\\varphi_2\\rangle = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |10\\rangle}{\\sqrt{2}} = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}} $$ \n", - "$$|\\varphi_2\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|00\\rangle + |11\\rangle)}{\\sqrt{2}} = |\\psi\\rangle\\otimes|\\Phi+\\rangle$$\n", + "$$|\\varphi_2\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|00\\rangle + |11\\rangle)}{\\sqrt{2}} = |\\psi\\rangle\\otimes|\\Phi+\\rangle$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "Dessa forma Alice controla os dois primeiros bits enquanto Bob apenas o último. A parti daí Alice usa o processo de decondificação dessa forma o qubit a ser transmitido e a metade emaranhada que ela possui podem ser combinadas. Para tal ela tem implementado o seguinte circuito quântico: $(C_not\\otimes I)$ seguido por $(H\\otimes I\\otimes I)$,\n", - "sendo assim $(H\\otimes I\\otimes I)(C_not\\otimes I)(|\\psi\\rangle\\otimes|\\Phi+\\rangle)$ Ao passar pelo circuito teremos:\n", + "sendo assim $(H\\otimes I\\otimes I)(C_not\\otimes I)(|\\psi\\rangle\\otimes|\\Phi+\\rangle)$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + " Ao passar pelo circuito teremos:\n", "\n", "$$|\\varphi_3\\rangle = \\frac{\\alpha(|0\\rangle + |1\\rangle)(|00\\rangle + |11\\rangle) + \\beta(|0\\rangle - |1\\rangle)(|10\\rangle + |01\\rangle)}{2}$$\n", "$$|\\varphi_4\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|10\\rangle + |01\\rangle)}{2}$$\n", "$$|\\varphi_4\\rangle = \\frac{\\alpha|000\\rangle + |011\\rangle + |100\\rangle + |111\\rangle + \\beta|010\\rangle + |001\\rangle + -|110\\rangle + |101\\rangle }{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{|00\\rangle(\\alpha|0\\rangle + \\beta|1\\rangle) + |01\\rangle(\\beta|1\\rangle + \\alpha|0\\rangle) + |10\\rangle(\\alpha|0\\rangle - \\beta|1\\rangle) + |11\\rangle(-\\beta|0\\rangle + \\alpha|1\\rangle)}{2}$$\n", - "\n", - "\n", - "O circuito completo:\n", - "\n", - "\n", - "![image.png](attachment:image.png)\n", + "$$|\\varphi_4\\rangle = \\frac{|00\\rangle(\\alpha|0\\rangle + \\beta|1\\rangle) + |01\\rangle(\\beta|1\\rangle + \\alpha|0\\rangle) + |10\\rangle(\\alpha|0\\rangle - \\beta|1\\rangle) + |11\\rangle(-\\beta|0\\rangle + \\alpha|1\\rangle)}{2}$$" + ] + }, + { + "attachments": { + "image.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Circuito Completo:\n", "\n", + "![image.png](attachment:image.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "Neste momento os dois qubits de Alice são medidos e então os três qubits colapsão para um das quatro possibilidades. Supondo que \n", "o bit colapsado seja $|01\\rangle$ temos que lidar com dois problemas:\n", "\n", "(a) Apesar de Alice saber o estado Bob não sabe.
\n", "(b) Bob $\\alpha|0\\rangle - \\beta|1\\rangle$, mas não o qubit desejado.
\n", "\n", - "A fim de resolver este problema Alice envia uma copia de dois bits que usa essa informação para alcançar o estado desejado.\n", + "A fim de resolver este problema Alice envia uma copia de dois bits que usa essa informação para alcançar o estado desejado." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "Rebendo $|01\\rangle$ então ele sabe o qubit está no estado:\n", "\n", " \n", @@ -87,7 +134,13 @@ " -\\beta \\\\\n", "\\end{vmatrix}\n", "\\end{equation*};\n", - "$$\n", + "$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "Após este vetor agir sobre a seguinte base \n", "$\n", "\\begin{vmatrix}\n", @@ -118,9 +171,24 @@ "$\n", "$\\alpha|0\\rangle + \\beta|1\\rangle = |\\psi\\rangle$\n", "\n", - "E agora Bob tem a informação que estava com Alice.
\n", + "E agora Bob tem a informação que estava com Alice.
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Bit recebido:**\n", + "1. $|00\\rangle$\n", + "2. $|01\\rangle$\n", + "3. $|10\\rangle$\n", + "4. $|11\\rangle$\n", + "
\n", + "
\n", + "\n", "**Matriz de reconstrução de Bob:** \n", "
\n", + "
\n", "1.\n", "$\n", "\\begin{vmatrix}\n", @@ -151,14 +219,13 @@ " 0 & 1 \\\\ \n", "-1 & 0 \\\\\n", "\\end{vmatrix}\n", - "$\n", - "
\n", - "
\n", - "**Bit recebido:**\n", - "1. $|00\\rangle$\n", - "2. $|01\\rangle$\n", - "3. $|10\\rangle$\n", - "4. $|11\\rangle$\n", + "$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", "Pontos a serem observados:\n", "\n", @@ -174,69 +241,260 @@ "### Simulação do circuito:" ] }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import qiskit as qkit \n", + "import time\n", + "from qiskit import Aer\n", + "from qiskit.tools.visualization import circuit_drawer\n", + "from qiskit.tools.visualization import plot_histogram\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Iniciando os registradores quânticos:" + ] + }, { "cell_type": "code", "execution_count": 3, "metadata": {}, + "outputs": [], + "source": [ + "rq = qkit.QuantumRegister(size=3)\n", + "rc = qkit.ClassicalRegister(size=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Implementando o Circuito Quântico. O qubit a ser teletransportado se encontra no registra quântico na posição rq[0]." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Inicializando o circuito e criando o estado de Bell $|\\Phi+\\rangle$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "teleport = qkit.QuantumCircuit(rq, rc)\n", + "teleport.h(rq[1])\n", + "teleport.cx(rq[1], rq[2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Combinando a parte a ser transmitida com a parte emaranhada de Alice" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, "outputs": [ { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 3)", - "output_type": "error", - "traceback": [ - "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m3\u001b[0m\n\u001b[1;33m OPENQASM 2.0;\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: Unable to compile latex. Is `pdflatex` installed? Skipping latex circuit drawing...\n" ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "# Name of Experiment: Experiment #Teleportation v1\n", - "\n", - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", "\n", "\n", - "qreg q[2];\n", - "creg c[2];\n", - "\n", - "h q[1];\n", - "cx q[2],q[1];\n", - "cx q[1],q[0];\n", - "h q[0];\n", - "measure q[1] -> c[1];\n", - "measure q[0] -> c[0];\n" + "teleport.cx(rq[0], rq[1])\n", + "teleport.h(rq[0])\n", + "teleport.measure(rq[0], rc[0])\n", + "teleport.measure(rq[1], rc[1])\n", + "circuit_drawer(teleport)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simulando o Circuito em um computador clássico" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'qiskit'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mqiskit\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mqskit\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'qiskit'" + "name": "stdout", + "output_type": "stream", + "text": [ + ">\n", + "Faltam 0 segundos\n", + ">\n", + "Faltam 1 segundos\n", + ">\n", + "Faltam 2 segundos\n", + ">\n", + "Faltam 3 segundos\n", + ">\n", + "Faltam 4 segundos\n", + ">\n", + "Faltam 5 segundos\n", + ">\n", + "Faltam 6 segundos\n", + ">\n", + "Faltam 7 segundos\n", + ">\n", + "Faltam 8 segundos\n", + ">\n", + "Faltam 9 segundos\n", + ">\n", + "Faltam 10 segundos\n", + ">\n", + "Faltam 11 segundos\n", + ">\n", + "Faltam 12 segundos\n", + ">\n", + "Faltam 13 segundos\n", + ">\n", + "Faltam 14 segundos\n", + ">\n", + "Faltam 15 segundos\n", + ">\n", + "Faltam 16 segundos\n", + ">\n", + "Faltam 17 segundos\n", + ">\n", + "Faltam 18 segundos\n", + ">\n", + "Faltam 19 segundos\n", + ">\n", + "Faltam 20 segundos\n", + ">\n", + "Faltam 21 segundos\n", + ">\n", + "Faltam 22 segundos\n", + ">\n", + "Faltam 23 segundos\n", + ">\n", + "Faltam 24 segundos\n", + ">\n", + "Faltam 25 segundos\n", + ">\n", + "Faltam 26 segundos\n", + ">\n", + "Faltam 27 segundos\n", + ">\n", + "Faltam 28 segundos\n", + ">\n", + "Faltam 29 segundos\n", + ">\n", + "Faltam 30 segundos\n", + ">\n", + "Faltam 31 segundos\n", + ">\n", + "Faltam 32 segundos\n", + ">\n", + "Faltam 33 segundos\n", + ">\n", + "Faltam 34 segundos\n", + ">\n", + "Faltam 35 segundos\n", + ">\n", + "Faltam 36 segundos\n", + ">\n", + "Faltam 37 segundos\n", + ">\n", + "Faltam 38 segundos\n", + ">\n", + "Faltam 39 segundos\n", + ">\n", + "Faltam 40 segundos\n", + ">\n", + "Faltam 41 segundos\n", + ">\n", + "Faltam 42 segundos\n", + ">\n", + "Faltam 43 segundos\n", + ">\n", + "Faltam 44 segundos\n", + ">\n", + "Faltam 45 segundos\n", + ">\n", + "Faltam 46 segundos\n", + ">\n", + "Faltam 47 segundos\n", + ">\n", + "Faltam 48 segundos\n", + ">\n", + "Faltam 49 segundos\n" ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "import qiskit as qkit\n", - "from qiskit.tools.visualization import cirtcuit_drawer\n", - "from qiskit.tools.visualization import plot_histogram\n", - "import time\n", - "from qiskit import Aer\n", - "\n" + "\n", + "shots = 50\n", + "job = qkit.execute(teleport, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", + "k =0 \n", + "wait_time = 1 \n", + "while k < shots:\n", + " print(job.status)\n", + " print(\"Faltam {0} segundos\".format(k))\n", + " k = k + wait_time\n", + " time.sleep(wait_time)\n", + " \n", + "results_sim = job.result()\n", + "outputs_sim = results_sim.get_counts()\n", + "\n", + "plot_histogram(outputs_sim)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Inicializando os registradores quânticos e classicos:" + "Fonte:\n", + "Quantum Computing for Computer Scientists, Noson F. Yanofsky\n", + "\n", + "Rieffel, Eleanor G., and Wolfgang H. Polak. Quantum Computing : A Gentle Introduction, edited by William Gropp, and Ewing Lusk, MIT Press, 2011. ProQuest Ebook Central, https://ebookcentral.proquest.com/lib/ufrpe-ebooks/detail.action?docID=3339229. " ] }, { @@ -244,9 +502,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "rq = qkit.QuantumRegister(size=3)\n" - ] + "source": [] } ], "metadata": { From 5021e03cf9de4ca7ce8f853f152128c1243d42b4 Mon Sep 17 00:00:00 2001 From: Tiago de Lima <33109618+Tiagoblima@users.noreply.github.com> Date: Fri, 30 Nov 2018 11:06:13 -0200 Subject: [PATCH 06/49] Update superdense.ipynb --- superdense.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superdense.ipynb b/superdense.ipynb index 4f13ccf..287541d 100644 --- a/superdense.ipynb +++ b/superdense.ipynb @@ -181,7 +181,7 @@ "source": [ "\n", "shots = 50\n", - "job = qkit.execute(teleport, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", + "job = qkit.execute(superdense, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", "k =0 \n", "wait_time = 1 \n", "while k < shots:\n", From 01dc50c53f0739e603663e41dd9de51f23fb49ef Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Sun, 2 Dec 2018 13:26:38 -0300 Subject: [PATCH 07/49] Update --- superdense.ipynb | 144 ++++++++++++++++++++++++++++++++++++++----- teletransporte.ipynb | 5 +- 2 files changed, 130 insertions(+), 19 deletions(-) diff --git a/superdense.ipynb b/superdense.ipynb index 4f13ccf..e60ce22 100644 --- a/superdense.ipynb +++ b/superdense.ipynb @@ -100,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -120,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -130,17 +130,17 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, - "execution_count": 13, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -163,25 +163,130 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'teleport' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mshots\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m50\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mjob\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mqkit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mteleport\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbackend\u001b[0m\u001b[1;33m=\u001b[0m \u001b[0mAer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_backend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"qasm_simulator_py\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshots\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mshots\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mk\u001b[0m \u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mwait_time\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mNameError\u001b[0m: name 'teleport' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + ">\n", + "Faltam 0 segundos\n", + ">\n", + "Faltam 1 segundos\n", + ">\n", + "Faltam 2 segundos\n", + ">\n", + "Faltam 3 segundos\n", + ">\n", + "Faltam 4 segundos\n", + ">\n", + "Faltam 5 segundos\n", + ">\n", + "Faltam 6 segundos\n", + ">\n", + "Faltam 7 segundos\n", + ">\n", + "Faltam 8 segundos\n", + ">\n", + "Faltam 9 segundos\n", + ">\n", + "Faltam 10 segundos\n", + ">\n", + "Faltam 11 segundos\n", + ">\n", + "Faltam 12 segundos\n", + ">\n", + "Faltam 13 segundos\n", + ">\n", + "Faltam 14 segundos\n", + ">\n", + "Faltam 15 segundos\n", + ">\n", + "Faltam 16 segundos\n", + ">\n", + "Faltam 17 segundos\n", + ">\n", + "Faltam 18 segundos\n", + ">\n", + "Faltam 19 segundos\n", + ">\n", + "Faltam 20 segundos\n", + ">\n", + "Faltam 21 segundos\n", + ">\n", + "Faltam 22 segundos\n", + ">\n", + "Faltam 23 segundos\n", + ">\n", + "Faltam 24 segundos\n", + ">\n", + "Faltam 25 segundos\n", + ">\n", + "Faltam 26 segundos\n", + ">\n", + "Faltam 27 segundos\n", + ">\n", + "Faltam 28 segundos\n", + ">\n", + "Faltam 29 segundos\n", + ">\n", + "Faltam 30 segundos\n", + ">\n", + "Faltam 31 segundos\n", + ">\n", + "Faltam 32 segundos\n", + ">\n", + "Faltam 33 segundos\n", + ">\n", + "Faltam 34 segundos\n", + ">\n", + "Faltam 35 segundos\n", + ">\n", + "Faltam 36 segundos\n", + ">\n", + "Faltam 37 segundos\n", + ">\n", + "Faltam 38 segundos\n", + ">\n", + "Faltam 39 segundos\n", + ">\n", + "Faltam 40 segundos\n", + ">\n", + "Faltam 41 segundos\n", + ">\n", + "Faltam 42 segundos\n", + ">\n", + "Faltam 43 segundos\n", + ">\n", + "Faltam 44 segundos\n", + ">\n", + "Faltam 45 segundos\n", + ">\n", + "Faltam 46 segundos\n", + ">\n", + "Faltam 47 segundos\n", + ">\n", + "Faltam 48 segundos\n", + ">\n", + "Faltam 49 segundos\n" ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ "\n", "shots = 50\n", - "job = qkit.execute(teleport, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", + "job = qkit.execute(superdense, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", "k =0 \n", "wait_time = 1 \n", "while k < shots:\n", @@ -195,6 +300,13 @@ "\n", "plot_histogram(outputs_sim)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/teletransporte.ipynb b/teletransporte.ipynb index 68574f0..417848e 100644 --- a/teletransporte.ipynb +++ b/teletransporte.ipynb @@ -38,7 +38,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -112,7 +111,7 @@ "metadata": {}, "source": [ "Neste momento os dois qubits de Alice são medidos e então os três qubits colapsão para um das quatro possibilidades. Supondo que \n", - "o bit colapsado seja $|01\\rangle$ temos que lidar com dois problemas:\n", + "o bit colapsado seja $|10\\rangle$ temos que lidar com dois problemas:\n", "\n", "(a) Apesar de Alice saber o estado Bob não sabe.
\n", "(b) Bob $\\alpha|0\\rangle - \\beta|1\\rangle$, mas não o qubit desejado.
\n", @@ -229,7 +228,7 @@ "\n", "Pontos a serem observados:\n", "\n", - "1. Alice não possui mais o estado $|psi\\rangle$.\n", + "1. Alice não possui mais o estado $|\\psi\\rangle$.\n", "2. Os bits clássicos navegam em um canal clássico e é impossível que Bob chegue a informação sem que este bits sejam transmitidos.\n", "3. $\\alpha$ e $\\beta$ são números complexos arbritarios que satisfazem a equação $|\\alpha|^{2} + |\\beta|^{2} = 1$ podendo ter uma expansão infinito decimal porém toda essa informação. Contudo essa informação é passada na forma de qubit que quando colapsa quando passado para Bob e inutil quando medido.\n" ] From e104b40149a468b6dc0328a9f15d673a94106253 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Wed, 17 Jul 2019 19:43:18 -0300 Subject: [PATCH 08/49] =?UTF-8?q?Removendo=20pastas=20desnecess=C3=A1rias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../superdense-checkpoint.ipynb | 221 ------------- .../teletransporte-checkpoint.ipynb | 295 ------------------ 2 files changed, 516 deletions(-) delete mode 100644 .ipynb_checkpoints/superdense-checkpoint.ipynb delete mode 100644 .ipynb_checkpoints/teletransporte-checkpoint.ipynb diff --git a/.ipynb_checkpoints/superdense-checkpoint.ipynb b/.ipynb_checkpoints/superdense-checkpoint.ipynb deleted file mode 100644 index 4f13ccf..0000000 --- a/.ipynb_checkpoints/superdense-checkpoint.ipynb +++ /dev/null @@ -1,221 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Superdense\n", - "\n", - "**Definição:** Dense code usa um qubit compartilhado com um pars EPR para decondificar e transmitir dois bits clássicos.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " *Obs.:* EPR ou Einstein–Podolsky–Rosen paradox (EPR paradox) é um paradoxo que avalia que em certas circunstancias a medição do estado de A pode determinar com um precisão arbritária o estado de outro qubit B, mesmo a longas distâncias desde que estejam emaranhados.
Fonte: https://phys.org/news/2018-04-einstein-podolsky-rosen-paradox-many-particle.html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Como funciona?\n", - "\n", - "Agora iremos supor que Alice e Bob querem se comunicar e que Alice tem o primeiro qubit e Bob o segundo.\n", - "\n", - "
1.Inicialmente irimos ter dois bits emaranhados:\n", - "\n", - "$|\\psi_0\\rangle = \\frac{1}{\\sqrt{2}}(|0_A0_B\\rangle + |1_A1_B)$\n", - "\n", - "Sabendo disso, devemos ter em mente que Alice só pode transforma o qubit dela e Bob só poderá transformar o qubit dele. Isso poderá ser feito da seguinte forma: Se alice tem n qubits e Bob m qubits, temos que a transformação realizada por alice será $I^{m}\\otimes U$, onde U é a matrix de transformação para n qubits, enquanto a de Bob $I^n\\otimes U$ onde U é a matrix de transformação para m qubits." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### O que é feito?\n", - "\n", - "\n", - "Alice que transmiti dois bits que representam valores entre 0 e 3 para isso ele realiza uma transformação no seu qubit $|\\psi_0\\rangle$.\n", - "\n", - "Valor______Transformação_______Novo Estado\n", - "
\n", - "\n", - "\n", - "0 || $|\\psi_0\\rangle = (I\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle)$
\n", - "1 || $|\\psi_0\\rangle = (X \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle)$
\n", - "2 || $|\\psi_0\\rangle = (Z \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle)$
\n", - "3 || $|\\psi_0\\rangle = (Y\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle)$
\n", - "\n", - "Depois disso Bob usa C_not e nos dois bits emaranhados e depois apliaca Hadamard: \n", - "
\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle) \\\\\n", - "\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle) \\\\ \n", - "\\end{cases} $\n", - "\n", - "$C_not$\n", - "$\\rightarrow$\n", - "\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle + |10\\rangle) \\\\\n", - "\\frac{1}{\\sqrt{2}}(|11\\rangle - |01\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle - |10\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|11\\rangle + |01\\rangle) \\\\ \n", - "\\end{cases} $\n", - "=\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|0\\rangle + |1\\rangle)\\otimes|0\\rangle \\\\\n", - "\\frac{1}{\\sqrt{2}}(|1\\rangle - |0\\rangle)\\otimes|1\\rangle \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|0\\rangle - |1\\rangle)\\otimes|0\\rangle \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|1\\rangle + |0\\rangle)\\otimes|1\\rangle \\\\ \n", - "\\end{cases} $\n", - "\n", - "$H\\otimes I$ \n", - "$\\rightarrow$\n", - "\n", - "$ \\begin{cases}\n", - " |00\\rangle \\\\\n", - " |01\\rangle \\\\ \n", - " |10\\rangle \\\\ \n", - " |11\\rangle \\\\ \n", - "\\end{cases} $\n", - "\n", - "\n", - "Ao final do processo Bob terá os mesmo bits que foram enviados por Alice." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exemplo: Supondo que o bit represente o valor 1" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "import qiskit as qkit \n", - "import time\n", - "from qiskit import Aer\n", - "from qiskit.tools.visualization import circuit_drawer\n", - "from qiskit.tools.visualization import plot_histogram\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Iniciando os registradores quânticos e clássicos" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "rq = qkit.QuantumRegister(size=2)\n", - "rc = qkit.ClassicalRegister(size=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "superdense = qkit.QuantumCircuit(rq, rc)\n", - "\n", - "\n", - "superdense.h(rq[0])\n", - "superdense.cx(rq[0], rq[1])\n", - "\n", - "superdense.x(rq[0])\n", - "\n", - "superdense.cx(rq[0], rq[1])\n", - "superdense.h(rq[0])\n", - "superdense.measure(rq[0], rc[0])\n", - "superdense.measure(rq[1], rc[1])\n", - "circuit_drawer(superdense)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'teleport' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mshots\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m50\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mjob\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mqkit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mteleport\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbackend\u001b[0m\u001b[1;33m=\u001b[0m \u001b[0mAer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_backend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"qasm_simulator_py\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshots\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mshots\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mk\u001b[0m \u001b[1;33m=\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mwait_time\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mNameError\u001b[0m: name 'teleport' is not defined" - ] - } - ], - "source": [ - "\n", - "shots = 50\n", - "job = qkit.execute(teleport, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", - "k =0 \n", - "wait_time = 1 \n", - "while k < shots:\n", - " print(job.status)\n", - " print(\"Faltam {0} segundos\".format(k))\n", - " k = k + wait_time\n", - " time.sleep(wait_time)\n", - " \n", - "results_sim = job.result()\n", - "outputs_sim = results_sim.get_counts()\n", - "\n", - "plot_histogram(outputs_sim)" - ] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/.ipynb_checkpoints/teletransporte-checkpoint.ipynb b/.ipynb_checkpoints/teletransporte-checkpoint.ipynb deleted file mode 100644 index 753a7fd..0000000 --- a/.ipynb_checkpoints/teletransporte-checkpoint.ipynb +++ /dev/null @@ -1,295 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Teletransporte\n", - "\n", - "**Definição:** Teletransporte quântico é o processo pela qualum estado arbritário de qubits é transferido de uma localização para outra." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Em que se basea: \n", - "\n", - "Baseado no teorema da não-clonagem de que move bits quânticos é possível, porém copia-los é impossível. O algoritmo de teletransporte vai trabalhar com o emaranhamento de dois qubits um utilizado por um lado da comunicação e o outro bit pelo outro lado. Neste caso chamaremos uma pessoa de Alice e outra de Bob.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ferramentas necessárias: \n", - "\n", - "Para darmos procegimento a ideia de teletransportar informações através de bits quânticos, precisamos saber que mudanças de bases de qubits canonicais e não canonicais pode ser últil. No nosso caso uma utilizaremos uma base canonical com quatro dimensões. Como mostrado a seguir:\n", - "\n", - "**Base canonica:** $\\{|0_A0_B \\rangle, |0_A1_B\\rangle, |1_A0_B\\rangle, |1_A1_B\\rangle \\}$\n", - "
Enquanto isso uma base canonica é a chamada **Bell basis** que consiste em 4 vetores:\n", - " \n", - " $|\\Psi+\\rangle = \\frac{|0_A1_B \\rangle + |1_A0_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Psi-\\rangle = \\frac{|0_A1_B \\rangle - |1_A0_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Phi+\\rangle = \\frac{|0_A0_B \\rangle + |1_A1_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Phi-\\rangle = \\frac{|0_A0_B \\rangle - |1_A1_B\\rangle}{\\sqrt{2}}$
\n", - " \n" - ] - }, - { - "attachments": { - "image.png": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABG8AAAGkCAYAAACPRAghAAAgAElEQVR4AezdB3RcxdnG8WebmiX3btwbtsF0jDHG9NBCh0AghNACgUDohBJ6EsqXBAIESEhCj8Em9BIgdDC2AdsY3HDDvduyVbd9571mFZWVtJJW0t2r/z1HR7t3586d+c1alt6deccXj8fj4kAAAQQQQAABBBBAAAEEEEAAAQQQcKWA35WtolEIIIAAAggggAACCCCAAAIIIIAAAo4AwRveCAgggAACCCCAAAIIIIAAAggggICLBQjeuHhwaBoCCCCAAAIIIIAAAggggAACCCBA8Ib3AAIIIIAAAggggAACCCCAAAIIIOBiAYI3Lh4cmoYAAggggAACCCCAAAIIIIAAAggQvOE9gAACCCCAAAIIIIAAAggggAACCLhYgOCNiweHpiGAAAIIIIAAAggggAACCCCAAAIEb3gPIIAAAggggAACCCCAAAIIIIAAAi4WIHjj4sGhaQgggAACCCCAAAIIIIAAAggggADBG94DCCCAAAIIIIAAAggggAACCCCAgIsFCN64eHBoGgIIIIAAAggggAACCCCAAAIIIEDwhvcAAggggAACCCCAAAIIIIAAAggg4GIBgjcuHhyahgACCCCAAAIIIIAAAggggAACCBC84T2AAAIIIIAAAggggAACCCCAAAIIuFiA4I2LB4emIYAAAggggAACCCCAAAIIIIAAAgRveA8ggAACCCCAAAIIIIAAAggggAACLhYgeOPiwaFpCCCAAAIIIIAAAggggAACCCCAAMEb3gMIIIAAAggggAACCCCAAAIIIICAiwUI3rh4cGgaAggggAACCCCAAAIIIIAAAgggQPCG9wACCCCAAAIIIIAAAggggAACCCDgYgGCNy4eHJqGAAIIIIAAAggggAACCCCAAAIIELzhPYAAAggggAACCCCAAAIIIIAAAgi4WIDgjYsHh6YhgAACCCCAAAIIIIAAAggggAACBG94DyCAAAIIIIAAAggggAACCCCAAAIuFiB44+LBoWkIIIAAAggggAACCCCAAAIIIIAAwRveAwgggAACCCCAAAIIIIAAAggggICLBQjeuHhwaBoCCCCAAAIIIIAAAggggAACCCBA8Ib3AAIIIIAAAggggAACCCCAAAIIIOBiAYI3Lh4cmoYAAggggAACCCCAAAII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owDBmzRiUhUCCCCAAAIIIIAAAggggAACCCCQbgGCN+kWpT4EEEAAAQQQQAABBBBAAAEEEEAgjQIEb9KISVUIIIAAAggggAACCCCAAAIIIIBAugUI3qRblPoQQAABBBBAAAEEEEAAAQQQQACBNAoQvEkjJlUhgAACCCCAAAIIIIAAAggggAAC6RYgeJNuUepDAAEEEEAAAQQQQAABBBBAAAEE0ihA8CaNmFSFAAIIIIAAAggggAACCCCAAAIIpFuA4E26RakPAQQQQAABBBBAAAEEEEAAAQQQSKMAwZs0YlIVAggggAACCCCAAAIIIIAAAgggkG4BgjfpFqU+BBBAAAEEEEAAAQQQQAABBBBAII0CBG/SiElVCCCAAAIIIIAAAggggAACCCCAQLoFCN6kWfS///2vysrK6qw1HA7rzTffVDwer7McLyKAAAIIIIAAAggggAACCCCAAAJBrxFce+21mjp1qtOtjh076vnnn6/oYjQa1bx58/T1119r7dq1ysnJ0ejRo7XHHnvI768ax3rooYf07LPPOtfm5ubqr3/9q3r37l1RV20PnnrqKe28887q1q1bbUWcoM3DDz+svffeW506daq1HC8ggAACCCCAAAIIIIAAAggggAACngvezJo1SzNnztSvfvUr5efnVxnhs88+W48//rhCoZDzWnFxsTNLZuzYsc75IUOGVJQfOnSoDj74YL3zzjv64IMPVFpaWvFaUx9kZWXp0EMP1RtvvKHTTjutqdVxPQIIIIAAAggggAACCCCAAAIIeFjAc8EbG6vOnTvr+uuvrzGbxgImxxxzjDPbpl27diopKZHNlLntttt00UUXOcEUn8/nDLcFbuzLljhNmzatUW+BWCzmzAKy4I8Fkmw51RlnnOHMyrF2XH311frRj35Uo52NuhkXIYAAAggggAACCCCAAAIIIICAJwUyJnhj+WHWrFmjb7/9Vh06dNCoUaNky6AsAJOXl6dgsP6uWOCk+nHjjTfqrbfe0scff6zNmzendRnTe++9pz/+8Y+aOHGi08Yvv/zSCd7Y8z59+jgBnQULFmj48OHVm8VzBBBAAAEEEEAAAQQQQAABBBBAwBGomujFpSg2Y+Xmm2/W4MGDddhhh2nffffVgQce6OSh6dmzp95///0mtdyWMdlSKvueriMSiei6667TmWee6QRurN5dd93Vefz00087tznxxBOr5ORJ172pBwEEEEAAAQQQQAABBBBAAAEEvCOQEcEbSxZ8xx136JRTTtGnn36qTz75RMOGDdNNN93kzLyx5UmpHjaDx2brFBUVacOGDXrwwQed+s455xzZUqp0HTZDaP78+Ro4cGBFlbYkywJQL774onNun332cZZkNaT9FZXxAAEEEEAAAQQQQAABBBBAAAEE2oRA/WuNWpnBkgrfc889zg5OjzzyiDNDxpr05z//2dk56sMPP2xQC8vLy3XEEUfIEhtv27bNudby4/z6179uUD31FV6+fLmTL8d2qqp82C5UtuOVHe3bt3fy71gwar/99qtczHn86quvOnXUeIETCCCAAAIIIIAAAgi0kIB9+BktK3PuZh862qx3fyDQQnd3/20sR2Yib6alY6i+i637e0ALEWjbArYC58gjj3Q9guuDN3PmzNGqVat07rnnVgRuTNW2+T7++OPV0OBNIBBw6rL8ObZd+Guvvab77rtPvXr10nnnnVfxg7epI7d161aniuo/vG151pYtW5ztwu2H/E9+8hPdfffdGjduXI1724yjwsLCpjaF6xFAAAEEEEAAAQQQaLSA5ZY8+fjjndyQsXhczz/3nNasXdvo+rx24blnnVWRfuGJxx/XFn5/99oQ0x+PC1hOXYI3aRhkW9pk0ex+/frVqC3ZuRqFqp2w/3wqJy62vDQ2UFdddZWTT2fAgAHVrmjcU5sxZJ9S2Ff1w/Lh2KcWFkiyxMWrV6+WnbPADgcCCCCAAAIIIIAAAggggAACCCBQWcD1M29sCpPNXiktLa3cbudxsnM1CtVzwqJsNvvlwgsv1PTp05Wu4I3NDLLATfV8NrZDlu2OZYEbO1555RX94Ac/SBq4GTt2rCwIxIEAAggggAACCCCAQGsJ+H0+JVIB+L7fhKO4pKS1muO6+yZ+r7eG7bnXXrI0DRwIIJA5AunMfducvXZ98MaCKfafhQVWzj///AoLC4zYuXQctkW4HRZwSdfRo0cPJ3hjyZErH7ZkqmvXrs4pC+RMnjxZ999/f+UiFY+vueaaisc8QAABBBBAAAEEEECgNQQi4bDe+c9/ZGkBEikIunz/+2xrtMdt93xh0iRnFr2165JLLlFBQYHbmkh7EEDAAwKu322qf//+sl2ZJk6cKMt/kzjmzp2rZ555JvG03u+29Ordd9+t+MFqF1gAaPbs2XrooYfUpUsX7bXXXvXWk2qBESNGOD+4N23aVOUSy98zZswY59zixYudMnZvDgQQQAABBBBAAAEEEEAAAQQQQCCZgOtn3lhSX9tt6qijjtL48eN1wgknyPLW2Hbbu+66q958881k/apxrqysTIceeqh69+6tUaNGKT8/X7Yj1JdffunM7HnggQdks2XSdXTu3NlZjmUBI7uv9cOWeX3xxRcVM21s1o31hwMBBBBAAAEEEEAAAQQQQAABBBCoTcD1M2+s4aNHj5Ztu3fcccfpq6++0tKlS/XHP/6xyjKq2jqYOG9Lr55++mknCGRBFKvD8t1cccUV+uijj3TaaacliqbluwVrLBmy7Wo1adIk2UyhW265xdnpymYS2VrYqVOnJt0iPC0NoBIEEEAAAQQQQAABBBBAAAEEEPCEgOtn3piyBUJsGdLf/va3Kugvv/xyleeJJ7Ye96mnnnJm1Jx00knOaVufe8oppzhfiXJ1fbcZMt98841mzZpVV7E6X7PZN48++qizNMuWS9ka2J49ezr9ee+995yZQzYDiAMBBBBAAAEEEEAAAQQQQAABBBCoTSAjgje1NT7Zedt6e+HChbr99tudPDaJ4E2ysnWde/vtt53Ai5UZOnRo0t2g6ro+8ZoFnnbeeefEU+e77UD13HPP6Ve/+lWV8zxBAAEEEEAAAQQQQAABBBBAAAEEqgtkfPDGthGvfFjyYUtE3NTjyiuv1OWXX15RTeUtACtOJnlgM2nqK2v5dyyB8uDBg5PUwCkEEEAAAQQQQAABBBBAAAEEEEDgfwIZHbyxBMafffaZhg0bVtGj+gInFQXreWBBoeqBoXoucV62XDz1XWdbktsSMJuVw4EAAggggAACCCCAAAIIIIAAAgjUJZDRwZuOHTtqzz33rKt/Lf5afYEbaxBBmxYfFm6IAAIIIIAAAggggAACCCCAQMYKVF1zlLHdoOEIIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN54c1zpFQIIIIAAAggggAACCCCAAAIIeESA4I1HBpJuIIAAAggggAACCCCAAAIIIICANwUI3nhzXOkVAggggAACCCCAAAIIIIAAAgh4RIDgjUcGkm4ggAACCCCAAAIIIIAAAggggIA3BQjeeHNc6RUCCCCAAAIIIIAAAggggAACCHhEgOCNRwaSbiCAAAIIIIAAAggggAACCCCAgDcFCN6keVxLS0sVj8frrNVet3IcCCCAAAIIIIAAAggggAACCCCAQH0CwfoKZNrr06ZN09q1a51mZ2dn65BDDmlUF+bMmaNFixY51waDQY0fP155eXn11vXrX/9aN954ozp37lxrWQvc/OIXv9BDDz0kayMHAggggAACCCCAAAIIIIAAAgggUJuA54I3N910k95++2317t1bXbp00eeff15b3/XUU0/pb3/7m7p3766HH35YHTt2rCj773//W4888oi2bNmiSCSimTNnatCgQRWv1/agsLBQ0Wi0tped8zk5OSooKJAFiHbdddc6y/IiAggggAACCCCAAAIIIIAAAgi0bQFPLpvaYYcd9OWXX+rdd9+tdXQXL16sa665Rh9++KE+/fRTJ0BTufBll13mBGx+/vOfVz7d4Mex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fTX0OOuss9S+ffs6L7PZNrYEjEz0dTLxIgIIIIAAAggggAACCCCAAAIISMro4M0ee+yhp59+2lUDOX78+HrbYztfWT4cDgQQQAABBBBAAAEEEEAAAQQQQKA+gYzYbaq+TvA6AggggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCCAAAIIIIAAAp4QIHjjiWGkEwgggAACCCCAAAIIIIAAAggg4FUBgjdeHVn6hQACCCCAAAIIIIAAAggggAACnhAgeOOJYaQTCCCAAAIIIIAAAggggAACCCDgVQGCN14dWfqFAAIIIIAAAggggAACCCCAAAKeECB444lhpBMIIIAAAggggAACCCCAAAIIIOBVAYI3Xh1Z+oUAAggggAACCCDw/+3dW4wW1R0A8D8uclFuAgILckeugpdasWpTWy+1iYnRRJ+M9kFj1Nik6oN9atPWJk0fTaz60FRfmqjR6IONTdpUrdZIWVjwLhd3uRSoIBdhF1RozpRvuizwfcvsMu7O/k6yfPPNzDlnzm82Ox//71wIECBAgACBSggI3lTiNmoEAQIECBAgQIAAAQIECBAgUFUBwZuq3lntIkCAAAECBAgQIECAAAECBCohIHhTiduoEQQI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sXH9+rzi6TNnxrDhw/P3NggQIECAAAECBAgQOP0C24/OP5mmMOia0opTabGS2vGux2wTIECgqIDgTVG5byjf7s8/j107d2a1pwfDrDlzvqErUS0BAgQIECBAgACBwSuQlgZPKX0m756ampqyCZ677/eeAAECRQWO/0tTtCT5ShFID4nU+yalieeeG90j/aVchEoIECBAgAABAgQIDHKBsWPHZgJpfpuuKS0u0tHREbXjXY/ZJkCAQFEBc94UlfuG8qWAzbKLL469e/bEgkWLThjp/4YuTbUECBAgQIAAAQIEBo1AbSWpLVu2HNPm/fv3x+7du600dYyKNwQI9FZAz5veCpacP3XLnL9gQVx62WUxevTokmtXHQECBAgQIECAAAECSSAtnT5t2rRYsWJFpN42tZTep3TdddfVdnklQIBArwUEb3pNqAACBAgQIECAAAECBAabwMSJE+POO++Ml19+ObZt25Y1P01x8Ic//CGWL18eV1555WAj0V4CBE6jwJAjXcPEp7EiRRMgQIAAAQIECBAgMPAE2tvb47777os0HOiNN96I2bNnZ0OCfvSjH8X9998/8BrUh1d88ODBLIDzySefxG233Zb1wlm3bl08++yzMX/+/D6sSVEECAx2AcGbwf4boP0ECBAgQIAAAQIE6ggcOnQo2trajjsjTcg7adKk4/YPth3JZ82aNfHRRx9lHt/+9rctKjLYfgm0l0AJAoI3JSCrggABAgQIECBAgAABAgQIECBQVMCcN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChBQPCmBGRVECBAgAABAgQIECBAgAABAgSKCgjeFJWTjwABAgQIECBAgAABAgQIECBQgoDgTQnIqiBAgAABAgQIECBAgAABAgQIFBUQvCkqJx8BAgQIECBAgAABAgQIECBAoAQBwZsSkFVBgAABAgQIECBAgAABAgQIECgqIHhTVE4+AgQIECBAgAABAgQIECBAgEAJAoI3JSCrggABAgQIECBAgAABAgQIECBQVEDwpqicfAQIECBAgAABAgQIECBAgACBEgQEb0pAVgUBAgQIECBAgAABAgQIECBAoKiA4E1ROfkIECBAgAABAgQIECBAgAABAiUICN6UgKwKAgQIECBAgAABAgQIECBAgEBRAcGbonLyESBAgAABAgQIECBAgAABAgRKEBC8KQFZFQQIECBAgAABAgQIECBAgACBogKCN0Xl5CNAgAABAgQIECBAgAABAgQIlCAgeFMCsioIECBAgAABAgQIECBAgAABAkUFBG+KyslHgAABAgQIECBAgAABAgQIEChB4L+DoW19/ZFRAwAAAABJRU5ErkJggg==" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - " ### Como tudo funciona:\n", - " \n", - " Antes de tudo Alice possui um qubit $|\\psi\\rangle = \\alpha|0\\rangle + \\beta|1\\rangle$ a qual deseja teletransportar para Bob. \n", - " \n", - " Então mais dois quibits emaranhados são colocados no sistema de forma que o estado inicial é composto por três qubits da seguinte forma: $|\\Psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle$ aplicando ao circuito\n", - " $(C_not\\otimes I)(H\\otimes I)$ afim de obtermos o estado $|\\Phi+\\rangle$ (ou qualquer outro estado vetor da base não-canonica de Bell) para realizarmos a transmição do qubit de interesse.\n", - "$$|\\varphi_0\\rangle = |\\psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle = (\\alpha|0\\rangle + \\beta|1\\rangle)\\otimes|00\\rangle$$\n", - "$$|\\varphi_1\\rangle = |\\psi\\rangle\\otimes\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\otimes|0\\rangle$$\n", - "$$|\\varphi_2\\rangle = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |10\\rangle}{\\sqrt{2}} = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}} $$ \n", - "$$|\\varphi_2\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|00\\rangle + |11\\rangle)}{\\sqrt{2}} = |\\psi\\rangle\\otimes|\\Phi+\\rangle$$\n", - "Dessa forma Alice controla os dois primeiros bits enquanto Bob apenas o último. A parti daí Alice usa o processo de decondificação dessa forma o qubit a ser transmitido e a metade emaranhada que ela possui podem ser combinadas. Para tal ela tem implementado o seguinte circuito quântico: $(C_not\\otimes I)$ seguido por $(H\\otimes I\\otimes I)$,\n", - "sendo assim $(H\\otimes I\\otimes I)(C_not\\otimes I)(|\\psi\\rangle\\otimes|\\Phi+\\rangle)$ Ao passar pelo circuito teremos:\n", - "\n", - "$$|\\varphi_3\\rangle = \\frac{\\alpha(|0\\rangle + |1\\rangle)(|00\\rangle + |11\\rangle) + \\beta(|0\\rangle - |1\\rangle)(|10\\rangle + |01\\rangle)}{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|10\\rangle + |01\\rangle)}{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{\\alpha|000\\rangle + |011\\rangle + |100\\rangle + |111\\rangle + \\beta|010\\rangle + |001\\rangle + -|110\\rangle + |101\\rangle }{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{|00\\rangle(\\alpha|0\\rangle + \\beta|1\\rangle) + |01\\rangle(\\beta|1\\rangle + \\alpha|0\\rangle) + |10\\rangle(\\alpha|0\\rangle - \\beta|1\\rangle) + |11\\rangle(-\\beta|0\\rangle + \\alpha|1\\rangle)}{2}$$\n", - "\n", - "\n", - "O circuito completo:\n", - "\n", - "\n", - "![image.png](attachment:image.png)\n", - "\n", - "Neste momento os dois qubits de Alice são medidos e então os três qubits colapsão para um das quatro possibilidades. Supondo que \n", - "o bit colapsado seja $|01\\rangle$ temos que lidar com dois problemas:\n", - "\n", - "(a) Apesar de Alice saber o estado Bob não sabe.
\n", - "(b) Bob $\\alpha|0\\rangle - \\beta|1\\rangle$, mas não o qubit desejado.
\n", - "\n", - "A fim de resolver este problema Alice envia uma copia de dois bits que usa essa informação para alcançar o estado desejado.\n", - "Rebendo $|01\\rangle$ então ele sabe o qubit está no estado:\n", - "\n", - " \n", - "$$ \n", - "\\begin{equation*}\n", - "\\alpha|0\\rangle - \\beta|1\\rangle = \\begin{vmatrix}\n", - " \\alpha \\\\\n", - " -\\beta \\\\\n", - "\\end{vmatrix}\n", - "\\end{equation*};\n", - "$$\n", - "Após este vetor agir sobre a seguinte base \n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$ teremos:\n", - "\n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "$\n", - "\\begin{vmatrix}\n", - "\\alpha \\\\\n", - "-\\beta \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "$\n", - "= \n", - "\\begin{vmatrix}\n", - "\\alpha \\\\\n", - "\\beta \\\\\n", - "\\end{vmatrix}\n", - "= \n", - "$\n", - "$\\alpha|0\\rangle + \\beta|1\\rangle = |\\psi\\rangle$\n", - "\n", - "E agora Bob tem a informação que estava com Alice.
\n", - "**Matriz de reconstrução de Bob:** \n", - "
\n", - "1.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - " 1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "2.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - " 1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "3.\n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "4.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - "-1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "
\n", - "**Bit recebido:**\n", - "1. $|00\\rangle$\n", - "2. $|01\\rangle$\n", - "3. $|10\\rangle$\n", - "4. $|11\\rangle$\n", - "\n", - "Pontos a serem observados:\n", - "\n", - "1. Alice não possui mais o estado $|psi\\rangle$.\n", - "2. Os bits clássicos navegam em um canal clássico e é impossível que Bob chegue a informação sem que este bits sejam transmitidos.\n", - "3. $\\alpha$ e $\\beta$ são números complexos arbritarios que satisfazem a equação $|\\alpha|^{2} + |\\beta|^{2} = 1$ podendo ter uma expansão infinito decimal porém toda essa informação. Contudo essa informação é passada na forma de qubit que quando colapsa quando passado para Bob e inutil quando medido.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulação do circuito:" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('00011', 22)" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "\"c[5]\",\"n\"\n", - "\"00001\",34\n", - "\"00000\",24\n", - "\"00010\",20\n", - "\"00011\",22\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (, line 3)", - "output_type": "error", - "traceback": [ - "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m3\u001b[0m\n\u001b[1;33m OPENQASM 2.0;\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "source": [ - "# Name of Experiment: Experiment #Teleportation v1\n", - "\n", - "OPENQASM 2.0;\n", - "include \"qelib1.inc\";\n", - "\n", - "\n", - "qreg q[2];\n", - "creg c[2];\n", - "\n", - "h q[1];\n", - "cx q[2],q[1];\n", - "cx q[1],q[0];\n", - "h q[0];\n", - "measure q[1] -> c[1];\n", - "measure q[0] -> c[0];\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "ename": "ModuleNotFoundError", - "evalue": "No module named 'qiskit'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mqiskit\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mqskit\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'qiskit'" - ] - } - ], - "source": [ - "import qiskit as qskit\n", - "from qiskit.tools.visualization import cirtcuit_drawer\n", - "from qiskit.tools.visualization import plot_histogram\n", - "import time\n", - "from qiskit import Aer\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 439068ed136f0ca95476134135676c3d79ceb2e6 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Wed, 17 Jul 2019 19:57:34 -0300 Subject: [PATCH 09/49] Adding deutsch_jozsa notebook --- deutsch_jozsa.ipynb | 46 +++++++++++++++++++++++++++++++++++++++++++++ superdense.ipynb | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 deutsch_jozsa.ipynb diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb new file mode 100644 index 0000000..1037993 --- /dev/null +++ b/deutsch_jozsa.ipynb @@ -0,0 +1,46 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Algoritmo de Deutsch-Jozsa" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Explicação" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo prático" + ] + } + ], + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/superdense.ipynb b/superdense.ipynb index e60ce22..c4a883a 100644 --- a/superdense.ipynb +++ b/superdense.ipynb @@ -325,7 +325,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.5" + "version": "3.7.3" } }, "nbformat": 4, From 687a7866d86810a133e27b74fe58a430bc3cbdb1 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Wed, 17 Jul 2019 19:58:51 -0300 Subject: [PATCH 10/49] removing dj.ipynb due fails when executing --- dj.ipynb | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 dj.ipynb diff --git a/dj.ipynb b/dj.ipynb deleted file mode 100644 index e69de29..0000000 From e1142ddbb5eaddb73f6c0073c0f208796f3284c2 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Thu, 18 Jul 2019 08:48:04 -0300 Subject: [PATCH 11/49] Criando circuito do Deutsch-Jozsa --- deutsch_jozsa.ipynb | 105 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 1037993..2a83587 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -20,6 +20,111 @@ "source": [ "## Exemplo prático" ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, Aer, execute\n", + "from qiskit.tools.visualization import plot_histogram" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inicializando o circuito\n", + "\n", + "Primeiro inicializamos os registadores quânticos e clássicos \n", + "e depois o circuito" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "q = QuantumRegister(2)\n", + "c = ClassicalRegister(2)\n", + "qc = QuantumCircuit(q, c)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc.h(q[0])\n", + "qc.h(q[1])\n", + "\n", + "qc.cx(q[0], q[1])\n", + "\n", + "qc.h(q[0])\n", + "\n", + "qc.measure(q, c)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFKCAYAAAB/8AR9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de5xVdb3/8dcbEAQFdAQRRAREcfKCg3g9eBfvGZF5PQf1VKQmZWR6Igu1tNIw/XnPMi+IiYlWmiceOileCE9IiIKkcpObyU0IxYHx8/tjrZk2wwysDTN7NjPv5+MxD2av9d1rf9ZezH7v77p8lyICMzMz27wWjV2AmZnZtsKhaWZmlpFD08zMLCOHppmZWUYOTTMzs4wcmmZmZhk5NM22cZJCUp/GrsOsOXBomtVB0lxJn0haLWmlpFclXSKpXv5uJD0g6cf1saw8X3eupBML/bq1kfQVSW+n7/EHkp6R1D6dl9f7I+kiSS83XLVmDk2zzfl8RLQH9gR+ClwN/LpxS2oaJB0D3Aicl77HpcC4xq3KbNMcmmYZRMRHEfEH4BzgQkn7A0hqI+nnkuanPaV7JLVN523U86nalSppGHABcJWkf0n6Yzr/akkL057XLEknpNNbShop6b103hRJe+Qs+kRJ70haIelOScqyXpJaSLpG0jxJ/5T0kKSO6bw70tqqftZLunYzdR4qaVLaM1+cLqN1HS9/CDApIqam7/HyiHgwIlZv4v35n5z3YIakL6bTS4F7gCPS9is3t33MtoRD0ywPEfEasAA4Kp30M2Af4CCgD7A78MMMy/kl8AhwU0TsGBGfl9QXuBw4JO15nQzMTZ8yAjgPOA3oAPw38HHOIs8gCaF+wNnpc7O4KP05DugN7AjckdZ4eVrbjsBAYAXw+83UWQl8G+gEHAGcAFxWx2tPBk6WdJ2k/5DUZlPvTzrrPZL3viNwHTBGUteImAlcQhLCO0bETmn7Ldo+ZnVxaJrlbxFQkvbmvgZ8O+0lrSbZ3XjuFi63EmgDfE7SdhExNyLeS+d9FbgmImZFYlpELMt57k8jYmVEzAf+QhISWVwA3BIRsyPiX8D3gHMltapqIKkz8BQwPO0V1llnREyJiL9GxPqImAvcCxxT2wtHxEvAEKA/8AywTNItklrWVWxEPB4RiyLis4h4DHgHOLS2tg2wfcwcmmZbYHdgOdAZaAdMSXdHrgT+N52et4h4F7gCuBb4p6TfSuqWzt6DpJdVlyU5v39M0mNE0ls5u1ePquV53YB5OY/nAa2ALunztwN+B4yNiN9urk5J+0h6WtISSatIQqrTJtb52bQXWQJ8gaTX+9W62ksaKunvOe/3/ptYfr1uHzNwaJrlRdIhJKH5MrAU+ATYLyJ2Sn86prszAdaQfGhXPXe3Govb6BZDETE2IgaSnHgUJLsXAd4H9sq33ojYr2oXa9qzq2lR+lpVegDrgQ/Sx7cDq4FrMtZ5N/A2sHdEdABGAps9vpr2HJ8HykmCEGq8P5L2BO4j2TW8S7oL9s2c5dd8Pze3fczy5tA0y0BSB0lnAL8FxkTE9Ij4jORD/BeSdk3b7S6p6njiNGA/SQdJ2p6kZ5brA5LjiFWv0VfS8emxvbUkH/iV6exfAT+StLcSB0rapR5W7VHg25J6SdqRpGf4WESsl/R1kl2r56frmqXO9sAq4F+S9gUureuFJX1B0rmSdk7X6dD09f6aNtng/QF2IAnGD9PnX8y/A7aqffeqE48ybB+zvDk0zTbtj5JWk/T0vg/cAlycM/9q4F3gr+nuyOeAvgAR8Q/g+nTaOyS901y/JjkuuFLSUyTHCX9K0kNaAuxK0lMjfd1xwASSUPo1sDVngVb1yu4HHgYmAnNIQnB4Ou88ktBalLOLd+Rm6rwSOJ+kd3of8NgmalhBcszxnXSdxgA3R8Qj6fwN3p+ImAGMBiaRBOQBwCs5yysH3gKWSFqaTqtz+5htCfkm1GbNi6TlwPER8ffGrsVsW+OeplkzImkQ0JKkd2dmeWq1+SZm1hRI+i1wGPC1iFjT2PWYbYu8e9bMzCwj7541MzPLyKFpZmaWUbM+prnLLrtEjx49GrsMMzMrIn//+9+XRkStI0c169Ds0aMH5eXljV2GmZkVkZKSknl1zfPuWTMzs4wcmmZmZhk5NM3MzDJyaJqZmWXk0DQzM8vIoWlmZpaRQ9PMzCwjh6aZmVlGDk0zM7OMHJpmZmYZOTTNzMwycmiamZll5NA0MzPLyKFpZmaWkUPTzMwsI4emmZlZRg5NMzOzjByaZmZmGTk0zczMMnJompmZZeTQNDMzy8ihaWZmlpFDs5E899xzHHrooRx88MHceuutG82/8847Ofzwwxk4cCCDBw/m/fffr563YMEChgwZwmGHHcbhhx/O/PnzAYgIfvzjH3PIIYdw2GGHce+99xZsfczMmoNWjV1Ac1RZWclVV13F+PHj6datGyeccAKnnHIK++67b3WbAw88kPLyctq1a8f999/PqFGjuP/++wG49NJLGTFiBMcddxz/+te/aNEi+e4zduxYFi5cyOTJk2nRogUffvhho6yfmVlT5Z5mI5gyZQq9evWiZ8+etG7dmiFDhvDss89u0Oaoo46iXbt2AAwYMIBFixYB8Pbbb7N+/XqOO+44AHbcccfqdr/5zW/47ne/Wx2inTt3LtQqmZk1Cw7NRrB48WJ233336sfdunVj8eLFdbYfM2YMJ554IgDvvfceHTt2ZOjQoRxzzDH88Ic/pLKyEoA5c+bw5JNPcvzxx/PlL3+Z9957r2FXxMysmXFoNoKI2GiapFrbjhs3jqlTpzJ8+HAA1q9fz6RJk7j++ut5/vnnmTt3LmPHjgWgoqKCNm3aUF5eztChQ6ufY2Zm9cOh2Qi6devGwoULqx8vWrSI3XbbbaN2L7zwAqNHj2bs2LG0adOm+rkHHnggPXv2pFWrVpx++um88cYb1fPOPPNMAM444wzeeuutAqyNmVnz4dBsBP3792f27NnMmzePiooKxo8fzymnnLJBmzfeeIMRI0YwduzYDY5N9u/fn5UrV7J06VIAJk6cSN++fQE47bTTmDhxIgCvvPIKffr0KdAamZk1Dz57thG0atWKm266ibPOOovKykouuOACSktLufHGGykrK+PUU09l1KhRrFmzhosvvhiA7t27M3bsWFq2bMn111/P4MGDiQgOOugghg4dCsAVV1zBsGHDuPvuu9lhhx247bbbGnM1zcyaHNV2fK25KCsri/Ly8sYuw8zMikhJScmUiBhQ2zzvnjUzM8vIoWlmZnnZmhHNOnXqxNFHH83RRx/N+eefXz39G9/4BgcddFD1vOnTpxdkXfLlY5pmZpbZ1o5o1rZt2+oTFmu67rrr+MIXvlCQ9dhS7mmapRri2/OwYcM49NBDOfLII7n88stZt25dQdbFrKFszYhmTYFD04x/f3seN24ckyZN4oknnuDtt9/eoE3Vt+eXX36ZM888k1GjRlXPq/r2PHHixOrBJgC+/OUvM3nyZF555RXWrl3Lww8/XLB1MmsIWzOiGcDatWs5/vjjGTRoEM8888wGbW+44QYGDhzIyJEj+fTTT+u/+Hrg0DSj4b49Dxo0CElIon///k3qG7c1T1szohkk16CXl5dz3333MXLkSObMmQPAD37wAyZPnszzzz/PypUri/aSOYemGQ377Rlg3bp1jBs3jhNOOKF+CzcrsK0Z0Qyga9euAPTs2ZOBAwdWj2i22267IYk2bdpw/vnn8/rrrzfwmmwZh6YZDfftucqVV17JEUccwRFHHFG/hZsV2NaMaLZy5crq3a7Lli1j8uTJ1SOaLVmyBEj+Fp955hlKS0sLtEb58dmzZuT/7fnpp5/e7LfnXr16AfCzn/2MZcuW8Ytf/KKB18Ks4W3NiGazZs1ixIgRtGjRgs8++4xvfetb1Wfdfv3rX2fp0qVEBAcccACjR49uzNWsk0cE8ohARnL3mEMOOYSnnnqKrl27csIJJ/DLX/5yg2+7b7zxBhdddBGPP/44e+21V/X0lStX0rZtW9q0acOyZcs4+eSTGTNmDPvuuy8PPfQQjzzyCE899RRt27ZtjFUzszxtakQg9zTNaLhvz9/5znfYY489OPnkk4Hk7jNXXXVVo62nmW0d9zTd0zQzsxzuaTawqx7cubFLqDc3XbiisUswMytaPnvWzMwsI4emmZlZRg5NMzOzjByaZmZmGTk0zczMMnJompmZZeTQNDMzy8ihaWZmlpEHNzAza8Y8OEt+3NM0MzPLyD1Na5L87dnMGoJ7mmZmZhk5NM2sqD333HMceuihHHzwwdx6660bzb/zzjs5/PDDGThwIIMHD+b9998HYPr06Zx00kkcccQRDBw4kPHjx1c/58UXX+TYY4/l6KOP5tRTT2X27NkFWx/btjk0zaxoVVZWctVVVzFu3DgmTZrEE088wdtvv71BmwMPPJDy8nJefvllzjzzTEaNGgVA27Ztufvuu5k0aRKPP/443//+9/noo48AuPLKK7n33nuZOHEiZ511FqNHjy74utm2yaFpZkVrypQp9OrVi549e9K6dWuGDBnCs88+u0Gbo446inbt2gEwYMAAFi1aBECfPn3Ya6+9AOjatSudOnVi6dKlAEhi9erVAKxatYrddtutUKtk2zifCGRmRWvx4sXsvvvu1Y+7devGlClT6mw/ZswYTjzxxI2mT5kyhYqKCnr16gXAbbfdxjnnnMP2229P+/btmTBhQv0Xb02Se5pmVrQiYqNpkmptO27cOKZOncrw4cM3mL5kyRIuvfRS7rjjDlq0SD7y7r77bh577DHeeustzj//fK655pr6L96apIKHpqTLJM2RtFbSFElHbaLtEEkTJH0oabWkyZLO3ET78ySFpKcbpnozK6Ru3bqxcOHC6seLFi2qdVfqCy+8wOjRoxk7dixt2rSpnr5q1SrOPfdcRo4cySGHHALA0qVLefPNNxkwYAAAQ4YM4bXXXmvgNbGmoqChKekc4DbgRqAMeBV4VlKPOp5yDFAOnJ62/xPwZG1BK6k3cDPwUgOUbmaNoH///syePZt58+ZRUVHB+PHjOeWUUzZo88YbbzBixAjGjh1L586dq6dXVFQwdOhQzjnnHAYPHlw9faeddmLVqlW8++67APzlL39hn332KcwK2Tav0Mc0RwAPRMR96ePhkk4BLgW+V7NxRHyrxqTrJJ0ODCYnHCVtBzwKfB84DujUALWbWYG1atWKm266ibPOOovKykouuOACSktLufHGGykrK+PUU09l1KhRrFmzhosvvhiA7t27M3bsWJ566ileffVVli9fzqOPPgokl6cccMAB3HrrrVx44YW0aNGCnXbaidtvv70xV9O2IQULTUmtgYOBn9eYNQE4Mo9FtQdqDpFyAzA3Ih6UdNyWV2lmxWbQoEEMGjRog2kjR46s/v3JJ5+s9Xlnn302Z599dq3zzjjjDM4444z6K9KajUL2NDsBLYEPakz/ANj4dLdaSPoG0B14OGfaScA5wEEZlzEMGAbJaeivv/46kBw7adeuXfUum44dO9K7d2+mTp0KQMuWLenXrx+zZs1izZo1AJSWlrJ8+XKg6QzZVvV+9O7dm4qKChYsWABAly5dKCkpYebMmQDssMMO9O3bl2nTplFZWQlAWVkZs2fPrr4Wrk+fPnz88cfVlwB07dqVDh06MGvWLADat2/P3nvvzdSpU4kIJFFWVsY777xTfTlA3759WbVqFYsXLwayb6emZPr06axbtw6Afv36MX/+fFasSL43buvbqba/pw8+SD4iunfvTuvWrasHHth5553p0aMH06ZNA2C77bbjgAMOYObMmXzyyScAfO5zn+PDDz/kww8/BGDPPfdEEnPnzgVgl112oWvXrrz55psAtGnThv3224+33nqLTz/9FID999+fxYsXs2zZMgB69uxJRDBv3jwAOnfuTOfOnZkxYwaQXA9aWlq6zW6n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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "backend = Aer.get_backend('qasm_simulator')\n", + "job_sim = execute(qc, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(qc)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 8cda663dca5fc95773be1fc7dbcacdf771b5af33 Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Thu, 1 Aug 2019 15:19:45 -0300 Subject: [PATCH 12/49] =?UTF-8?q?Explica=C3=A7=C3=B5es=20sobre=20o=20algor?= =?UTF-8?q?itmo=20de=20Deutsch=20e=20o=20de=20Deutsch-Jozsa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deutsch_jozsa.ipynb | 177 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 173 insertions(+), 4 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 1037993..c2cf764 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -4,21 +4,190 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Algoritmo de Deutsch-Jozsa" + "\n", + "# Problema de Deutch e Deutch-Jozsa\n", + "\n", + "## Observação dos autores\n", + "\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "\n", + "### Cronograma\n", + "- Paralelismo Quântico\n", + "- Problema de Deutch\n", + "- Porta Hadamard para N qubits\n", + "- Problema de Deutch-Jozsa\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Explicação" + "## Paralelismo Quântico\n", + "\n", + "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", + "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", + "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", + "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", + "(só que é exponencial no número de qubits no sistema, tá ok?).\n", + "\n", + "\n", + "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", + " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", + " \n", + "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", + "\n", + "\n", + "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", + " \n", + " \n", + "$$\\begin{eqnarray}\n", + " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", + " = \n", + " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", + " \\end{eqnarray}$$\n", + " \n", + " \n", + "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", + "\n", + "\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", + "\n", + "\n", + "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Exemplo prático" + "# Problema de Deutch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", + "\n", + "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", + "\n", + "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", + "\n", + "$$\\begin{eqnarray}\n", + "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", + "\n", + "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", + "\n", + "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", + "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", + "\n", + "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", + "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Porta Hadamard para N qubits\n", + "\n", + "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "\n", + "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", + "\n", + "\n", + "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", + "\n", + "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", + "\n", + "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", + "\n", + "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", + "\n", + "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", + "\n", + "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", + "\n", + "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", + "\n", + "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problema de Deutch Jozsa\n", + "\n", + "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "\n", + "\n", + "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", + "\n", + "Desenvolvendo o último termo da igaldade ficamos com:\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo temos que se $f(x) = 0$:\n", + "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "E se $f(x) = 1$ temos:\n", + "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Portanto, podemos concluir que:\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", + "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", + "\n", + "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", + "\n", + "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "\n", + "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", + "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", + "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" ] } ], @@ -38,7 +207,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.6.8" } }, "nbformat": 4, From e992fa395f1c340f4143f6b420bfd5d14026e90f Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Thu, 1 Aug 2019 19:16:06 -0300 Subject: [PATCH 13/49] finishing deutsch-jozsa --- deutsch_jozsa.ipynb | 236 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 202 insertions(+), 34 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 2a83587..f220b06 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -4,79 +4,248 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Algoritmo de Deutsch-Jozsa" + "\n", + "# Problema de Deutch e Deutch-Jozsa\n", + "\n", + "## Observação dos autores\n", + "\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "\n", + "### Cronograma\n", + "- Paralelismo Quântico\n", + "- Problema de Deutch\n", + "- Porta Hadamard para N qubits\n", + "- Problema de Deutch-Jozsa\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Explicação" + "## Paralelismo Quântico\n", + "\n", + "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", + "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", + "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", + "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", + "(só que é exponencial no número de qubits no sistema, tá ok?).\n", + "\n", + "\n", + "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", + " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", + " \n", + "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", + "\n", + "\n", + "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", + " \n", + " \n", + "$$\\begin{eqnarray}\n", + " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", + " = \n", + " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", + " \\end{eqnarray}$$\n", + " \n", + " \n", + "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", + "\n", + "\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", + "\n", + "\n", + "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Exemplo prático" + "# Problema de Deutch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", + "\n", + "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", + "\n", + "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", + "\n", + "$$\\begin{eqnarray}\n", + "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", + "\n", + "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", + "\n", + "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", + "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", + "\n", + "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", + "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" ] }, { - "cell_type": "code", - "execution_count": 10, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ + "## Porta Hadamard para N qubits\n", "\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, Aer, execute\n", - "from qiskit.tools.visualization import plot_histogram" + "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "\n", + "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", + "\n", + "\n", + "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", + "\n", + "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", + "\n", + "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", + "\n", + "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", + "\n", + "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", + "\n", + "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", + "\n", + "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", + "\n", + "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problema de Deutch Jozsa\n", + "\n", + "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "\n", + "\n", + "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", + "\n", + "Desenvolvendo o último termo da igaldade ficamos com:\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo temos que se $f(x) = 0$:\n", + "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "E se $f(x) = 1$ temos:\n", + "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Portanto, podemos concluir que:\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", + "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", + "\n", + "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", + "\n", + "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "\n", + "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", + "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", + "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo prático\n", + "\n", + "Agora nós vamos fazer um exemplo prático do algoritmo considerando a seguinte função, onde:\n", + "\n", + "f(0) = 0; f(1)=1;\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Inicializando o circuito\n", + "### Incializando os nossos qubits\n", "\n", - "Primeiro inicializamos os registadores quânticos e clássicos \n", - "e depois o circuito" + "Inicializaremos o qubit de entrada da função e o auxiliar (ancilla):\n" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ + "\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, Aer, execute\n", + "from qiskit.tools.visualization import plot_histogram\n", + "\n", "q = QuantumRegister(2)\n", "c = ClassicalRegister(2)\n", "qc = QuantumCircuit(q, c)\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Depois disso iniciaremos a construção do circuito com um Hadamard no primeiro\n", + "e segundo qubits e depois o portão c-not que é uma representação para a nossa função." + ] + }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 19, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -89,22 +258,22 @@ "\n", "qc.h(q[0])\n", "\n", - "qc.measure(q, c)" + "qc.measure(q[0], c[0])" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { - "image/png": "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ncrw4cM3mL5kyRIuvfRS7rjjDlq0SD7y7r77bh577DHeeustzj//fK655pr6L96apIKHpqTLJM2RtFbSFElHbaLtEEkTJH0oabWkyZLO3ET78ySFpKcbpnozK6Ru3bqxcOHC6seLFi2qdVfqCy+8wOjRoxk7dixt2rSpnr5q1SrOPfdcRo4cySGHHALA0qVLefPNNxkwYAAAQ4YM4bXXXmvgNbGmoqChKekc4DbgRqAMeBV4VlKPOp5yDFAOnJ62/xPwZG1BK6k3cDPwUgOUbmaNoH///syePZt58+ZRUVHB+PHjOeWUUzZo88YbbzBixAjGjh1L586dq6dXVFQwdOhQzjnnHAYPHlw9faeddmLVqlW8++67APzlL39hn332KcwK2Tav0Mc0RwAPRMR96ePhkk4BLgW+V7NxRHyrxqTrJJ0ODCYnHCVtBzwKfB84DujUALWbWYG1atWKm266ibPOOovKykouuOACSktLufHGGykrK+PUU09l1KhRrFmzhosvvhiA7t27M3bsWJ566ileffVVli9fzqOPPgokl6cccMAB3HrrrVx44YW0aNGCnXbaidtvv70xV9O2IQULTUmtgYOBn9eYNQE4Mo9FtQdqDpFyAzA3Ih6UdNyWV2lmxWbQoEEMGjRog2kjR46s/v3JJ5+s9Xlnn302Z599dq3zzjjjDM4444z6K9KajUL2NDsBLYEPakz/ANj4dLdaSPoG0B14OGfaScA5wEEZlzEMGAbJaeivv/46kBw7adeuXfUum44dO9K7d2+mTp0KQMuWLenXrx+zZs1izZo1AJSWlrJ8+XKg6QzZVvV+9O7dm4qKChYsWABAly5dKCkpYebMmQDssMMO9O3bl2nTplFZWQlAWVkZs2fPrr4Wrk+fPnz88cfVlwB07dqVDh06MGvWLADat2/P3nvvzdSpU4kIJFFWVsY777xTfTlA3759WbVqFYsXLwayb6emZPr06axbtw6Afv36MX/+fFasSL43buvbqba/pw8+SD4iunfvTuvWrasHHth5553p0aMH06ZNA2C77bbjgAMOYObMmXzyyScAfO5zn+PDDz/kww8/BGDPPfdEEnPnzgVgl112oWvXrrz55psAtGnThv3224+33nqLTz/9FID999+fxYsXs2zZMgB69uxJRDBv3jwAOnfuTOfOnZkxYwaQXA9aWlq6zW6npvT5tWzZsnrZTpui2s5OawiSugELgaMjInfX6ijgvIjYdzPP/xJJWJ4bEX9Ip3UC3gDOj4gX0mkPAJ0iYrNfI8vKyqK8vHzLViiHxzktPt4mZtn4b2VjJSUlUyJiQG3zCtnTXApUAjVPfduVjXufG8gJzKFVgZnaH+gKPJdzGnqL9Dnrgf0iYtbWl25mZlbAs2cjogKYAgyqMWsQyVm0tZJ0NjAGuCgifldj9v8BB5Dsmq36+QPJSUIHAXPqpXgzMzMKf/bsLcDDkl4DXgEuAboB9wBIegggIoamj88l6WFeCUyUVNVLrYiI5RGxBngz9wUkrQRaRcQG083MzLZWQUMzIh6TtAtwDclu1TeB0yJiXtqk5vWal5DUeGv6U+VF4NiGrdbMzGxDBR97NiLuAu6qY96xm3qccfkXbUldZmZmm+OxZ83MzDJyaJqZmWXk0DQzM8vI99M0s4LxhfS2rXNP08zMLCOHppmZWUYOTTMzs4wcmmZmZhk5NM3MzDJyaJqZmWXk0DQzM8vIoWlmZpaRQ9PMzCwjh6aZmVlGDk0zM7OMHJpmZmYZOTTNzMwycmiamZll5NA0MzPLyKFpZmaWkUPTzMwsI4emmZlZRnmFpqSzJZ2U8/iHkhZI+rOkrvVfnpmZWfHIt6d5bdUvkvoDI4H/B2wHjK6/sszMzIpPqzzb7wnMSn//IvBURNwkaQLw53qtzMzMrMjk29NcC7RPfz8BeC79/aOc6WZmZk1Svj3Nl4DRkl4GBgBnpdP3Ad6vz8LMzMyKTb49zcuBCpKwvCQiFqXTT8W7Z83MrInLq6cZEQuAz9cy/Yp6q8jMzKxI5X2dpqTtJZ0l6WpJO6XT9pJUUv/lmZmZFY+8epqS+pCc/LMjsBPwOLASuDR9/NX6LtDMzKxY5NvTvBWYAHQBPsmZ/gfguPoqyszMrBjle/bskcDhEVEpKXf6fKBbvVVlZmZWhLZk7NntapnWg+RaTTMzsyYr39CcAIzIeRySOgDXAc/UW1VmZmZFKN/dsyOAv0iaBWwPPAb0AT4Azq7n2szMzIpKvtdpLpJ0EHAe0J+kp/pL4JGI+GSTTzYzM9vG5dvTJA3H+9MfMzOzZmOzoSlpCPDHiFiX/l6niBhfb5WZmZkVmSw9zd8BuwH/TH+vSwAt66MoMzOzYrTZ0IyIFrX9bmZm1tzkFYKSjpa0UdBKainp6Pory8zMrPjk23P8C1DbwOw7pfPMzMyarHxDUyTHLmvaBViz9eWYmZkVr0yXnEj6Q/prAGMkfZozuyWwP/BqPddmZmZWVLJep7ks/VfACja8w0kF8DJwXz3WZWZmVnQyhWZEXAwgaS7w84jwrlgzM2t28h1G77qGKsTMzKzYZRkR6A3gmIhYIWk6tZ8IBEBEHFifxZmZmRWTLD3NJ4CqE382NSKQmZlZk5ZlRKDravvdzMysufGweGZmZhllOaa5yeOYuXxM08zMmrKsdzkxMzNr9vI6pmlmZtac+ZimmZlZRr5O08zMLKOCX6cp6TLgu0BX4C3gioh4qY62XYHRQH9gb+DhiLiolnYdgB8DZ5HcceV9YGREjNvaes3MzKoU9DpNSecAtwGXkQzyfhnwrKTPRcT8Wp7SBlgK/BQYVscytwMmkAwkfzawAOjOv4PezMysXuQ19mwVSXsBpenDmRHxXsanjgAeiIiqO6IMl3QKcCnwvZqNI2Iu8M30Nc+qY5kXA7sCR0dERTptbsZ6zMzMMsvrRCBJu0h6CngHeCr9+Yek30vaZTPPbQ0cTNIrzDUBODKfOmoYDLwC3C5piaQZkq5Ne6BmZmb1Jt+e5q+APsBRwOR02mHA3ST30xyyied2Irlh9Qc1pn8AnJhnHbl6A8cDY4HTgZ7AncCOwJU1G0saRrqrt2vXrrz++usAdOvWjXbt2vHuu+8C0LFjR3r37s3UqVMBaNmyJf369WPWrFmsWZPcGa20tJTly5cDO29F+cWl6v3o3bs3FRUVLFiwAIAuXbpQUlLCzJkzAdhhhx3o27cv06ZNo7KyEoCysjJmz57NRx99BECfPn34+OOPWbRoEZC83x06dGDWrFkAtG/fnr333pupU6cSEUiirKyMd955h9WrVwPQt29fVq1axeLFi4Hs26kpmT59OuvWrQOgX79+zJ8/nxUrVgDb3nZqSqr+Vtq2bUtpaek2u52a0ufXsmXLmDdvHgCdO3emc+fOzJgxA8hvO22KIjIN9pM0lj4GToiISTWmHwE8FxE7bOK53YCFJLtRX8qZPgo4LyL23cxrPw0srXkikKR/ANsDvSKiMp02DPgFsGNsYgXLysqivLx8Uy+byVUPNp3/dDdduKKxS6gX3ibFydul+HibbKykpGRKRAyobV6+Pc0PgdpuQP0xsGwzz10KVAK71Zi+Kxv3PvOxGFhXFZipmUA7kt7th1uxbDMzs2r5Dm5wPXCrpN2rJqS/j07n1Sk9SWcKMKjGrEHAq3nWkesVoI+k3HXZhyTIl27Fcs3MzDawJQO29wLmSlqYPt4dWEvSY/zVZhZ3C/CwpNdIwu4SoBtwT/paDwFExNCc1z8o/bUD8Fn6uCIiZqTT7wYuB26TdAfJMc3rgLs2tWvWzMwsXwUdsD0iHkvPsr2GZHCDN4HTImJe2qRHLU+bWuPx54F5JOFIRLwv6SSSQP47sAS4n2SwAzMzs3pT8AHbI+Iu4K465h1byzRlWOZf2brLVszMzDbLA7abmZlllO/gBq0lXSfpH5LWSqrM/WmoIs3MzIpBvj3NHwEXkpwt+xnJwOt3klxucln9lmZmZlZc8g3Ns4FLIuJekmsufx8R3wRGsfGlJGZmZk1KvqHZBai61ONfwE7p7/8LnFRfRZmZmRWjfENzPsl1lQDvAienvx8BfFJfRZmZmRWjfEPzSeCE9PfbgOskzQEeYPMDG5iZmW3T8hp7NiK+l/P77yQtILk+8h8R8XR9F2dmZlZMtugm1FXSQQX+Wk+1mJmZFbW8BzeQ1F/SQ5L+lv48LKl/QxRnZmZWTPId3OAC4P9Ixo39U/rTBXhN0n/Wf3lmZmbFI9/dszcAP4iIG3MnSvoeyQDpY+qrMDMzs2KT7+7ZzsC4WqY/TnJrMDMzsyYr39D8C3BsLdOPBV7c2mLMzMyKWZabUA/Jefgs8BNJA/j3WbOHA0OAa+u9OjMzsyKypTehHpb+5LqdOu6TaWZm1hRkuQm177lpZmaGb0JtZmaW2ZYMbnC6pImSlkr6UNKLkk5riOLMzMyKSb6DG3yVZND294Crgf8B5gBPSvrv+i/PzMyseOQ7uMHVwIiIuCNn2q8lTSEJ0PvrrTIzM7Mik+/u2R4kN5yu6Vlgz60vx8zMrHhtyU2oB9Uy/SRg3taXY2ZmVrzy3T37c+D29K4mrwIBDAT+Cxhez7WZmZkVlXxvQn2vpH8C3yEZBQhgJnB2RPy+voszMzMrJplDU1Irkt2wEyPiyYYryczMrDhlPqYZEeuB8UD7hivHzMyseOV7ItA0oE9DFGJmZlbs8g3Na4HRkgZL2kNSSe5PA9RnZmZWNPI9e/aZ9N/xJGfOVlH6uGV9FGVmZlaM8g3N4xqkCjMzs21AptCU1A64GRgMbAc8B3wzIpY2YG1mZmZFJesxzeuAi0h2zz5KMirQ3Q1Uk5mZWVHKunt2CPCViPgtgKRHgFcktYyIygarzszMrIhk7WnuAbxU9SAiXgPWA90aoigzM7NilDU0WwIVNaatJ/8TiczMzLZZWUNPwBhJn+ZM2x64T9LHVRMi4sz6LM7MzKyYZA3NB2uZNqY+CzEzMyt2mUIzIi5u6ELMzMyKXb7D6JmZmTVbDk0zM7OMHJpmZmYZOTTNzMwycmiamZll5NA0MzPLyKFpZmaWkUPTzMwsI4emmZlZRg5NMzOzjByaZmZmGTk0zczMMnJompmZZeTQNDMzy8ihaWZmlpFD08zMLCOHppmZWUYOTTMzs4wKHpqSLpM0R9JaSVMkHbWZ9sek7dZKmi3pkhrzW0r6Uc4y50j6saRWDbsmZmbW3BQ0NCWdA9wG3AiUAa8Cz0rqUUf7XsCf0nZlwE+A2yV9KafZ1cA3gG8C+wLfSh9/r4FWw8zMmqlC98ZGAA9ExH3p4+GSTgEupfaQuwRYFBHD08czJR0GXAk8kU47EvhjRPwxfTxX0h+AwxpkDczMrNkqWE9TUmvgYGBCjVkTSIKvNkfU0v7PwABJ26WPXwaOk7Rv+jqfA44n6aGamZnVm0L2NDsBLYEPakz/ADixjufsBjxXS/tW6fIWAz8D2gMzJFWm826IiLtqW6CkYcAwgK5du/L6668D0K1bN9q1a8e7774LQMeOHenduzdTp04FoGXLlvTr149Zs2axZs0aAEpLS1m+fDmwc6Y3YFtQ9X707t2biooKFixYAECXLl0oKSlh5syZAOywww707duXadOmUVlZCUBZWRmzZ8/mo48+AqBPnz58/PHHLFq0CEje7w4dOjBr1iwA2rdvz957783UqVOJCCRRVlbGO++8w+rVqwHo27cvq1atYvHixUD27dSUTJ8+nXXr1gHQr18/5s+fz4oVK4Btbzs1JVV/K23btqW0tHSb3U5N6fNr2bJlzJs3D4DOnTvTuXNnZsyYAeS3nTZFEdGAq5DzQlI3YCFwdES8lDN9FHBeROxby3P+ATwcET/KmXYM8ALQNSKWSDoXuBn4LvAWcBDJcdPvRsSvN1VTWVlZlJeXb/W6XfVg0/lPd9OFKxq7hHrhbVKcvF2Kj7fJxkpKSqZExIDa5hWyp7kUqCTpPebalY17n1WW1NF+PbAsfXwz8POI+G36eLqkPUmOkW4yNM3MzPJRsGOaEVEBTAEG1Zg1iOTs2NpMYuNdt4OAv0XEuvRxO5IwzlWJr0E1M7N6VuizZ28BHpb0GvAKydmx3YB7ACQ9BBARQ9P29wCXS7oVuBf4D+Ai4LycZf4R+B9Jc0h2z5aRnKX7UEOvjJmZNS8FDc2IeEzSLsA1QFfgTeC0iJiXNulRo/0cSacBvyC5LGUR8M2IeCKn2XDgR8BdJLtuFwP3Adc35LqYmVnzU/BRc9KzWms9szUijq1l2otA/00sbzVwRfpjZmbWYHzcz8zMLCOHppmZWar1cPsAAAjWSURBVEYOTTMzs4wcmmZmZhk5NM3MzDJyaJqZmWXk0DQzM8vIoWlmZpaRQ9PMzCwjh6aZmVlGDk0zM7OMHJpmZmYZOTTNzMwycmiamZll5NA0MzPLyKFpZmaWkUPTzMwsI4emmZlZRg5NMzOzjByaZmZmGTk0zczMMnJompmZZeTQNDMzy8ihaWZmlpFD08zMLCOHppmZWUYOTTMzs4wcmmZmZhk5NM3MzDJyaJqZmWXk0DQzM8vIoWlmZpaRQ9PMzCwjh6aZmVlGDk0zM7OMHJpmZmYZOTTNzMwycmiamZll5NA0MzPLyKFpZmaWkUPTzMwsI4emmZlZRg5NMzOzjByaZmZmGTk0zczMMnJompmZZeTQNDMzy8ihaWZmlpFD08zMLCOHppmZWUYOTTMzs4wcmmZmZhk5NM3MzDJyaJqZmWXk0DQzM8vIoWlmZpaRQ9PMzCyjgoempMskzZG0VtIUSUdtpv0xabu1kmZLumRrl2lmZrYlChqaks4BbgNuBMqAV4FnJfWoo30v4E9puzLgJ8Dtkr60pcs0MzPbUoXuaY4AHoiI+yJiZkQMBxYDl9bR/hJgUUQMT9vfBzwIXLkVyzQzM9siBQtNSa2Bg4EJNWZNAI6s42lH1NL+z8AASdtt4TLNzMy2SKsCvlYnoCXwQY3pHwAn1vGc3YDnamnfKl2e8l2mpGHAsPThv0pKSmZlKb4IdAKWNvSL/OrbDf0KTU6Dbxdvk7z5b6U4bUt/K3vWNaOQoVklajxWLdM2175qujbRptZlRsQvgV9uvsziIulvETGgseuwDXm7FB9vk+LUVLZLIUNzKVBJ0nvMtSsb9xSrLKmj/XpgGUk45rtMMzOzLVKwY5oRUQFMAQbVmDWI5IzX2kxi492sg4C/RcS6LVymmZnZFin07tlbgIclvQa8QnJ2bDfgHgBJDwFExNC0/T3A5ZJuBe4F/gO4CDgv6zKbkG1ul3Iz4e1SfLxNilOT2C6K2NThxAZ4Qeky4CqgK/Am8O2ImJjOewEgIo7NaX8M8AtgP2AR8LOIuCfrMs3MzOpLwUPTzMxsW+WxZ83MzDJyaJqZmWXk0DQzM8vIoWlmTYYk5f5rVt98IlARk9Qd6EMyiMNnwKyIWNK4VZltO6rCM/xBZ/XEoVmkJF0K/DfQD1gDvAssIBnw4fcRMUtSi4j4rBHLbFYktY2ITxq7DtuYpBbAF4DOQDtgIfBiRPyzUQuzJsehWYQk7UISkqOBu0k+CE4EjgP2JflAuCIiZkiSv0U3PEk7A9OAZ4AxwKtV73vuNpC0L8nt7FY1WrHNjKT2wK9J/j4+I/lyGcAnwIvAmIh4238rhSNpO6AXMC8iPm3seuqTj2kWp/OBf0TEjyNiWUS8HRF3RMSXgK8DbYGnJXXyh0DB/CfQheRWdBOBdyVdL6lvTmDuATxKcjcHK5xvAn2B0yKiC3ABcCvwFnAycJOkzv5bKahvAFOBeyR9XtJuklrmNpDUQdKpacBuMxyaxakCaC9pfwBJbdJ7hxIRL5N8KKwFTmq8EpudA4HfAGcAZcA4kuEcZ0j6a3rLuf8E9o6I2Y1XZrN0CvBgRPwfQPolcwzJB/d3gFLg4Uasrzk6B3iN5JyMp0gOK90saaCkjmmb84FREbGukWrcIg7N4vQ7kt1MV0hqHxGfRkRFetyGiJgPrAS6N2aRzYWkNsAM4P2I+GdEvBER3wMGkPRkZgDXAjcAP2u0QpshSa1Ihs78kqTO6bSWklpGRGU6nOYlQHdJ/Rqz1uYi3Q7rgPsi4iiSe1P+muQL50SgXNLVwBXA5EYrdAv5mGaRyTlV/gvAbUAJSa/mLpLdHd2Bo0mOdR4QEXMbocxmJw3OnSNiSbqbKXJPwpJ0LFAO9IiIBY1UZrMk6XDgEZIvm7dExAc15u8BzAT6RsTCRiixWZHUFTgXmBERf64xrwz4ajp/Z2CPbW2bODSLlKSdgB7AkcAXSe7wAsk9RlsAD0XEtY1TXfNSdQKJpN7AmtwP5Zx5PwQuiojejVdp85PufWkBXAzcSHLnpt8BjwHvk+xW/zxQGhGHNFadzY2ktiRfLNfmXjObc/z/BpJj0GWNVeOWcmgWEUm7Av9FchxmKcnZfyuBl0h2Y2wH7AX8GXjHJzY0vJxtMgL4J8kN0BcDjwPjI2JN+qHwNZKzZp9utGKbufSL5kUkx8oOAlYDn5IcW/tJRGxzuwK3ZXWdrSypHfA68JuI2OYOZzg0i4ikB0hugfZHYDnJrtkDgH1IPrCv8R9+YdWxTcpILv1ZANwcERMarcBmTFIHYHXuB3Pa89we2BHYn2TPgP9mCqS2bVJLm+1JThR6NCIqClZcPXFoFom0t7KaZJfFxJxpPYDDga8AvYGzI+L1Riu0GdnENtkDOIykd7kncJ63SeFJupekF/kayfWAG10bK2nniFjhazQLI+M22SkiVha8uHris2eLx+eAOSSXmwDJ/v+ImBcRj5Ecl1kJfLmR6muO6tom8yPicZKzAVfjbVJwks4j+dIyGvg9yeUMQyT1SY+nIWlH4DeSDnBgNrw6tskXJe2Vs03aAg9WXU63LXJPs0ik/5meJhkCbCjwXs0h8iQNB74SEQc1QonNjrdJ8ZJ0H1AJ3AQMAS4kOd4/C/gT8DzJgAe3RUTrxqqzOWku28Q9zSKRjmn6fZLRfh4ChkraQ9IOUH3w/BiSa9KsALxNilN6beYcYGVEzI6In0fEAcAhJMPmXUhymdbteFCDgmhO28Q9zSKT7rb4AXAmyUDtk4APScaeXQx8NSKmN16FzY+3SfFJxwLuko4p2xpYV+OEoHNIhjTsHxF/b6w6m5Pmsk0cmkUqvdThdGAwyZB5bwKPR8TbjVpYM+ZtUtzSM2cVEZWSvkayG7BdY9fVnDXFbeLQ3AbItwArOt4mxU3SCKBlRNzc2LVYoqlsE4emmTU56Z0zKv3Fpng0lW3i0DQzM8vIZ8+amZll5NA0MzPLyKFpZmaWkUPTzMwsI4emmZlZRg5NMzOzjP4/iIV9uDDUdCIAAAAASUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ "
" ] }, - "execution_count": 20, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -115,8 +284,7 @@ "sim_result = job_sim.result()\n", "\n", "counts = sim_result.get_counts(qc)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n", - "\n" + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" ] }, { From 4d4990b9ea9adbefaebdb7cf512b767a1d180dd9 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Thu, 1 Aug 2019 19:39:41 -0300 Subject: [PATCH 14/49] atualizando deutsch-jozsa --- .../deutsch_jozsa-checkpoint.ipynb | 215 ++++++++++++++++++ deutsch_jozsa.ipynb | 106 ++++++++- 2 files changed, 320 insertions(+), 1 deletion(-) create mode 100644 .ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb diff --git a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb new file mode 100644 index 0000000..5fb11e3 --- /dev/null +++ b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb @@ -0,0 +1,215 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Problema de Deutch e Deutch-Jozsa\n", + "\n", + "## Observação dos autores\n", + "\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "\n", + "### Cronograma\n", + "- Paralelismo Quântico\n", + "- Problema de Deutch\n", + "- Porta Hadamard para N qubits\n", + "- Problema de Deutch-Jozsa\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Paralelismo Quântico\n", + "\n", + "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", + "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", + "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", + "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", + "(só que é exponencial no número de qubits no sistema, tá ok?).\n", + "\n", + "\n", + "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", + " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", + " \n", + "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", + "\n", + "\n", + "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", + " \n", + " \n", + "$$\\begin{eqnarray}\n", + " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", + " = \n", + " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", + " \\end{eqnarray}$$\n", + " \n", + " \n", + "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", + "\n", + "\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", + "\n", + "\n", + "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Problema de Deutch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", + "\n", + "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", + "\n", + "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", + "\n", + "$$\\begin{eqnarray}\n", + "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", + "\n", + "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", + "\n", + "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", + "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", + "\n", + "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", + "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Porta Hadamard para N qubits\n", + "\n", + "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "\n", + "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", + "\n", + "\n", + "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", + "\n", + "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", + "\n", + "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", + "\n", + "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", + "\n", + "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", + "\n", + "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", + "\n", + "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", + "\n", + "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problema de Deutch Jozsa\n", + "\n", + "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "\n", + "\n", + "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", + "\n", + "Desenvolvendo o último termo da igaldade ficamos com:\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo temos que se $f(x) = 0$:\n", + "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "E se $f(x) = 1$ temos:\n", + "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Portanto, podemos concluir que:\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", + "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", + "\n", + "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", + "\n", + "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "\n", + "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", + "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", + "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" + ] + } + ], + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index c2cf764..f220b06 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -189,6 +189,110 @@ "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo prático\n", + "\n", + "Agora nós vamos fazer um exemplo prático do algoritmo considerando a seguinte função, onde:\n", + "\n", + "f(0) = 0; f(1)=1;\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Incializando os nossos qubits\n", + "\n", + "Inicializaremos o qubit de entrada da função e o auxiliar (ancilla):\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, Aer, execute\n", + "from qiskit.tools.visualization import plot_histogram\n", + "\n", + "q = QuantumRegister(2)\n", + "c = ClassicalRegister(2)\n", + "qc = QuantumCircuit(q, c)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Depois disso iniciaremos a construção do circuito com um Hadamard no primeiro\n", + "e segundo qubits e depois o portão c-not que é uma representação para a nossa função." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc.h(q[0])\n", + "qc.h(q[1])\n", + "\n", + "qc.cx(q[0], q[1])\n", + "\n", + "qc.h(q[0])\n", + "\n", + "qc.measure(q[0], c[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "backend = Aer.get_backend('qasm_simulator')\n", + "job_sim = execute(qc, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(qc)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -207,7 +311,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.7.3" } }, "nbformat": 4, From 60ca59661ba20859a891965f9aa1dab7c01fc6f8 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Thu, 1 Aug 2019 19:44:11 -0300 Subject: [PATCH 15/49] Removing unecessary folders --- .../deutsch_jozsa-checkpoint.ipynb | 215 ------------------ 1 file changed, 215 deletions(-) delete mode 100644 .ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb diff --git a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb deleted file mode 100644 index 5fb11e3..0000000 --- a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb +++ /dev/null @@ -1,215 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# Problema de Deutch e Deutch-Jozsa\n", - "\n", - "## Observação dos autores\n", - "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", - "\n", - "### Cronograma\n", - "- Paralelismo Quântico\n", - "- Problema de Deutch\n", - "- Porta Hadamard para N qubits\n", - "- Problema de Deutch-Jozsa\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Paralelismo Quântico\n", - "\n", - "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", - "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", - "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", - "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", - "(só que é exponencial no número de qubits no sistema, tá ok?).\n", - "\n", - "\n", - "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", - " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", - " \n", - "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", - "\n", - "\n", - "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", - " \n", - " \n", - "$$\\begin{eqnarray}\n", - " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", - " = \n", - " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", - " \\end{eqnarray}$$\n", - " \n", - " \n", - "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", - "\n", - "\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", - "\n", - "\n", - "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Problema de Deutch\n", - "\n", - "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", - "\n", - "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", - "\n", - "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", - "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", - "\n", - "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", - "\n", - "$$\\begin{eqnarray}\n", - "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", - "\\end{eqnarray}$$\n", - "\n", - "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", - "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", - "\n", - "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", - "\n", - "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", - "\n", - "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", - "\n", - "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", - "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", - "\n", - "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", - "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Porta Hadamard para N qubits\n", - "\n", - "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", - "\n", - "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", - "\n", - "\n", - "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", - "\n", - "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", - "\n", - "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", - "\n", - "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", - "\n", - "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", - "\n", - "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", - "\n", - "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", - "\n", - "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problema de Deutch Jozsa\n", - "\n", - "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", - "\n", - "\n", - "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", - "\n", - "Desenvolvendo o último termo da igaldade ficamos com:\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo temos que se $f(x) = 0$:\n", - "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "E se $f(x) = 1$ temos:\n", - "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Portanto, podemos concluir que:\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", - "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", - "\n", - "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", - "\n", - "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", - "\n", - "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", - "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", - "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From a24f070444ad2e3e9df63db2e452d82def996572 Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Thu, 1 Aug 2019 20:04:46 -0300 Subject: [PATCH 16/49] Checkpoints in the .ipynb_checkpoints folder --- .../deutsch_jozsa-checkpoint.ipynb | 319 ++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 .ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb diff --git a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb new file mode 100644 index 0000000..129fb06 --- /dev/null +++ b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb @@ -0,0 +1,319 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Problema de Deutch e Deutch-Jozsa\n", + "\n", + "## Observação dos autores\n", + "\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "\n", + "### Cronograma\n", + "- Paralelismo Quântico\n", + "- Problema de Deutch\n", + "- Porta Hadamard para N qubits\n", + "- Problema de Deutch-Jozsa\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Paralelismo Quântico\n", + "\n", + "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", + "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", + "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", + "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", + "(só que é exponencial no número de qubits no sistema, tá ok?).\n", + "\n", + "\n", + "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", + " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", + " \n", + "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", + "\n", + "\n", + "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", + " \n", + " \n", + "$$\\begin{eqnarray}\n", + " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", + " = \n", + " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", + " \\end{eqnarray}$$\n", + " \n", + " \n", + "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", + "\n", + "\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", + "\n", + "\n", + "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Problema de Deutch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", + "\n", + "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", + "\n", + "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", + "\n", + "$$\\begin{eqnarray}\n", + "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", + "\n", + "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", + "\n", + "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", + "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", + "\n", + "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", + "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Porta Hadamard para N qubits\n", + "\n", + "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "\n", + "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", + "\n", + "\n", + "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", + "\n", + "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", + "\n", + "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", + "\n", + "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", + "\n", + "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", + "\n", + "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", + "\n", + "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", + "\n", + "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problema de Deutch Jozsa\n", + "\n", + "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "\n", + "\n", + "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", + "\n", + "Desenvolvendo o último termo da igaldade ficamos com:\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo temos que se $f(x) = 0$:\n", + "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "E se $f(x) = 1$ temos:\n", + "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Portanto, podemos concluir que:\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", + "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", + "\n", + "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", + "\n", + "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "\n", + "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", + "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", + "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo prático\n", + "\n", + "Agora nós vamos fazer um exemplo prático do algoritmo considerando a seguinte função, onde:\n", + "\n", + "f(0) = 0; f(1)=1;\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Incializando os nossos qubits\n", + "\n", + "Inicializaremos o qubit de entrada da função e o auxiliar (ancilla):\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, Aer, execute\n", + "from qiskit.tools.visualization import plot_histogram\n", + "\n", + "q = QuantumRegister(2)\n", + "c = ClassicalRegister(2)\n", + "qc = QuantumCircuit(q, c)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Depois disso iniciaremos a construção do circuito com um Hadamard no primeiro\n", + "e segundo qubits e depois o portão c-not que é uma representação para a nossa função." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc.h(q[0])\n", + "qc.h(q[1])\n", + "\n", + "qc.cx(q[0], q[1])\n", + "\n", + "qc.h(q[0])\n", + "\n", + "qc.measure(q[0], c[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "backend = Aer.get_backend('qasm_simulator')\n", + "job_sim = execute(qc, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(qc)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From c9301fa676a1adac3f4f74391a6d9f4ff9ee5d13 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Sat, 3 Aug 2019 10:55:03 -0300 Subject: [PATCH 17/49] =?UTF-8?q?Inicio=20da=20implementa=C3=A7=C3=A3o=20d?= =?UTF-8?q?o=20algoritmo=20de=20Grover?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grover.ipynb | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/grover.ipynb b/grover.ipynb index e69de29..1f26617 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -0,0 +1,137 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.7/site-packages/qiskit/providers/ibmq/ibmqfactory.py:181: UserWarning: Credentials are already in use. The existing account in the session will be replaced.\n", + " warnings.warn('Credentials are already in use. The existing '\n" + ] + } + ], + "source": [ + "%matplotlib inline\n", + "# Importing standard Qiskit libraries and configuring account\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", + "from qiskit.compiler import transpile, assemble\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "# Loading your IBM Q account(s)\n", + "provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aplicação do algoritmo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 1\n", + "\n", + " Nossa aplicação utilizará um vetor com 4 indices ou seja $N = 2^2$
\n", + " o que significa 2 qubits. Portanto o algoritmo inicial com $|0\\rangle^2$.
\n", + " Como o mostrado abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "qr = QuantumRegister(2)\n", + "cr = ClassicalRegister(2)\n", + "grover = QuantumCircuit(qr, cr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 2\n", + "\n", + "Nós utilizamos o Hadamard para computar as superposições.\n", + "\n", + "$|\\psi\\rangle = \\frac{1}{\\sqrt{N}} \\sum_{x=0}^{N-1}|x\\rangle$" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "grover.h(qr[0])\n", + "grover.h(qr[1])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 3\n", + "\n", + "O passo três pode ser quebrado em 4 subpassos
\n", + "e é onde o algoritmo de fato começa
\n", + "\n", + "1) Aplicar o oracle *O*
\n", + "2) Aplicar a transformação de $H^n$ de Hadamard
\n", + "3) Aplicar a mudança condicional de fase
\n", + "para todas as bases computacionais execeto para $|0\\rangle$ recebendo a fase de -1
\n", + "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$
\n", + "4) Aplicar a transformação de $H^n$ de Hadamard novamente
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From fe28643eb24628cde30e38d9628005316dd576b8 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Sat, 3 Aug 2019 10:56:22 -0300 Subject: [PATCH 18/49] updating grover --- grover.ipynb | 1 + 1 file changed, 1 insertion(+) diff --git a/grover.ipynb b/grover.ipynb index 1f26617..8789c01 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -135,3 +135,4 @@ "nbformat": 4, "nbformat_minor": 2 } + From bf2dbc9c4da0a81aead64d88b3098e8aba1118f1 Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Mon, 5 Aug 2019 16:00:09 -0300 Subject: [PATCH 19/49] =?UTF-8?q?Continua=C3=A7=C3=A3o=20do=20algoritmo=20?= =?UTF-8?q?de=20grover?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grover.ipynb | 145 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 126 insertions(+), 19 deletions(-) diff --git a/grover.ipynb b/grover.ipynb index 8789c01..4d98791 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -4,16 +4,7 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/conda/lib/python3.7/site-packages/qiskit/providers/ibmq/ibmqfactory.py:181: UserWarning: Credentials are already in use. The existing account in the session will be replaced.\n", - " warnings.warn('Credentials are already in use. The existing '\n" - ] - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "# Importing standard Qiskit libraries and configuring account\n", @@ -33,24 +24,114 @@ "## Aplicação do algoritmo" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Antes de começarmos\n", + "\n", + "Antes de darmos início ao algoritmo precisamos considerar o que queremos buscar.\n", + "\n", + "No nosso exemplo iremos considerar o vetor $v$ tal que$ v = [ 66, 57, 67, 68 ]$. Agora vamos assumir \n", + "queremos encontrar o valor 67 que entre os indíces 0 - 3 está na posição 2.\n", + "\n", + " A parti de agora vamos considerar os indíces do vetor e não mais os valores em si. Transformando os indíces em binário teremos um vetor $v'$ tal que $v' = [ 00, 01, 10, 11 ]$. E queremos portanto o indíce 10 (2). \n", + " \n", + "Tendo isso em mente devemos desenvolver uma função $f$ que irá \"marcar\" o indíce que nós estamos buscando retornando o 1 se o valor do indíce corresponde ao valor buscado e 0 caso contrário. Portanto a função terá o seguinte comportamento:\n", + "\n", + "**Função:**\n", + "\n", + "

$f(00) \\rightarrow 0$ | $f(10) \\rightarrow 1$

\n", + "

$f(01) \\rightarrow 0$ | $f(11) \\rightarrow 0$

\n", + "\n", + "**Assim ao implementarmos teremos o seguinte comportamento:**\n", + "\n", + "

$|00, 0 \\oplus f(00)\\rangle$ $\\rightarrow$ $|00,0\\rangle$ | \n", + " $|01, 0 \\oplus f(10)\\rangle$ $\\rightarrow$ $|01, 0\\rangle$

\n", + "

$|10, 0 \\oplus f(10)\\rangle$ $\\rightarrow$ $|10,1\\rangle$ | \n", + " $|11, 0 \\oplus f(11)\\rangle$ $\\rightarrow$ $|11, 0\\rangle$

\n", + "\n", + "*Obs.: $\\oplus$ é a soma modulo 2.*\n", + "\n", + "Dessa forma quando a função retornar 1 o último qubit mudara de 0 para 1. Um outra foram de implementarmos isso é cosiderando o último qubit como $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ e assim quando a função retornar um o sinal será mudado, isso pode ser representado da seguinte forma:\n", + "$$ O\n", + "|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big) \\rightarrow (-1)^{f(x)}|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big) \n", + "$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Implementando a função (Oracle)\n", + "\n", + "A função pode ser implementada com um portão Not e Toffoli como mostrado abaixo:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qub = QuantumRegister(3)\n", + "function = QuantumCircuit(qub)\n", + "\n", + "#--- Função ---\n", + "function.x(qub[1])\n", + "function.ccx(qub[0], qub[1], qub[2])\n", + "\n", + "function.draw()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Implementando o Algoritmo de Grover" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Agora que temos todas informações necessárias podemos de fato parti para implementação do algoritmo
que pode ser separado nós seguintes passos:\n" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Passo 1\n", "\n", - " Nossa aplicação utilizará um vetor com 4 indices ou seja $N = 2^2$
\n", - " o que significa 2 qubits. Portanto o algoritmo inicial com $|0\\rangle^2$.
\n", + " Nossa aplicação utilizará um vetor com 4 indices ou seja $N = 2^2$ \n", + " o que significa 2 qubits. Portanto o algoritmo inicial com $|0\\rangle^2$\n", + " e um qubit auxiliar para aplicação da nossa função (Oracle).\n", " Como o mostrado abaixo:" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ - "qr = QuantumRegister(2)\n", + "qr = QuantumRegister(3)\n", "cr = ClassicalRegister(2)\n", "grover = QuantumCircuit(qr, cr)" ] @@ -63,7 +144,7 @@ "\n", "Nós utilizamos o Hadamard para computar as superposições.\n", "\n", - "$|\\psi\\rangle = \\frac{1}{\\sqrt{N}} \\sum_{x=0}^{N-1}|x\\rangle$" + "$|\\psi\\rangle = \\frac{1}{\\sqrt{N}} \\sum_{x=0}^{N-1}|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big)$" ] }, { @@ -83,9 +164,13 @@ } ], "source": [ - "\n", + "#-- indíces --\n", "grover.h(qr[0])\n", - "grover.h(qr[1])\n" + "grover.h(qr[1])\n", + "\n", + "#---qubit auxiliar ----\n", + "grover.x(qr[2])\n", + "grover.h(qr[2])\n" ] }, { @@ -105,12 +190,35 @@ "4) Aplicar a transformação de $H^n$ de Hadamard novamente
" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aplicando do nosso oracle\n", + "\n", + "Como vimos anteriormente nós precisamos criar um circuito que implementasse
\n", + "nossa função (Oracle) e dessa forma sermos capazes de \"marcar\" o indíce que buscamos
\n", + "que nesse caso é 2 ou 10.
\n", + "\n" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "#--- Função ---\n", + "grover.x(qr[1])\n", + "grover.ccx(qr[0], qr[1], qr[2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Agora aplicaremos a transformação de Hadamard e a mudança condicional de fase." + ] } ], "metadata": { @@ -135,4 +243,3 @@ "nbformat": 4, "nbformat_minor": 2 } - From ded121083c7a8d7b9b6be81a3e3cf63394a48bda Mon Sep 17 00:00:00 2001 From: Tiago de Lima Date: Mon, 5 Aug 2019 19:54:24 -0300 Subject: [PATCH 20/49] =?UTF-8?q?O=20algoritmo=20est=C3=A1=20implementado?= =?UTF-8?q?=20por=C3=A9m=20h=C3=A1=20algo=20errado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grover.ipynb | 242 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 231 insertions(+), 11 deletions(-) diff --git a/grover.ipynb b/grover.ipynb index 4d98791..95da4b7 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -72,17 +72,17 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] }, - "execution_count": 11, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -127,12 +127,12 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 120, "metadata": {}, "outputs": [], "source": [ "qr = QuantumRegister(3)\n", - "cr = ClassicalRegister(2)\n", + "cr = ClassicalRegister(3)\n", "grover = QuantumCircuit(qr, cr)" ] }, @@ -149,16 +149,16 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 4, + "execution_count": 121, "metadata": {}, "output_type": "execute_result" } @@ -199,14 +199,27 @@ "Como vimos anteriormente nós precisamos criar um circuito que implementasse
\n", "nossa função (Oracle) e dessa forma sermos capazes de \"marcar\" o indíce que buscamos
\n", "que nesse caso é 2 ou 10.
\n", + "\n", + "**Subpasso 1**\n", "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 122, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#--- Função ---\n", "grover.x(qr[1])\n", @@ -217,8 +230,215 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Agora aplicaremos a transformação de Hadamard e a mudança condicional de fase." + "\n", + "\n", + "Agora aplicaremos a transformação de Hadamard \n", + "\n", + "**Subpasso 2**\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grover.h(qr[0])\n", + "grover.h(qr[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Realizando o próximo passo realizaremos a mudança condicional
\n", + "de fase para cada base computacional onde $|0\\rangle$.
\n", + "\n", + "**Subpasso 3**\n" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "grover.z(qr[0])\n", + "grover.z(qr[1])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Agora aplicaremos a transformação de Hadamard novamente\n", + "\n", + "**Subpasso 4**\n" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grover.h(qr[0])\n", + "grover.h(qr[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 3\n", + "\n", + "Agora repitiremos os subpassos de 1 a 4, porque são necessárias $\\sqrt{N}$ interações,
\n", + "onde N é tamanho do nosso vetor que no nosso caso é 4, o que nós dá 2 iterações.
\n", + "\n" ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#--- Função ---\n", + "grover.x(qr[1])\n", + "grover.ccx(qr[0], qr[1], qr[2])\n", + "\n", + "#---Hadamard\n", + "\n", + "grover.h(qr[0])\n", + "grover.h(qr[1])\n", + "\n", + "\n", + "#----Troca de fase\n", + "\n", + "grover.z(qr[0])\n", + "grover.z(qr[1])\n", + "\n", + "\n", + "#--- Hadarmard\n", + "\n", + "grover.h(qr[0])\n", + "grover.h(qr[1])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 4\n", + "\n", + "Agora que já fizemos as iterações necessárias vamos fazer a medição e o valor
\n", + "obtido deve ser o indíce que nós buscamos que nesse caso é 10 (2)." + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grover.measure(qr, cr)\n", + "\n", + "grover.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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p3DIIYc0lunatSv/9V//xfPPP7/be9u1a8ezzz7L/vvvz86dO/nyl7/MiSeeyJFHHsnDDz/cWO7GG2+kc+fOOdsnyR/VQEWkxZg5cyaf//zn6dOnD23btuXss8/mhRde2K1MWVkZhx12GK1b716/MDP2339/AHbu3MmuXbsws93KuDvPPvssX/3qV7O7I1IQlEBFpMWoq6vjoIMOanxdUVFBXV1dyu+vr69nxIgRDBo0iJEjR3LEEUfstn7GjBl87nOfo1+/+GmNZV+kBCoiLYa777EsvhbZlJKSEqZNm8bcuXOZNWsW8+fP3239xIkTOfvss5sdpxQHJVARSVs2GuI0mDBhAqWlpaxduzbjcVdUVPDBBx80vl61ahU9evRIeztdunTh2GOP5ZVXXmlctmvXLp577jm+8pWvZCRWKXxKoCKSloaGOL/97W+ZMWMGEydO5O9///tuZRoa4owZM2a35Q0NcV577TWmTZvGK6+8wltvvdW4fuXKlUydOpWePXtmJfbDDjuMJUuWsHz5cnbs2MGkSZM45ZRTUnrvxx9/zIYNGwDYunUrr776KgMHDmxcP3XqVAYMGLDbJWLZt6kVroikJbYhDtDYECe2JWtZWRllZWVMnjx5t/furSHODTfcwK233soFF1yQldhbt27NHXfcwTnnnEN9fT0XXHABlZWVPPLIIwBcfPHFrF69muOPP55NmzbRqlUr7r//fmbMmMHq1au58sorqa+v59NPP+Wss87i5JNPbtz2M888o8ZDLYwSqIikJVFDnJkzZ6b8/vr6eo477jiWLl3Kt771rcaGOC+88ALl5eVUVVVlPOZYo0aNYtSoUbstu/jiixufd+/enXnz5u3xviFDhvDqq68m3e69996buSClKCiBikhaMtUQZ8OGDVx44YXMnz+fPn36MH78eCZNmpTJUEWySvdARSQt2WiIs2zZMlasWMHw4cOprq5m1apVjBw5ktWrV2cydJGMUgIVkbRkoyHO4MGDee+996itraW2tpaKigqmTp1K9+7ds7krIs2iS7gikpZsNsQRKSaW6H5GS1FTU+NTpkzJdxgiIlJASktLZ7r7EXsrp0u4zRS1Q/nKlSs588wzOeqooxg2bBj3339/47q5c+dy0kknceyxx3LeeeexcePGnOyLiIikTgm0GZrTobx169b86Ec/4m9/+xuTJ0/m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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Select the QasmSimulator from the Aer provider\n", + "simulator = Aer.get_backend('qasm_simulator')\n", + "\n", + "# Execute and get counts\n", + "result = execute(grover, simulator).result()\n", + "counts = result.get_counts(grover)\n", + "plot_histogram(counts, title='O indíce procurado')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 7f2b80e78833f8333c03b9306bb326a532a27f2f Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Tue, 6 Aug 2019 17:14:10 -0300 Subject: [PATCH 21/49] =?UTF-8?q?Introdu=C3=A7=C3=A3o=20e=20constru=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20sistema?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .ipynb_checkpoints/grover-checkpoint.ipynb | 559 +++++++++++++++++++++ deutsch_jozsa.ipynb | 2 +- grover.ipynb | 96 +++- 3 files changed, 655 insertions(+), 2 deletions(-) create mode 100644 .ipynb_checkpoints/grover-checkpoint.ipynb diff --git a/.ipynb_checkpoints/grover-checkpoint.ipynb b/.ipynb_checkpoints/grover-checkpoint.ipynb new file mode 100644 index 0000000..148ab3a --- /dev/null +++ b/.ipynb_checkpoints/grover-checkpoint.ipynb @@ -0,0 +1,559 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "# Importing standard Qiskit libraries and configuring account\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", + "from qiskit.compiler import transpile, assemble\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "# Loading your IBM Q account(s)\n", + "provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Algoritmo de Grover\n", + "- Introdução\n", + "- Construção do Sistema\n", + "- Inversão sobre a média\n", + "- Aplicação do algoritmo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Observações dos autores\n", + "\n", + "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", + "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introdução \n", + "\n", + " Dado um array dezordenado de elementos de tamanho $n$, como fazer para achar um elemento específico no mesmo? A solução mais simples que não envolve a ordenação do array implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições.\n", + " \n", + " O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{n}$ vezes. Em muitos trabalhos e livros de computação quântica, considera-se o tamanho da entrada como sendo $n =2^N$ para $N$ sendo o número de qubits no sistema.\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Construção do Sistema\n", + "\n", + " Considere o operador unitário $U_f$ que implementa a função $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", + " $$\n", + " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", + " $$\n", + " \n", + " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancila).\n", + " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de faze_.\n", + " \n", + " \n", + " Considere uma entrada qualquer $|x\\rangle$. O estado inicial do sistema se encontraria como a seguir:\n", + " $$\n", + " |x\\rangle\\left( \\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\right)\n", + " $$\n", + " \n", + " Distribuindo e aplicando $U_f$\n", + " \n", + " $$\n", + " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = U_f\\left[ \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) \\right]\n", + " $$\n", + " $$\n", + " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x) \\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right) \n", + " $$\n", + " \n", + " Sabendo que $\\oplus$ opera como um $XOR$ nos estados dos qubits, é possivel verificar que a operação $|1 \\oplus f(x)\\rangle$ trata-se da negação de $f(x)$. \n", + " Ou seja:\n", + " $$\n", + " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " Levando este resultado em consideração, então a faze do sistema (ou sinal da equação) é determinada pelo resultado da função **(verificar esta afirmação)**, matematicamente falando:\n", + " $$\n", + " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " _Relembrando que recomendamos fortemente ao leitor que reveja os conceitos apresentados no módulo que fala sobre o algoritmo de Deutsch e Deutsch-Jozsa_.\n", + " Terminadas nossas observações quanto a _inversão de faze_ podemos prosseguir para o algoritmo. \n", + " \n", + " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancila enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", + " \n", + " Para um sistema cuja entrada tem três qubits, o estado se encontraria como a seguir:\n", + " $$\n", + " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " \n", + " Agora seja $f$ uma função que \"busca\" pela cadeia $011$, então ao aplicar a inversão de faze o estado resultante ficaria da seguinte forma **(verificar afirmação)**:\n", + " \n", + " $$\n", + " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " \n", + " Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2\\sqrt{2}} \\right|^2 = \\left| - \\frac{1}{2\\sqrt{2}} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", + " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. \n", + " \n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aplicação do algoritmo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Antes de começarmos\n", + "\n", + "Antes de darmos início ao algoritmo precisamos considerar o que queremos buscar.\n", + "\n", + "No nosso exemplo iremos considerar o vetor $v$ tal que$ v = [ 66, 57, 67, 68 ]$. Agora vamos assumir \n", + "queremos encontrar o valor 67 que entre os indíces 0 - 3 está na posição 2.\n", + "\n", + " A parti de agora vamos considerar os indíces do vetor e não mais os valores em si. Transformando os indíces em binário teremos um vetor $v'$ tal que $v' = [ 00, 01, 10, 11 ]$. E queremos portanto o indíce 10 (2). \n", + " \n", + "Tendo isso em mente devemos desenvolver uma função $f$ que irá \"marcar\" o indíce que nós estamos buscando retornando o 1 se o valor do indíce corresponde ao valor buscado e 0 caso contrário. Portanto a função terá o seguinte comportamento:\n", + "\n", + "**Função:**\n", + "\n", + "

$f(00) \\rightarrow 0$ | $f(10) \\rightarrow 1$

\n", + "

$f(01) \\rightarrow 0$ | $f(11) \\rightarrow 0$

\n", + "\n", + "**Assim ao implementarmos teremos o seguinte comportamento:**\n", + "\n", + "

$|00, 0 \\oplus f(00)\\rangle$ $\\rightarrow$ $|00,0\\rangle$ | \n", + " $|01, 0 \\oplus f(10)\\rangle$ $\\rightarrow$ $|01, 0\\rangle$

\n", + "

$|10, 0 \\oplus f(10)\\rangle$ $\\rightarrow$ $|10,1\\rangle$ | \n", + " $|11, 0 \\oplus f(11)\\rangle$ $\\rightarrow$ $|11, 0\\rangle$

\n", + "\n", + "*Obs.: $\\oplus$ é a soma modulo 2.*\n", + "\n", + "Dessa forma quando a função retornar 1 o último qubit mudara de 0 para 1. Um outra foram de implementarmos isso é cosiderando o último qubit como $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ e assim quando a função retornar um o sinal será mudado, isso pode ser representado da seguinte forma:\n", + "$$ O\n", + "|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big) \\rightarrow (-1)^{f(x)}|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big) \n", + "$$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Implementando a função (Oracle)\n", + "\n", + "A função pode ser implementada com um portão Not e Toffoli como mostrado abaixo:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qub = QuantumRegister(3)\n", + "function = QuantumCircuit(qub)\n", + "\n", + "#--- Função ---\n", + "function.x(qub[1])\n", + "function.ccx(qub[0], qub[1], qub[2])\n", + "\n", + "function.draw()\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Implementando o Algoritmo de Grover" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Agora que temos todas informações necessárias podemos de fato parti para implementação do algoritmo
que pode ser separado nós seguintes passos:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 1\n", + "\n", + " Nossa aplicação utilizará um vetor com 4 indices ou seja $N = 2^2$ \n", + " o que significa 2 qubits. Portanto o algoritmo inicial com $|0\\rangle^2$\n", + " e um qubit auxiliar para aplicação da nossa função (Oracle).\n", + " Como o mostrado abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "qr = QuantumRegister(3)\n", + "cr = ClassicalRegister(3)\n", + "grover = QuantumCircuit(qr, cr)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 2\n", + "\n", + "Nós utilizamos o Hadamard para computar as superposições.\n", + "\n", + "$|\\psi\\rangle = \\frac{1}{\\sqrt{N}} \\sum_{x=0}^{N-1}|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big)$" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#-- indíces --\n", + "grover.h(qr[0])\n", + "grover.h(qr[1])\n", + "\n", + "#---qubit auxiliar ----\n", + "grover.x(qr[2])\n", + "grover.h(qr[2])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 3\n", + "\n", + "O passo três pode ser quebrado em 4 subpassos
\n", + "e é onde o algoritmo de fato começa
\n", + "\n", + "1) Aplicar o oracle *O*
\n", + "2) Aplicar a transformação de $H^n$ de Hadamard
\n", + "3) Aplicar a mudança condicional de fase
\n", + "para todas as bases computacionais execeto para $|0\\rangle$ recebendo a fase de -1
\n", + "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$
\n", + "4) Aplicar a transformação de $H^n$ de Hadamard novamente
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aplicando do nosso oracle\n", + "\n", + "Como vimos anteriormente nós precisamos criar um circuito que implementasse
\n", + "nossa função (Oracle) e dessa forma sermos capazes de \"marcar\" o indíce que buscamos
\n", + "que nesse caso é 2 ou 10.
\n", + "\n", + "**Subpasso 1**\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#--- Função ---\n", + "grover.x(qr[1])\n", + "grover.ccx(qr[0], qr[1], qr[2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "Agora aplicaremos a transformação de Hadamard \n", + "\n", + "**Subpasso 2**\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grover.h(qr[0])\n", + "grover.h(qr[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Realizando o próximo passo realizaremos a mudança condicional
\n", + "de fase para cada base computacional onde $|0\\rangle$.
\n", + "\n", + "**Subpasso 3**\n" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "grover.z(qr[0])\n", + "grover.z(qr[1])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Agora aplicaremos a transformação de Hadamard novamente\n", + "\n", + "**Subpasso 4**\n" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 125, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grover.h(qr[0])\n", + "grover.h(qr[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 3\n", + "\n", + "Agora repitiremos os subpassos de 1 a 4, porque são necessárias $\\sqrt{N}$ interações,
\n", + "onde N é tamanho do nosso vetor que no nosso caso é 4, o que nós dá 2 iterações.
\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#--- Função ---\n", + "grover.x(qr[1])\n", + "grover.ccx(qr[0], qr[1], qr[2])\n", + "\n", + "#---Hadamard\n", + "\n", + "grover.h(qr[0])\n", + "grover.h(qr[1])\n", + "\n", + "\n", + "#----Troca de fase\n", + "\n", + "grover.z(qr[0])\n", + "grover.z(qr[1])\n", + "\n", + "\n", + "#--- Hadarmard\n", + "\n", + "grover.h(qr[0])\n", + "grover.h(qr[1])\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Passo 4\n", + "\n", + "Agora que já fizemos as iterações necessárias vamos fazer a medição e o valor
\n", + "obtido deve ser o indíce que nós buscamos que nesse caso é 10 (2)." + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "grover.measure(qr, cr)\n", + "\n", + "grover.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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p3DIIYc0lunatSv/9V//xfPPP7/be9u1a8ezzz7L/vvvz86dO/nyl7/MiSeeyJFHHsnDDz/cWO7GG2+kc+fOOdsnyR/VQEWkxZg5cyaf//zn6dOnD23btuXss8/mhRde2K1MWVkZhx12GK1b716/MDP2339/AHbu3MmuXbsws93KuDvPPvssX/3qV7O7I1IQlEBFpMWoq6vjoIMOanxdUVFBXV1dyu+vr69nxIgRDBo0iJEjR3LEEUfstn7GjBl87nOfo1+/+GmNZV+kBCoiLYa777EsvhbZlJKSEqZNm8bcuXOZNWsW8+fP3239xIkTOfvss5sdpxQHJVARSVs2GuI0mDBhAqWlpaxduzbjcVdUVPDBBx80vl61ahU9evRIeztdunTh2GOP5ZVXXmlctmvXLp577jm+8pWvZCRWKXxKoCKSloaGOL/97W+ZMWMGEydO5O9///tuZRoa4owZM2a35Q0NcV577TWmTZvGK6+8wltvvdW4fuXKlUydOpWePXtmJfbDDjuMJUuWsHz5cnbs2MGkSZM45ZRTUnrvxx9/zIYNGwDYunUrr776KgMHDmxcP3XqVAYMGLDbJWLZt6kVroikJbYhDtDYECe2JWtZWRllZWVMnjx5t/furSHODTfcwK233soFF1yQldhbt27NHXfcwTnnnEN9fT0XXHABlZWVPPLIIwBcfPHFrF69muOPP55NmzbRqlUr7r//fmbMmMHq1au58sorqa+v59NPP+Wss87i5JNPbtz2M888o8ZDLYwSqIikJVFDnJkzZ6b8/vr6eo477jiWLl3Kt771rcaGOC+88ALl5eVUVVVlPOZYo0aNYtSoUbstu/jiixufd+/enXnz5u3xviFDhvDqq68m3e69996buSClKCiBikhaMtUQZ8OGDVx44YXMnz+fPn36MH78eCZNmpTJUEWySvdARSQt2WiIs2zZMlasWMHw4cOprq5m1apVjBw5ktWrV2cydJGMUgIVkbRkoyHO4MGDee+996itraW2tpaKigqmTp1K9+7ds7krIs2iS7gikpZsNsQRKSaW6H5GS1FTU+NTpkzJdxgiIlJASktLZ7r7EXsrp0u4zRS1Q/nKlSs588wzOeqooxg2bBj3339/47q5c+dy0kknceyxx3LeeeexcePGnOyLiIikTgm0GZrTobx169b86Ec/4m9/+xuTJ0/m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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Select the QasmSimulator from the Aer provider\n", + "simulator = Aer.get_backend('qasm_simulator')\n", + "\n", + "# Execute and get counts\n", + "result = execute(grover, simulator).result()\n", + "counts = result.get_counts(grover)\n", + "plot_histogram(counts, title='O indíce procurado')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index f220b06..129fb06 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -311,7 +311,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.6.8" } }, "nbformat": 4, diff --git a/grover.ipynb b/grover.ipynb index 95da4b7..148ab3a 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -17,6 +17,100 @@ "provider = IBMQ.load_account()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Algoritmo de Grover\n", + "- Introdução\n", + "- Construção do Sistema\n", + "- Inversão sobre a média\n", + "- Aplicação do algoritmo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Observações dos autores\n", + "\n", + "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", + "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introdução \n", + "\n", + " Dado um array dezordenado de elementos de tamanho $n$, como fazer para achar um elemento específico no mesmo? A solução mais simples que não envolve a ordenação do array implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições.\n", + " \n", + " O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{n}$ vezes. Em muitos trabalhos e livros de computação quântica, considera-se o tamanho da entrada como sendo $n =2^N$ para $N$ sendo o número de qubits no sistema.\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Construção do Sistema\n", + "\n", + " Considere o operador unitário $U_f$ que implementa a função $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", + " $$\n", + " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", + " $$\n", + " \n", + " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancila).\n", + " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de faze_.\n", + " \n", + " \n", + " Considere uma entrada qualquer $|x\\rangle$. O estado inicial do sistema se encontraria como a seguir:\n", + " $$\n", + " |x\\rangle\\left( \\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\right)\n", + " $$\n", + " \n", + " Distribuindo e aplicando $U_f$\n", + " \n", + " $$\n", + " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = U_f\\left[ \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) \\right]\n", + " $$\n", + " $$\n", + " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x) \\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right) \n", + " $$\n", + " \n", + " Sabendo que $\\oplus$ opera como um $XOR$ nos estados dos qubits, é possivel verificar que a operação $|1 \\oplus f(x)\\rangle$ trata-se da negação de $f(x)$. \n", + " Ou seja:\n", + " $$\n", + " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " Levando este resultado em consideração, então a faze do sistema (ou sinal da equação) é determinada pelo resultado da função **(verificar esta afirmação)**, matematicamente falando:\n", + " $$\n", + " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " _Relembrando que recomendamos fortemente ao leitor que reveja os conceitos apresentados no módulo que fala sobre o algoritmo de Deutsch e Deutsch-Jozsa_.\n", + " Terminadas nossas observações quanto a _inversão de faze_ podemos prosseguir para o algoritmo. \n", + " \n", + " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancila enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", + " \n", + " Para um sistema cuja entrada tem três qubits, o estado se encontraria como a seguir:\n", + " $$\n", + " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " \n", + " Agora seja $f$ uma função que \"busca\" pela cadeia $011$, então ao aplicar a inversão de faze o estado resultante ficaria da seguinte forma **(verificar afirmação)**:\n", + " \n", + " $$\n", + " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " \n", + " Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2\\sqrt{2}} \\right|^2 = \\left| - \\frac{1}{2\\sqrt{2}} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", + " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. \n", + " \n", + " \n", + " " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -457,7 +551,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.6.8" } }, "nbformat": 4, From 547f61169149633479843ccc0b2569ce4e1f3df8 Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Wed, 7 Aug 2019 11:36:39 -0300 Subject: [PATCH 22/49] =?UTF-8?q?Invers=C3=A3o=20sobre=20a=20m=C3=A9dia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Explicação de inversão sobre a média, concluida --- .ipynb_checkpoints/grover-checkpoint.ipynb | 58 ++++++++++++++++++++-- grover.ipynb | 58 ++++++++++++++++++++-- 2 files changed, 110 insertions(+), 6 deletions(-) diff --git a/.ipynb_checkpoints/grover-checkpoint.ipynb b/.ipynb_checkpoints/grover-checkpoint.ipynb index 148ab3a..a26c6cd 100644 --- a/.ipynb_checkpoints/grover-checkpoint.ipynb +++ b/.ipynb_checkpoints/grover-checkpoint.ipynb @@ -35,7 +35,7 @@ "## Observações dos autores\n", "\n", "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", - "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado. \n" + "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado, assim como os exemplos mostrados durante a explicação. Portanto esperamos que o leitor esteja pronto com papel e lapis em mãos, pois a melhor maneira de se aprender assuntos muito técnicos que envolvem muita matemática é: fazendo. \n" ] }, { @@ -56,7 +56,7 @@ "source": [ "## Construção do Sistema\n", "\n", - " Considere o operador unitário $U_f$ que implementa a função $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", + " Considere o operador unitário $U_f$ que implementa a função(ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", " $$\n", " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", " $$\n", @@ -79,7 +79,7 @@ " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x) \\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right) \n", " $$\n", " \n", - " Sabendo que $\\oplus$ opera como um $XOR$ nos estados dos qubits, é possivel verificar que a operação $|1 \\oplus f(x)\\rangle$ trata-se da negação de $f(x)$. \n", + " Sabendo que $\\oplus$ o qual trata-se de uma soma módulo 2, opera como um $XOR$ nos estados dos qubits. É possivel verificar que a operação $|1 \\oplus f(x)\\rangle$ trata-se da negação de $f(x)$. \n", " Ou seja:\n", " $$\n", " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", @@ -111,6 +111,58 @@ " " ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inversão sobre a média\n", + "\n", + " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", + " \n", + " *Exercício*: Calcule os valores invertidos sobre a média de cada valor do vetor $\\left[4,5,10,3,3\\right]$\n", + " \n", + " Agora considere que ao inves de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", + " \n", + " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", + " $$\\left[\\begin{array}{ccccc}\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\end{array}\\right]\n", + " \\left[\\begin{array}{c}\n", + " 4 \\\\\n", + " 5 \\\\\n", + " 10\\\\\n", + " 3 \\\\\n", + " 3 \\\\\n", + " \\end{array}\\right] \n", + " = \n", + " \\left[\\begin{array}{c}\n", + " 5 \\\\\n", + " 5 \\\\\n", + " 5\\\\\n", + " 5 \\\\\n", + " 5 \\\\\n", + " \\end{array}\\right]$$\n", + " \n", + " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", + " \n", + " *Exercício*: Mostre que $A^2 = A$\n", + " \n", + " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", + " $$\n", + " \\bar{V} = -V + 2AV \n", + " $$\n", + " Evidenciando o vetor $V$ obtemos: $(-I + 2A)V$. Desse modo, o operador de inversão sobre a média é obtido a partir da operação matricial: \n", + " $$\n", + " -I + 2A\n", + " $$\n", + " \n", + " *Exercício*: Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. " + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/grover.ipynb b/grover.ipynb index 148ab3a..a26c6cd 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -35,7 +35,7 @@ "## Observações dos autores\n", "\n", "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", - "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado. \n" + "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado, assim como os exemplos mostrados durante a explicação. Portanto esperamos que o leitor esteja pronto com papel e lapis em mãos, pois a melhor maneira de se aprender assuntos muito técnicos que envolvem muita matemática é: fazendo. \n" ] }, { @@ -56,7 +56,7 @@ "source": [ "## Construção do Sistema\n", "\n", - " Considere o operador unitário $U_f$ que implementa a função $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", + " Considere o operador unitário $U_f$ que implementa a função(ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", " $$\n", " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", " $$\n", @@ -79,7 +79,7 @@ " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x) \\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right) \n", " $$\n", " \n", - " Sabendo que $\\oplus$ opera como um $XOR$ nos estados dos qubits, é possivel verificar que a operação $|1 \\oplus f(x)\\rangle$ trata-se da negação de $f(x)$. \n", + " Sabendo que $\\oplus$ o qual trata-se de uma soma módulo 2, opera como um $XOR$ nos estados dos qubits. É possivel verificar que a operação $|1 \\oplus f(x)\\rangle$ trata-se da negação de $f(x)$. \n", " Ou seja:\n", " $$\n", " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", @@ -111,6 +111,58 @@ " " ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inversão sobre a média\n", + "\n", + " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", + " \n", + " *Exercício*: Calcule os valores invertidos sobre a média de cada valor do vetor $\\left[4,5,10,3,3\\right]$\n", + " \n", + " Agora considere que ao inves de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", + " \n", + " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", + " $$\\left[\\begin{array}{ccccc}\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\end{array}\\right]\n", + " \\left[\\begin{array}{c}\n", + " 4 \\\\\n", + " 5 \\\\\n", + " 10\\\\\n", + " 3 \\\\\n", + " 3 \\\\\n", + " \\end{array}\\right] \n", + " = \n", + " \\left[\\begin{array}{c}\n", + " 5 \\\\\n", + " 5 \\\\\n", + " 5\\\\\n", + " 5 \\\\\n", + " 5 \\\\\n", + " \\end{array}\\right]$$\n", + " \n", + " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", + " \n", + " *Exercício*: Mostre que $A^2 = A$\n", + " \n", + " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", + " $$\n", + " \\bar{V} = -V + 2AV \n", + " $$\n", + " Evidenciando o vetor $V$ obtemos: $(-I + 2A)V$. Desse modo, o operador de inversão sobre a média é obtido a partir da operação matricial: \n", + " $$\n", + " -I + 2A\n", + " $$\n", + " \n", + " *Exercício*: Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. " + ] + }, { "cell_type": "markdown", "metadata": {}, From 0c52aec264a43d965b7d595223149a8beccbb063 Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Wed, 7 Aug 2019 12:46:04 -0300 Subject: [PATCH 23/49] Exemplo algoritmo de Grover MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Elaboração de um exemplo numérico para uma entrada com 3 qubits concluída --- .ipynb_checkpoints/grover-checkpoint.ipynb | 80 ++++++++++++++++++++-- grover.ipynb | 80 ++++++++++++++++++++-- 2 files changed, 150 insertions(+), 10 deletions(-) diff --git a/.ipynb_checkpoints/grover-checkpoint.ipynb b/.ipynb_checkpoints/grover-checkpoint.ipynb index a26c6cd..1271766 100644 --- a/.ipynb_checkpoints/grover-checkpoint.ipynb +++ b/.ipynb_checkpoints/grover-checkpoint.ipynb @@ -25,6 +25,7 @@ "- Introdução\n", "- Construção do Sistema\n", "- Inversão sobre a média\n", + "- Exemplo\n", "- Aplicação do algoritmo" ] }, @@ -35,7 +36,9 @@ "## Observações dos autores\n", "\n", "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", - "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado, assim como os exemplos mostrados durante a explicação. Portanto esperamos que o leitor esteja pronto com papel e lapis em mãos, pois a melhor maneira de se aprender assuntos muito técnicos que envolvem muita matemática é: fazendo. \n" + "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado, assim como os exemplos mostrados durante a explicação. Portanto esperamos que o leitor esteja pronto com papel e lápis em mãos, pois a melhor maneira de se aprender assuntos muito técnicos que envolvem muita matemática é: fazendo. Portanto, para encorajar o leitor a \"por a mão na massa\" colocamos alguns textos em negrito como: **Exercício**, **(verifique esta afirmação)** ou **curiosidade**. \n", + " \n", + "\n" ] }, { @@ -84,7 +87,7 @@ " $$\n", " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", - " Levando este resultado em consideração, então a faze do sistema (ou sinal da equação) é determinada pelo resultado da função **(verificar esta afirmação)**, matematicamente falando:\n", + " Levando este resultado em consideração, então a faze do sistema (ou sinal da equação) é determinada pelo resultado da função **(verifique esta afirmação)**, matematicamente falando:\n", " $$\n", " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", @@ -98,7 +101,7 @@ " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", " \n", - " Agora seja $f$ uma função que \"busca\" pela cadeia $011$, então ao aplicar a inversão de faze o estado resultante ficaria da seguinte forma **(verificar afirmação)**:\n", + " Agora seja $f$ uma função que \"busca\" pela cadeia $011$, então ao aplicar a inversão de faze o estado resultante ficaria da seguinte forma **(verifique afirmação)**:\n", " \n", " $$\n", " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", @@ -149,7 +152,7 @@ " \n", " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", " \n", - " *Exercício*: Mostre que $A^2 = A$\n", + " **Exercício**: Mostre que $A^2 = A$\n", " \n", " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", " $$\n", @@ -160,7 +163,74 @@ " -I + 2A\n", " $$\n", " \n", - " *Exercício*: Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. " + " **Exercício**: Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo \n", + " \n", + " Agora faremos um exemplo do algoritmo de Grover. Mais uma vez relembrando que aconselhamos ao leitor a estar de papel e lápis em mãos para refazer os exemplos, exercícios ou até mesmo testar casos diferentes. E não, não pararemos de \"bater nesta tecla\" pois trata-se de um excelente hábito principalmente para quem deseja aprender seja computação quântica, algebra linear, cálculo ou qualquer outra matéria semelhante. Agora , para o exemplo:\n", + " \n", + " Considere uma superposição de todos os estados possíveis de uma entrada de três qubits:\n", + " $$\n", + " \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\n", + " $$\n", + " \n", + " Este estado pode ser construido aplicando-se portas hadamard $H^{\\otimes 3}$ num estado de três qubits $|000\\rangle$ **(verifique esta afirmação)**.\n", + " Agora considere a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Desse modo o estado do sistema antes de se aplicar o _oracle_, ou seja o operador $U_f$ se encontrará na seguinte forma:\n", + " \n", + " $$\n", + " |\\psi_0\\rangle = \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right) \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\n", + " $$\n", + " \n", + " Considere que o _oracle_ implementa a função $f$ a qual a mesma \"escolhe\" a cadeia $011$ como cadeia a ser buscada. \n", + " No algoritmo de Grover é necessário rodar a aplicação do oracle e a operação de inversão sobre a média ao menos ${\\sqrt{n}}$ vezes. \n", + " Então para o caso de $3$ qubits até duas (arredondando para baixo) vezes será o suficente para o nosso exemplo, para ver o que acontece. Sabendo sobre o propósito da _ancila_ no sistema podemos omiti-la sem perda de generalização, porém nunca se esqueca que ela ainda está lá, ok?\n", + " \n", + " Aplicando o oracle em $|\\psi_0 \\rangle$ obtemos:\n", + " $$\n", + " |\\psi_1\\rangle = \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right) \n", + " $$\n", + " \n", + " Observe que a média das amplitudes de probabilidade dos qubits de entrada é $\\frac{3}{8\\sqrt{2}}$.\n", + " Então aplicando a inversão sobre a média em $| \\psi_1 \\rangle$ obtemos:\n", + " \n", + " $$\n", + " |\\psi_2\\rangle = \\frac{1}{4\\sqrt{2}}|000\\rangle+\\frac{1}{4\\sqrt{2}}|001\\rangle + \\frac{1}{4\\sqrt{2}}|010\\rangle + \\frac{5}{4\\sqrt{2}}|011\\rangle + \\frac{1}{4\\sqrt{2}}|100\\rangle + \\frac{1}{4\\sqrt{2}}|101\\rangle + \\frac{1}{4\\sqrt{2}}|110\\rangle + \\frac{1}{4\\sqrt{2}}|111\\rangle\n", + " $$\n", + " \n", + " \n", + " **Exercício**: Calcule a média e aplique a inversão sobre a média do estado $| \\psi_1\\rangle$\n", + " \n", + " \n", + " Mais uma vez aplicando $U_f |\\psi_1 \\rangle$ obtemos:\n", + " \n", + " $$\n", + " |\\psi_3\\rangle = \\frac{1}{4\\sqrt{2}}|000\\rangle+\\frac{1}{4\\sqrt{2}}|001\\rangle + \\frac{1}{4\\sqrt{2}}|010\\rangle - \\frac{5}{4\\sqrt{2}}|011\\rangle + \\frac{1}{4\\sqrt{2}}|100\\rangle + \\frac{1}{4\\sqrt{2}}|101\\rangle + \\frac{1}{4\\sqrt{2}}|110\\rangle + \\frac{1}{4\\sqrt{2}}|111\\rangle\n", + " $$\n", + " \n", + " \n", + " \n", + " \n", + " Aplicando novamente $(-I + 2A) |\\psi_2\\rangle$ obtemos:\n", + " $$\n", + " |\\psi_4\\rangle = -\\frac{1}{8\\sqrt{2}}|000\\rangle-\\frac{1}{8\\sqrt{2}}|001\\rangle -\\frac{1}{8\\sqrt{2}}|010\\rangle + \\frac{11}{8\\sqrt{2}}|011\\rangle -\\frac{1}{8\\sqrt{2}}|100\\rangle -\\frac{1}{8\\sqrt{2}}|101\\rangle -\\frac{1}{8\\sqrt{2}}|110\\rangle -\\frac{1}{8\\sqrt{2}}|111\\rangle\n", + " $$\n", + " \n", + " \n", + " A partir daqui já podemos mensurar os qubits da entrada. Observe que a probabilidade do sistema retornar $|011\\rangle$ é bem maior que retornar qualquer outro estado. Mais especificamente $\\left|\\frac{11}{8\\sqrt{2}}\\right|^2 = 0,9453125$, enquanto que $\\left|-\\frac{1}{8\\sqrt{2}}\\right|^2 = 0,0078125$ o que não chegar a ser zero de probabilidade, porém já uma probabilidade baixa o suficiente para considerarmos este resultado bom. \n", + " \n", + " **Exercício**: Refaça o exemplo para $f$ que \"escolhe\" a cadeia 001\n", + " \n", + " ### Curiosidades\n", + " Estas curiosidades tratam-se de alguns exercícios extras para os que tem curiosidade de saber o que acontece ao se explorar diferentes possibilidades\n", + " \n", + " **Curiosidade**: O que acontece se repetirmos o exemplo porém aplicarmos inversão de faze e inversão sobre a média quatro vezes?\n", + " \n", + " **Curiosidade**: Qual a probabilidade de se obter um resultado específico quando a entrada tem $2$ qubits?" ] }, { diff --git a/grover.ipynb b/grover.ipynb index a26c6cd..1271766 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -25,6 +25,7 @@ "- Introdução\n", "- Construção do Sistema\n", "- Inversão sobre a média\n", + "- Exemplo\n", "- Aplicação do algoritmo" ] }, @@ -35,7 +36,9 @@ "## Observações dos autores\n", "\n", "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", - "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado, assim como os exemplos mostrados durante a explicação. Portanto esperamos que o leitor esteja pronto com papel e lapis em mãos, pois a melhor maneira de se aprender assuntos muito técnicos que envolvem muita matemática é: fazendo. \n" + "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado, assim como os exemplos mostrados durante a explicação. Portanto esperamos que o leitor esteja pronto com papel e lápis em mãos, pois a melhor maneira de se aprender assuntos muito técnicos que envolvem muita matemática é: fazendo. Portanto, para encorajar o leitor a \"por a mão na massa\" colocamos alguns textos em negrito como: **Exercício**, **(verifique esta afirmação)** ou **curiosidade**. \n", + " \n", + "\n" ] }, { @@ -84,7 +87,7 @@ " $$\n", " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", - " Levando este resultado em consideração, então a faze do sistema (ou sinal da equação) é determinada pelo resultado da função **(verificar esta afirmação)**, matematicamente falando:\n", + " Levando este resultado em consideração, então a faze do sistema (ou sinal da equação) é determinada pelo resultado da função **(verifique esta afirmação)**, matematicamente falando:\n", " $$\n", " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", @@ -98,7 +101,7 @@ " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", " \n", - " Agora seja $f$ uma função que \"busca\" pela cadeia $011$, então ao aplicar a inversão de faze o estado resultante ficaria da seguinte forma **(verificar afirmação)**:\n", + " Agora seja $f$ uma função que \"busca\" pela cadeia $011$, então ao aplicar a inversão de faze o estado resultante ficaria da seguinte forma **(verifique afirmação)**:\n", " \n", " $$\n", " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", @@ -149,7 +152,7 @@ " \n", " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", " \n", - " *Exercício*: Mostre que $A^2 = A$\n", + " **Exercício**: Mostre que $A^2 = A$\n", " \n", " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", " $$\n", @@ -160,7 +163,74 @@ " -I + 2A\n", " $$\n", " \n", - " *Exercício*: Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. " + " **Exercício**: Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo \n", + " \n", + " Agora faremos um exemplo do algoritmo de Grover. Mais uma vez relembrando que aconselhamos ao leitor a estar de papel e lápis em mãos para refazer os exemplos, exercícios ou até mesmo testar casos diferentes. E não, não pararemos de \"bater nesta tecla\" pois trata-se de um excelente hábito principalmente para quem deseja aprender seja computação quântica, algebra linear, cálculo ou qualquer outra matéria semelhante. Agora , para o exemplo:\n", + " \n", + " Considere uma superposição de todos os estados possíveis de uma entrada de três qubits:\n", + " $$\n", + " \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\n", + " $$\n", + " \n", + " Este estado pode ser construido aplicando-se portas hadamard $H^{\\otimes 3}$ num estado de três qubits $|000\\rangle$ **(verifique esta afirmação)**.\n", + " Agora considere a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Desse modo o estado do sistema antes de se aplicar o _oracle_, ou seja o operador $U_f$ se encontrará na seguinte forma:\n", + " \n", + " $$\n", + " |\\psi_0\\rangle = \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right) \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\n", + " $$\n", + " \n", + " Considere que o _oracle_ implementa a função $f$ a qual a mesma \"escolhe\" a cadeia $011$ como cadeia a ser buscada. \n", + " No algoritmo de Grover é necessário rodar a aplicação do oracle e a operação de inversão sobre a média ao menos ${\\sqrt{n}}$ vezes. \n", + " Então para o caso de $3$ qubits até duas (arredondando para baixo) vezes será o suficente para o nosso exemplo, para ver o que acontece. Sabendo sobre o propósito da _ancila_ no sistema podemos omiti-la sem perda de generalização, porém nunca se esqueca que ela ainda está lá, ok?\n", + " \n", + " Aplicando o oracle em $|\\psi_0 \\rangle$ obtemos:\n", + " $$\n", + " |\\psi_1\\rangle = \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right) \n", + " $$\n", + " \n", + " Observe que a média das amplitudes de probabilidade dos qubits de entrada é $\\frac{3}{8\\sqrt{2}}$.\n", + " Então aplicando a inversão sobre a média em $| \\psi_1 \\rangle$ obtemos:\n", + " \n", + " $$\n", + " |\\psi_2\\rangle = \\frac{1}{4\\sqrt{2}}|000\\rangle+\\frac{1}{4\\sqrt{2}}|001\\rangle + \\frac{1}{4\\sqrt{2}}|010\\rangle + \\frac{5}{4\\sqrt{2}}|011\\rangle + \\frac{1}{4\\sqrt{2}}|100\\rangle + \\frac{1}{4\\sqrt{2}}|101\\rangle + \\frac{1}{4\\sqrt{2}}|110\\rangle + \\frac{1}{4\\sqrt{2}}|111\\rangle\n", + " $$\n", + " \n", + " \n", + " **Exercício**: Calcule a média e aplique a inversão sobre a média do estado $| \\psi_1\\rangle$\n", + " \n", + " \n", + " Mais uma vez aplicando $U_f |\\psi_1 \\rangle$ obtemos:\n", + " \n", + " $$\n", + " |\\psi_3\\rangle = \\frac{1}{4\\sqrt{2}}|000\\rangle+\\frac{1}{4\\sqrt{2}}|001\\rangle + \\frac{1}{4\\sqrt{2}}|010\\rangle - \\frac{5}{4\\sqrt{2}}|011\\rangle + \\frac{1}{4\\sqrt{2}}|100\\rangle + \\frac{1}{4\\sqrt{2}}|101\\rangle + \\frac{1}{4\\sqrt{2}}|110\\rangle + \\frac{1}{4\\sqrt{2}}|111\\rangle\n", + " $$\n", + " \n", + " \n", + " \n", + " \n", + " Aplicando novamente $(-I + 2A) |\\psi_2\\rangle$ obtemos:\n", + " $$\n", + " |\\psi_4\\rangle = -\\frac{1}{8\\sqrt{2}}|000\\rangle-\\frac{1}{8\\sqrt{2}}|001\\rangle -\\frac{1}{8\\sqrt{2}}|010\\rangle + \\frac{11}{8\\sqrt{2}}|011\\rangle -\\frac{1}{8\\sqrt{2}}|100\\rangle -\\frac{1}{8\\sqrt{2}}|101\\rangle -\\frac{1}{8\\sqrt{2}}|110\\rangle -\\frac{1}{8\\sqrt{2}}|111\\rangle\n", + " $$\n", + " \n", + " \n", + " A partir daqui já podemos mensurar os qubits da entrada. Observe que a probabilidade do sistema retornar $|011\\rangle$ é bem maior que retornar qualquer outro estado. Mais especificamente $\\left|\\frac{11}{8\\sqrt{2}}\\right|^2 = 0,9453125$, enquanto que $\\left|-\\frac{1}{8\\sqrt{2}}\\right|^2 = 0,0078125$ o que não chegar a ser zero de probabilidade, porém já uma probabilidade baixa o suficiente para considerarmos este resultado bom. \n", + " \n", + " **Exercício**: Refaça o exemplo para $f$ que \"escolhe\" a cadeia 001\n", + " \n", + " ### Curiosidades\n", + " Estas curiosidades tratam-se de alguns exercícios extras para os que tem curiosidade de saber o que acontece ao se explorar diferentes possibilidades\n", + " \n", + " **Curiosidade**: O que acontece se repetirmos o exemplo porém aplicarmos inversão de faze e inversão sobre a média quatro vezes?\n", + " \n", + " **Curiosidade**: Qual a probabilidade de se obter um resultado específico quando a entrada tem $2$ qubits?" ] }, { From 023020d993cbc6cab0e8ec637aca496736b9e4e9 Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Sun, 11 Aug 2019 17:28:48 -0300 Subject: [PATCH 24/49] Grover atualizado --- .ipynb_checkpoints/grover-checkpoint.ipynb | 664 ++++++++------------- grover.ipynb | 664 ++++++++------------- 2 files changed, 500 insertions(+), 828 deletions(-) mode change 100644 => 100755 .ipynb_checkpoints/grover-checkpoint.ipynb mode change 100644 => 100755 grover.ipynb diff --git a/.ipynb_checkpoints/grover-checkpoint.ipynb b/.ipynb_checkpoints/grover-checkpoint.ipynb old mode 100644 new mode 100755 index 1271766..c80ed0d --- a/.ipynb_checkpoints/grover-checkpoint.ipynb +++ b/.ipynb_checkpoints/grover-checkpoint.ipynb @@ -2,19 +2,20 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "# Importing standard Qiskit libraries and configuring account\n", + "import numpy as np\n", "from qiskit import QuantumRegister, ClassicalRegister\n", "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", "from qiskit.compiler import transpile, assemble\n", "from qiskit.tools.jupyter import *\n", "from qiskit.visualization import *\n", "# Loading your IBM Q account(s)\n", - "provider = IBMQ.load_account()" + "#provider = IBMQ.load_account()" ] }, { @@ -23,10 +24,11 @@ "source": [ "# Algoritmo de Grover\n", "- Introdução\n", - "- Construção do Sistema\n", + "- Preparação dos estados\n", + "- Aplicando Oracle\n", "- Inversão sobre a média\n", - "- Exemplo\n", - "- Aplicação do algoritmo" + "- Circuito Quântico\n", + "- Exercícios" ] }, { @@ -35,8 +37,7 @@ "source": [ "## Observações dos autores\n", "\n", - "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", - "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado, assim como os exemplos mostrados durante a explicação. Portanto esperamos que o leitor esteja pronto com papel e lápis em mãos, pois a melhor maneira de se aprender assuntos muito técnicos que envolvem muita matemática é: fazendo. Portanto, para encorajar o leitor a \"por a mão na massa\" colocamos alguns textos em negrito como: **Exercício**, **(verifique esta afirmação)** ou **curiosidade**. \n", + "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch-Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", " \n", "\n" ] @@ -47,9 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um array dezordenado de elementos de tamanho $n$, como fazer para achar um elemento específico no mesmo? A solução mais simples que não envolve a ordenação do array implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições.\n", - " \n", - " O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{n}$ vezes. Em muitos trabalhos e livros de computação quântica, considera-se o tamanho da entrada como sendo $n =2^N$ para $N$ sendo o número de qubits no sistema.\n", + " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", " " ] }, @@ -57,15 +56,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Construção do Sistema\n", - "\n", + "## Preparação dos estados\n", " Considere o operador unitário $U_f$ que implementa a função(ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", " $$\n", " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", " $$\n", " \n", " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancila).\n", - " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de faze_.\n", + " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de fase_.\n", " \n", " \n", " Considere uma entrada qualquer $|x\\rangle$. O estado inicial do sistema se encontraria como a seguir:\n", @@ -87,554 +85,381 @@ " $$\n", " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", - " Levando este resultado em consideração, então a faze do sistema (ou sinal da equação) é determinada pelo resultado da função **(verifique esta afirmação)**, matematicamente falando:\n", + " Levando este resultado em consideração, então a fase do sistema (ou sinal da equação) é determinada pelo resultado da função, matematicamente falando:\n", " $$\n", " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", - " _Relembrando que recomendamos fortemente ao leitor que reveja os conceitos apresentados no módulo que fala sobre o algoritmo de Deutsch e Deutsch-Jozsa_.\n", - " Terminadas nossas observações quanto a _inversão de faze_ podemos prosseguir para o algoritmo. \n", - " \n", + " \n", " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancila enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", " \n", " Para um sistema cuja entrada tem três qubits, o estado se encontraria como a seguir:\n", " $$\n", - " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Agora seja $f$ uma função que \"busca\" pela cadeia $011$, então ao aplicar a inversão de faze o estado resultante ficaria da seguinte forma **(verifique afirmação)**:\n", - " \n", - " $$\n", - " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2\\sqrt{2}} \\right|^2 = \\left| - \\frac{1}{2\\sqrt{2}} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", - " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. \n", - " \n", - " \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inversão sobre a média\n", - "\n", - " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", - " \n", - " *Exercício*: Calcule os valores invertidos sobre a média de cada valor do vetor $\\left[4,5,10,3,3\\right]$\n", - " \n", - " Agora considere que ao inves de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", - " \n", - " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", - " $$\\left[\\begin{array}{ccccc}\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\end{array}\\right]\n", - " \\left[\\begin{array}{c}\n", - " 4 \\\\\n", - " 5 \\\\\n", - " 10\\\\\n", - " 3 \\\\\n", - " 3 \\\\\n", - " \\end{array}\\right] \n", - " = \n", - " \\left[\\begin{array}{c}\n", - " 5 \\\\\n", - " 5 \\\\\n", - " 5\\\\\n", - " 5 \\\\\n", - " 5 \\\\\n", - " \\end{array}\\right]$$\n", - " \n", - " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", - " \n", - " **Exercício**: Mostre que $A^2 = A$\n", - " \n", - " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", - " $$\n", - " \\bar{V} = -V + 2AV \n", - " $$\n", - " Evidenciando o vetor $V$ obtemos: $(-I + 2A)V$. Desse modo, o operador de inversão sobre a média é obtido a partir da operação matricial: \n", - " $$\n", - " -I + 2A\n", - " $$\n", - " \n", - " **Exercício**: Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exemplo \n", - " \n", - " Agora faremos um exemplo do algoritmo de Grover. Mais uma vez relembrando que aconselhamos ao leitor a estar de papel e lápis em mãos para refazer os exemplos, exercícios ou até mesmo testar casos diferentes. E não, não pararemos de \"bater nesta tecla\" pois trata-se de um excelente hábito principalmente para quem deseja aprender seja computação quântica, algebra linear, cálculo ou qualquer outra matéria semelhante. Agora , para o exemplo:\n", - " \n", - " Considere uma superposição de todos os estados possíveis de uma entrada de três qubits:\n", - " $$\n", - " \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\n", - " $$\n", - " \n", - " Este estado pode ser construido aplicando-se portas hadamard $H^{\\otimes 3}$ num estado de três qubits $|000\\rangle$ **(verifique esta afirmação)**.\n", - " Agora considere a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Desse modo o estado do sistema antes de se aplicar o _oracle_, ou seja o operador $U_f$ se encontrará na seguinte forma:\n", - " \n", - " $$\n", - " |\\psi_0\\rangle = \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right) \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Considere que o _oracle_ implementa a função $f$ a qual a mesma \"escolhe\" a cadeia $011$ como cadeia a ser buscada. \n", - " No algoritmo de Grover é necessário rodar a aplicação do oracle e a operação de inversão sobre a média ao menos ${\\sqrt{n}}$ vezes. \n", - " Então para o caso de $3$ qubits até duas (arredondando para baixo) vezes será o suficente para o nosso exemplo, para ver o que acontece. Sabendo sobre o propósito da _ancila_ no sistema podemos omiti-la sem perda de generalização, porém nunca se esqueca que ela ainda está lá, ok?\n", - " \n", - " Aplicando o oracle em $|\\psi_0 \\rangle$ obtemos:\n", - " $$\n", - " |\\psi_1\\rangle = \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right) \n", - " $$\n", - " \n", - " Observe que a média das amplitudes de probabilidade dos qubits de entrada é $\\frac{3}{8\\sqrt{2}}$.\n", - " Então aplicando a inversão sobre a média em $| \\psi_1 \\rangle$ obtemos:\n", - " \n", - " $$\n", - " |\\psi_2\\rangle = \\frac{1}{4\\sqrt{2}}|000\\rangle+\\frac{1}{4\\sqrt{2}}|001\\rangle + \\frac{1}{4\\sqrt{2}}|010\\rangle + \\frac{5}{4\\sqrt{2}}|011\\rangle + \\frac{1}{4\\sqrt{2}}|100\\rangle + \\frac{1}{4\\sqrt{2}}|101\\rangle + \\frac{1}{4\\sqrt{2}}|110\\rangle + \\frac{1}{4\\sqrt{2}}|111\\rangle\n", - " $$\n", - " \n", - " \n", - " **Exercício**: Calcule a média e aplique a inversão sobre a média do estado $| \\psi_1\\rangle$\n", - " \n", - " \n", - " Mais uma vez aplicando $U_f |\\psi_1 \\rangle$ obtemos:\n", - " \n", - " $$\n", - " |\\psi_3\\rangle = \\frac{1}{4\\sqrt{2}}|000\\rangle+\\frac{1}{4\\sqrt{2}}|001\\rangle + \\frac{1}{4\\sqrt{2}}|010\\rangle - \\frac{5}{4\\sqrt{2}}|011\\rangle + \\frac{1}{4\\sqrt{2}}|100\\rangle + \\frac{1}{4\\sqrt{2}}|101\\rangle + \\frac{1}{4\\sqrt{2}}|110\\rangle + \\frac{1}{4\\sqrt{2}}|111\\rangle\n", - " $$\n", - " \n", - " \n", - " \n", - " \n", - " Aplicando novamente $(-I + 2A) |\\psi_2\\rangle$ obtemos:\n", - " $$\n", - " |\\psi_4\\rangle = -\\frac{1}{8\\sqrt{2}}|000\\rangle-\\frac{1}{8\\sqrt{2}}|001\\rangle -\\frac{1}{8\\sqrt{2}}|010\\rangle + \\frac{11}{8\\sqrt{2}}|011\\rangle -\\frac{1}{8\\sqrt{2}}|100\\rangle -\\frac{1}{8\\sqrt{2}}|101\\rangle -\\frac{1}{8\\sqrt{2}}|110\\rangle -\\frac{1}{8\\sqrt{2}}|111\\rangle\n", - " $$\n", - " \n", - " \n", - " A partir daqui já podemos mensurar os qubits da entrada. Observe que a probabilidade do sistema retornar $|011\\rangle$ é bem maior que retornar qualquer outro estado. Mais especificamente $\\left|\\frac{11}{8\\sqrt{2}}\\right|^2 = 0,9453125$, enquanto que $\\left|-\\frac{1}{8\\sqrt{2}}\\right|^2 = 0,0078125$ o que não chegar a ser zero de probabilidade, porém já uma probabilidade baixa o suficiente para considerarmos este resultado bom. \n", - " \n", - " **Exercício**: Refaça o exemplo para $f$ que \"escolhe\" a cadeia 001\n", - " \n", - " ### Curiosidades\n", - " Estas curiosidades tratam-se de alguns exercícios extras para os que tem curiosidade de saber o que acontece ao se explorar diferentes possibilidades\n", - " \n", - " **Curiosidade**: O que acontece se repetirmos o exemplo porém aplicarmos inversão de faze e inversão sobre a média quatro vezes?\n", - " \n", - " **Curiosidade**: Qual a probabilidade de se obter um resultado específico quando a entrada tem $2$ qubits?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Aplicação do algoritmo" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Antes de começarmos\n", - "\n", - "Antes de darmos início ao algoritmo precisamos considerar o que queremos buscar.\n", - "\n", - "No nosso exemplo iremos considerar o vetor $v$ tal que$ v = [ 66, 57, 67, 68 ]$. Agora vamos assumir \n", - "queremos encontrar o valor 67 que entre os indíces 0 - 3 está na posição 2.\n", - "\n", - " A parti de agora vamos considerar os indíces do vetor e não mais os valores em si. Transformando os indíces em binário teremos um vetor $v'$ tal que $v' = [ 00, 01, 10, 11 ]$. E queremos portanto o indíce 10 (2). \n", - " \n", - "Tendo isso em mente devemos desenvolver uma função $f$ que irá \"marcar\" o indíce que nós estamos buscando retornando o 1 se o valor do indíce corresponde ao valor buscado e 0 caso contrário. Portanto a função terá o seguinte comportamento:\n", - "\n", - "**Função:**\n", - "\n", - "

$f(00) \\rightarrow 0$ | $f(10) \\rightarrow 1$

\n", - "

$f(01) \\rightarrow 0$ | $f(11) \\rightarrow 0$

\n", - "\n", - "**Assim ao implementarmos teremos o seguinte comportamento:**\n", - "\n", - "

$|00, 0 \\oplus f(00)\\rangle$ $\\rightarrow$ $|00,0\\rangle$ | \n", - " $|01, 0 \\oplus f(10)\\rangle$ $\\rightarrow$ $|01, 0\\rangle$

\n", - "

$|10, 0 \\oplus f(10)\\rangle$ $\\rightarrow$ $|10,1\\rangle$ | \n", - " $|11, 0 \\oplus f(11)\\rangle$ $\\rightarrow$ $|11, 0\\rangle$

\n", - "\n", - "*Obs.: $\\oplus$ é a soma modulo 2.*\n", - "\n", - "Dessa forma quando a função retornar 1 o último qubit mudara de 0 para 1. Um outra foram de implementarmos isso é cosiderando o último qubit como $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ e assim quando a função retornar um o sinal será mudado, isso pode ser representado da seguinte forma:\n", - "$$ O\n", - "|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big) \\rightarrow (-1)^{f(x)}|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big) \n", - "$$\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Implementando a função (Oracle)\n", - "\n", - "A função pode ser implementada com um portão Not e Toffoli como mostrado abaixo:\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qub = QuantumRegister(3)\n", - "function = QuantumCircuit(qub)\n", - "\n", - "#--- Função ---\n", - "function.x(qub[1])\n", - "function.ccx(qub[0], qub[1], qub[2])\n", - "\n", - "function.draw()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementando o Algoritmo de Grover" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Agora que temos todas informações necessárias podemos de fato parti para implementação do algoritmo
que pode ser separado nós seguintes passos:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Passo 1\n", - "\n", - " Nossa aplicação utilizará um vetor com 4 indices ou seja $N = 2^2$ \n", - " o que significa 2 qubits. Portanto o algoritmo inicial com $|0\\rangle^2$\n", - " e um qubit auxiliar para aplicação da nossa função (Oracle).\n", - " Como o mostrado abaixo:" + " \\frac{1}{2}\\left(|00\\rangle + |01\\rangle + |10\\rangle + |11\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$ \n", + " Utilizando a API _Qiskit_ disponibilizada pela IBM a preparação do estado ficaria da seguinte forma:" ] }, { "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [], - "source": [ - "qr = QuantumRegister(3)\n", - "cr = ClassicalRegister(3)\n", - "grover = QuantumCircuit(qr, cr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Passo 2\n", - "\n", - "Nós utilizamos o Hadamard para computar as superposições.\n", - "\n", - "$|\\psi\\rangle = \\frac{1}{\\sqrt{N}} \\sum_{x=0}^{N-1}|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big)$" - ] - }, - { - "cell_type": "code", - "execution_count": 121, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
        ┌───┐     \n",
+       "q_0: |0>┤ H ├─────\n",
+       "        ├───┤     \n",
+       "q_1: |0>┤ H ├─────\n",
+       "        ├───┤┌───┐\n",
+       "q_2: |0>┤ X ├┤ H ├\n",
+       "        └───┘└───┘\n",
+       " c_0: 0 ══════════\n",
+       "                  \n",
+       " c_1: 0 ══════════\n",
+       "                  
" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 121, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#-- indíces --\n", - "grover.h(qr[0])\n", - "grover.h(qr[1])\n", - "\n", - "#---qubit auxiliar ----\n", - "grover.x(qr[2])\n", - "grover.h(qr[2])\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Passo 3\n", - "\n", - "O passo três pode ser quebrado em 4 subpassos
\n", - "e é onde o algoritmo de fato começa
\n", - "\n", - "1) Aplicar o oracle *O*
\n", - "2) Aplicar a transformação de $H^n$ de Hadamard
\n", - "3) Aplicar a mudança condicional de fase
\n", - "para todas as bases computacionais execeto para $|0\\rangle$ recebendo a fase de -1
\n", - "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$
\n", - "4) Aplicar a transformação de $H^n$ de Hadamard novamente
" + "qub = QuantumRegister(3,'q')\n", + "cb = ClassicalRegister(2,'c')\n", + "qc = QuantumCircuit(qub,cb)\n", + "qc.h(qub[0])\n", + "qc.h(qub[1])\n", + "#Preparando a ancila\n", + "qc.x(qub[2])\n", + "qc.h(qub[2])\n", + "#Drawing circuits\n", + "qc.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Aplicando do nosso oracle\n", - "\n", - "Como vimos anteriormente nós precisamos criar um circuito que implementasse
\n", - "nossa função (Oracle) e dessa forma sermos capazes de \"marcar\" o indíce que buscamos
\n", - "que nesse caso é 2 ou 10.
\n", - "\n", - "**Subpasso 1**\n", - "\n" + "## Aplicando o Oracle\n", + " Agora seja $f$ uma função que \"busca\" pela cadeia $11$, então ao aplicar a inversão de fase o estado resultante ficaria da seguinte forma:\n", + " \n", + " $$\n", + " \\frac{1}{2}\\left(|00\\rangle + |01\\rangle + |10\\rangle - |11\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " \n", + " Explicando de forma simplificada, é como se o estado $11$ estivesse sendo marcado para que a busca pudesse ser efetuada.\n", + " Um operador que já implementa esta função é o operador $Toffoli$ o qual já se encontra implementado na API do _Qiskit_." ] }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
        ┌───┐          \n",
+       "q_0: |0>┤ H ├───────■──\n",
+       "        ├───┤       │  \n",
+       "q_1: |0>┤ H ├───────■──\n",
+       "        ├───┤┌───┐┌─┴─┐\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├\n",
+       "        └───┘└───┘└───┘\n",
+       " c_0: 0 ═══════════════\n",
+       "                       \n",
+       " c_1: 0 ═══════════════\n",
+       "                       
" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 122, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#--- Função ---\n", - "grover.x(qr[1])\n", - "grover.ccx(qr[0], qr[1], qr[2])" + "qc.ccx(qub[0], qub[1], qub[2])\n", + "qc.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n", - "\n", - "Agora aplicaremos a transformação de Hadamard \n", - "\n", - "**Subpasso 2**\n", - "\n" + " Para fins de demonstração efetuaremos uma medição nos qubits para verificar as probabilidades do sistema somente com a inversão de fase." ] }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
        ┌───┐          ┌─┐   \n",
+       "q_0: |0>┤ H ├───────■──┤M├───\n",
+       "        ├───┤       │  └╥┘┌─┐\n",
+       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
+       "        └───┘└───┘└───┘ ║  ║ \n",
+       " c_0: 0 ════════════════╩══╬═\n",
+       "                           ║ \n",
+       " c_1: 0 ═══════════════════╩═\n",
+       "                             
" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 123, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "grover.h(qr[0])\n", - "grover.h(qr[1])" + "qc.measure(qub[0],cb[0])\n", + "qc.measure(qub[1],cb[1])\n", + "qc.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Realizando o próximo passo realizaremos a mudança condicional
\n", - "de fase para cada base computacional onde $|0\\rangle$.
\n", - "\n", - "**Subpasso 3**\n" + "Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", + " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " ] }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { + "image/png": "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jjtywQUXrDD/oosuYuzYsey2226MHz+eF154Ydm8GTNmcPDBB7PzzjszduxYnn/+eQAuu+wydtxxRxoaGpgzZ063rYukrmeA9pCu+LKePn06++yzDzvttBNHH300Cxcu7Lb16e2WLFnCySefzHXXXcf999/PDTfcwJNPPrlcm+2224477riDe+65h49//OOcdtppy+Ydf/zxnHDCCfz5z3/m9ttvZ+ONNwZg55135pe//CXDhg3r1vWR1PUM0B7QVV/Wp59+OscffzwPPvggG2ywAddcc023rldv9tBDD7HFFluw+eabM3DgQA4++GBuueWW5drsvvvuDBo0CICddtqJmTNnAvDkk0+yePFi9t57bwDe8573LGu33XbbMXz48G5cE0ndxQDtAV3xZZ2Z/OlPf+Kggw4C4NOf/jS/+c1vunGterdZs2bxvve9b9nzIUOGMGvWrFbbX3PNNeyzzz4APPvss6y//vocccQR7Lnnnnz7299myZIlXV6zpJ5lgPaArviynjt3Luuvvz79+/dv0zK1vMxcYVpEtNj2uuuuY+LEiZxwwgkALF68mPvvv58zzzyTP/zhD0ybNo0JEyZ0ab2Sel7/ni6gL6ryZX3zzTcDf/uyvuuuuxg6dChHH300EyZMYL/99mvzMrWiIUOG8OKLLy57PnPmTDbddNMV2v3xj3/kvPPO4+abb2bNNddc9trtttuOzTffHIADDjiABx98sFvqltRz3APtAe39sp4wYUKLX9b9+/fngAMO4LHHHmOjjTbijTfeYPHixStdplq2ww47MHXqVKZPn87ChQu58cYb2XfffZdr89hjj3HSSScxYcIEBg8evNxrX3/9dWbPng3A3XffzciRI7u1fkndzwDtAV3xZR0R7LbbbvzqV78C4Nprr2X//ffvvpXq5fr3788555zDIYccwtixYxk/fjyjRo3i7LPPXnZ++rTTTmP+/PkcddRR7LHHHhx++OEA9OvXjzPPPJPx48ez6667AnDEEUcAcOmllzJ69GhmzpzJ7rvvzoknntgzKyip00VLhxP7iqamprzjjjt65L1vu+02vvnNb7JkyRI+85nP8NWvfpWzzz6bpqYm9ttvPz7xiU8wadIkNtlkEwCGDh267LzanXfeyamnnkpmsv3223P++eczcOBApk2bxjHHHMNrr73Gtttuy6WXXrpsz1WS1DYNDQ0PZeZOq2pngPZQgEqS6lNbA9RDuJIkVWCASpJUgQEqSWqXjgxFCvDmm28yevRoTj755GXTbrjhBnbddVd22203DjnkkF4xdrQBKklqs44ORQpw9tlns8suuyx7vnjxYk455RRuuukm7rnnHkaPHs1ll13WLevTEQaoJKnNOjIUKcAjjzzCq6++umw4UigGl8lMFixYQGYyb968XnEduwEqSWqzjgxF+u6773LqqadyxhlnLNdmwIABnHvuuey6665svfXWTJkyhc9+9rNdswKdyACVJLVZR8aNvvzyyxk3bhxDhw5drt2iRYu44ooruOuuu5g0aRKjR4/m/PPP7/ziO5lj4UqS2qwj40b/5S9/4f777+fyyy9n/vz5LFy4kHXWWYcDDzwQgC222AKA8ePHt9g5qd4YoJKkNqsdirSxsZEbb7yRH//4x8u1WToU6fXXX7/cUKS17SZMmMAjjzzCaaedxqxZs5gyZQqzZ89m44035s477+QDH/hAt61TVQaoJKnNaseNXjoU6dJxo5cORVo7bjQsPxRpSxobGzn55JM54IADGDBgAMOGDeOiiy7qrlWqzKH8HMpPklSjrUP5uQeq1dLJV23Y0yV0mnM+91pPlyCpBQZoJ/DLWpL6Hi9jkSSpAgNUkqQKDFBJkiowQCVJqsAAlVTXqt4664UXXmDvvfdmjz324MMf/jBXXHHFstecddZZbLPNNgwbNqzb1kOrHwNUUt3qyK2zNtlkE373u99x9913c9ttt3HBBRcsG/T8ox/9KLfffnu3r49WLwaopLrVkVtnDRw4cNkYrAsXLuTdd99d9poPfehDveJ2WapvBqikutWRW2cBzJgxg912241tt92WL3/5yzQ2NnZpvepbDFBJdasjt86CYgzWe+65hwcffJBrr72WV155pctqVd/jSESS6lZHbp1Vq7GxkZEjR3L//fdz0EEHdWnNvY0jqVXnHqikulV766yFCxdy4403su+++y7XZumtsyZMmLDcrbNefPFF3nrrLQBef/11HnjgAbbaaqturV+rNwNUUt2qvXXW2LFjGT9+/LJbZy3tTFR766w99tiDww8/HICnnnqKcePGsfvuu/Oxj32ML37xi2y99dbLXjN69GgWLFjA6NGj+f73v99j66jeq9tvZxYRXwC+DjQCfwW+kpl/aqXtwcBxQBOwFjAJ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\n", "text/plain": [ - "" + "
" ] }, - "execution_count": 124, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Select the QasmSimulator from the Aer provider\n", + "simulator = Aer.get_backend('qasm_simulator')\n", "\n", - "grover.z(qr[0])\n", - "grover.z(qr[1])\n" + "# Execute and get counts\n", + "result = execute(qc, simulator).result()\n", + "counts = result.get_counts(qc)\n", + "plot_histogram(counts, title='O indíce procurado')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "## Inversão sobre a média\n", "\n", - "Agora aplicaremos a transformação de Hadamard novamente\n", - "\n", - "**Subpasso 4**\n" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 125, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grover.h(qr[0])\n", - "grover.h(qr[1])" + " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", + " \n", + " Agora considere que ao inves de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", + " \n", + " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", + " $$\\left[\\begin{array}{ccccc}\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\end{array}\\right]\n", + " \\left[\\begin{array}{c}\n", + " 4 \\\\\n", + " 5 \\\\\n", + " 10\\\\\n", + " 3 \\\\\n", + " 3 \\\\\n", + " \\end{array}\\right] \n", + " = \n", + " \\left[\\begin{array}{c}\n", + " 5 \\\\\n", + " 5 \\\\\n", + " 5\\\\\n", + " 5 \\\\\n", + " 5 \\\\\n", + " \\end{array}\\right]$$\n", + " \n", + " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", + " \n", + " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", + " $$\n", + " \\bar{V} = -V + 2AV \n", + " $$\n", + " Evidenciando o vetor $V$ obtemos: $(-I + 2A)V$. Desse modo, o operador de inversão sobre a média é obtido a partir da operação matricial: \n", + " $$\n", + " -I + 2A\n", + " $$\n", + " \n", + " ### Implementando inversão sobre a média\n", + " \n", + " Sob a perspectiva de computação quântica este operador pode ser obtido a partir da seguinte fórmula: \n", + " \n", + " $$\n", + " H^{\\otimes n}\\left(2|0\\rangle\\langle0| - I \\right)H^{\\otimes n}\n", + " $$\n", + " \n", + " Considerando a entrada do sistema $|\\psi\\rangle$, a qual será efetuada a busca, como de uma superposição de todos os estados possíveis. Ou seja : $H^{\\otimes n} | 0 \\rangle^{\\otimes n} = |\\psi\\rangle$.\n", + " E Considerando tanto $|0\\rangle$ como $\\langle 0|$ como vetores de dimensão $n$ obtemos:\n", + " \n", + " $$\n", + " 2|\\psi\\rangle\\langle\\psi | - I\n", + " $$\n", + " \n", + " Do ponto de vista de implementação o passo a passo para aplicar a inversão sobre a média no sistema seria da seguinte forma: \n", + " 1. Aplicar transformações de Hadamard $H^{\\otimes n}$\n", + " 2. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", + "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$
\n", + " 3. Reaplicar transformações de Hadamard $H^{\\otimes n}$\n", + " \n", + " A aplicação do operador $U_f$(ou oracle)junto com os três passos $1,2$ e $3$ compõe a interação de Grover ou _Grover's interation_.\n", + " O algoritmo tem que ser executado até $\\sqrt{N}$ vezes, mais especificamente a aplicação da interação de Grover no sistema. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Passo 3\n", - "\n", - "Agora repitiremos os subpassos de 1 a 4, porque são necessárias $\\sqrt{N}$ interações,
\n", - "onde N é tamanho do nosso vetor que no nosso caso é 4, o que nós dá 2 iterações.
\n", - "\n" + "# Circuito Quântico" ] }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 61, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐\n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
+       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├───────────────\n",
+       "        └───┘└───┘└───┘               └───┘               \n",
+       " c_0: 0 ══════════════════════════════════════════════════\n",
+       "                                                          \n",
+       " c_1: 0 ══════════════════════════════════════════════════\n",
+       "                                                          
" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 126, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#--- Função ---\n", - "grover.x(qr[1])\n", - "grover.ccx(qr[0], qr[1], qr[2])\n", - "\n", - "#---Hadamard\n", - "\n", - "grover.h(qr[0])\n", - "grover.h(qr[1])\n", - "\n", - "\n", - "#----Troca de fase\n", - "\n", - "grover.z(qr[0])\n", - "grover.z(qr[1])\n", - "\n", - "\n", - "#--- Hadarmard\n", - "\n", - "grover.h(qr[0])\n", - "grover.h(qr[1])\n", - "\n" + "#Inicialização dos estados\n", + "qub = QuantumRegister(3,'q')\n", + "cb = ClassicalRegister(2,'c')\n", + "qc = QuantumCircuit(qub,cb)\n", + "qc.h(qub[0])\n", + "qc.h(qub[1])\n", + "#Preparando a ancila\n", + "qc.x(qub[2])\n", + "qc.h(qub[2])\n", + "\n", + "#Interação de grover\n", + "for i in range(int(np.ceil(np.sqrt(4)))):\n", + " # Oracle\n", + " qc.ccx(qub[0], qub[1], qub[2])\n", + "\n", + " #---Hadamard\n", + " qc.h(qub[0])\n", + " qc.h(qub[1])\n", + "\n", + " #----Troca de fase\n", + " qc.z(qub[0])\n", + " qc.z(qub[1])\n", + "\n", + " #--- Hadarmard\n", + " qc.h(qub[0])\n", + " qc.h(qub[1])\n", + "\n", + "qc.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Passo 4\n", - "\n", - "Agora que já fizemos as iterações necessárias vamos fazer a medição e o valor
\n", - "obtido deve ser o indíce que nós buscamos que nesse caso é 10 (2)." + "Após a última aplicação podemos efetuar a medição dos qubits da entrada, ou seja efetuar a medição nos qubits $0$ e $1$. \n", + "O circuito quântico resultante ficaria então da seguinte forma:" ] }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 62, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "text/html": [ + "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐┌─┐   \n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├┤M├───\n",
+       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤└╥┘┌─┐\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├─╫─┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘ ║ └╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├────────────────╫──╫─\n",
+       "        └───┘└───┘└───┘               └───┘                ║  ║ \n",
+       " c_0: 0 ═══════════════════════════════════════════════════╩══╬═\n",
+       "                                                              ║ \n",
+       " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
+       "                                                                
" + ], "text/plain": [ - "
" + "" ] }, - "execution_count": 127, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "grover.measure(qr, cr)\n", - "\n", - "grover.draw()" + "qc.measure(qub[0],cb[0])\n", + "qc.measure(qub[1],cb[1])\n", + "qc.draw()" ] }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 69, "metadata": {}, "outputs": [ { "data": { - "image/png": "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p3DIIYc0lunatSv/9V//xfPPP7/be9u1a8ezzz7L/vvvz86dO/nyl7/MiSeeyJFHHsnDDz/cWO7GG2+kc+fOOdsnyR/VQEWkxZg5cyaf//zn6dOnD23btuXss8/mhRde2K1MWVkZhx12GK1b716/MDP2339/AHbu3MmuXbsws93KuDvPPvssX/3qV7O7I1IQlEBFpMWoq6vjoIMOanxdUVFBXV1dyu+vr69nxIgRDBo0iJEjR3LEEUfstn7GjBl87nOfo1+/+GmNZV+kBCoiLYa777EsvhbZlJKSEqZNm8bcuXOZNWsW8+fP3239xIkTOfvss5sdpxQHJVARSVs2GuI0mDBhAqWlpaxduzbjcVdUVPDBBx80vl61ahU9evRIeztdunTh2GOP5ZVXXmlctmvXLp577jm+8pWvZCRWKXxKoCKSloaGOL/97W+ZMWMGEydO5O9///tuZRoa4owZM2a35Q0NcV577TWmTZvGK6+8wltvvdW4fuXKlUydOpWePXtmJfbDDjuMJUuWsHz5cnbs2MGkSZM45ZRTUnrvxx9/zIYNGwDYunUrr776KgMHDmxcP3XqVAYMGLDbJWLZt6kVroikJbYhDtDYECe2JWtZWRllZWVMnjx5t/furSHODTfcwK233soFF1yQldhbt27NHXfcwTnnnEN9fT0XXHABlZWVPPLIIwBcfPHFrF69muOPP55NmzbRqlUr7r//fmbMmMHq1au58sorqa+v59NPP+Wss87i5JNPbtz2M888o8ZDLYwSqIikJVFDnJkzZ6b8/vr6eo477jiWLl3Kt771rcaGOC+88ALl5eVUVVVlPOZYo0aNYtSoUbstu/jiixufd+/enXnz5u3xviFDhvDqq68m3e69996buSClKCiBikhaMtUQZ8OGDVx44YXMnz+fPn36MH78eCZNmpTJUEWySvdARSQt2WiIs2zZMlasWMHw4cOprq5m1apVjBw5ktWrV2cydJGMUgIVkbRkoyHO4MGDee+996itraW2tpaKigqmTp1K9+7ds7krIs2iS7gikpZsNsQRKSaW6H5GS1FTU+NTpkzJdxgiIlJASktLZ7r7EXsrp0u4zRS1Q/nKlSs588wzOeqooxg2bBj3339/47q5c+dy0kknceyxx3LeeeexcePGnOyLiIikTgm0GZrTobx169b86Ec/4m9/+xuTJ0/m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\n", + "image/png": "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f/mX7L777lx88cVrrL/sssvYa6+92HfffTnmmGN49tlnV62bN28exx57LHvuuSd77bUXzzzzDACZyXnnncd73vMe9txzT6688spe+zwaOIb2dQGS1J7m5ma+/OUvc8stt9DY2MghhxzC4Ycfzo477riqzS677MLUqVMZPnw411xzDZMnT+aaa64B4JRTTuGMM87goIMO4tVXX2W99Yo+w5QpU3juuee4//77WW+99Vi4cGGffD71b/ZAJdWtBx98kHe84x1sv/32bLDBBhx77LHcdtttq7XZb7/9GD58OAB77LEH8+fPB+BPf/oTK1eu5KCDDgLgbW9726p23//+9/nSl760KlBHjRrVWx9JA4gBKqluLViwgLe//e2rnjc2NrJgwYJ2299www28733vA+Cpp55i0003ZdKkSRxwwAF8/etfp7m5GYCnn36an/zkJxx88MF8+MMf5qmnnurZD6IByQCVVLcyc41lEdFm25tuuolp06Zx6qmnArBy5Uruu+8+zj33XH79618zZ84cpkyZAsDy5cvZcMMNmTp1KpMmTVr1GqkzDFBJdauxsZHnnntu1fP58+ezzTbbrNHuN7/5DRdddBFTpkxhww03XPXaXXbZhe23356hQ4dy5JFH8sgjj6xad/TRRwPwgQ98gD/+8Y+98Gk00BigkurWbrvtxuzZs5k7dy7Lly/nlltu4fDDD1+tzSOPPMIZZ5zBlClTVjuXudtuu/Hyyy+zaNEiAO666y7Gjx8PwBFHHMFdd90FwD333MO4ceN66RNpIPEqXEl1a+jQoVxwwQUcd9xxNDc38/GPf5wJEyZw/vnn09TUxPvf/34mT57MsmXL+NSnPgXA6NGjmTJlCkOGDOHcc8/lmGOOITPZddddmTRpEgCnn346J510Et/97ncZMWIEl1xySV9+TPVT0dY5hsGiqakpp06d2tdlSJLqyMiRIx/MzD3W1c5DuJIkVWCASpJUgQHaR7oyPdmWW27J/vvvz/7778/HPvaxNV575plnsu222/Zo/ZI02HkRUR/o6vRkw4YNW3UFYWvTpk1jyZIlvfI5JGkwswfaB7oyPdnaNDc3M3nyZM4+++yeKFuSVMMA7QNdmZ4M4I033uDggw/m0EMP5Re/+MWq5VdddRWHH354mwPNJUndy0O4faDK9GS33nrrqmWPPPIIDQ0NzJkzhw9+8IPstNNObLTRRvz0pz/l5z//eY/VLUn6XwZoH+js9GS33nrrqunJABoaGgDYfvvt2XfffXnkkUcYNmwYTz/9NLvvvjsAr732GrvvvjsPPvhgD38aSRqcPITbB7oyPdnLL7/Mm2++CcDixYu5//77GT9+PIcddhh/+tOfmD59OtOnT2f48OGGpyT1IHugfaAr05PNmjWLM844g/XWW4+33nqL0047bbWrdyVJvcOp/JzKT6U777yTr371qzQ3N/OJT3yC008/fbX1l112Gddffz1Dhw5lyy235NJLL11tvO0rr7zC3nvvzZFHHskFF1wAwFFHHcULL7zARhttBMCPf/xjb94s1bmOTuVnD1Si62NzAc4//3z22WefNbZ95ZVX0tTU1CufQ1LvMUAlVh+bC6wam1sboPvtt9+qx3vssQc33XTTqucPP/wwCxcu5JBDDuHhhx/utbr7my9ft3lfl9BtLjjxpb4uQX3Mi4gkujY296233uKss87inHPOabPt5z//efbff38uvPDCNocwSeqf7IFKdG1s7tVXX82hhx7K6NGj12h75ZVX0tjYyNKlSznxxBO58cYb+ehHP9q9xUvqEwaoRNfG5v7+97/nvvvu4+qrr2bZsmUsX76cESNGMHnyZBobGwHYeOONOe6443jooYcMUGmAMEAlVh+b29DQwC233ML3vve91dq0jM29+eabV7uStrbdlClTePjhh5k8eTIrV65kyZIlbLHFFqxYsYLbb7+dAw88sLc+kqQeZoBKdG1sbnvefPNNjjvuOFasWEFzczMHHHAAkyZN6q2PJKmHOQ7UcaBSr/Eq3IGh6pjpZ599lkmTJtHc3MyKFSs46aSTVv1BWk9jph0HKknqdl0ZM7311lvzq1/9ig033JBXX32V9773vRx++OGr5vfub2OmHcYiSeqwrtzPeIMNNlh18d3y5ct56623erf4bmaASpI6rKv3M543bx777rsvO++8M6eddtqq3if0vzHTHsLtBp7XkTRYdPV+xqNHj+buu+9mwYIFfOITn+Doo49mq6226pdjpu2BSpI6rLNjpqdMmbLa/YxbNDQ0MH78eO67775V24XVx0zXOwNUktRhXbmf8XPPPcfrr78OFPc2fuCBB9hhhx1YuXIlixcvBlg1ZnrChAm996Eq8hCuJKnDujJm+vHHH+ess84iIshMPve5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\n", "text/plain": [ "
" ] }, - "execution_count": 128, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -644,17 +469,28 @@ "simulator = Aer.get_backend('qasm_simulator')\n", "\n", "# Execute and get counts\n", - "result = execute(grover, simulator).result()\n", - "counts = result.get_counts(grover)\n", + "result = execute(qc, simulator).result()\n", + "counts = result.get_counts(qc)\n", "plot_histogram(counts, title='O indíce procurado')" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## Exercício\n", + "\n", + " 1. Calcule os valores invertidos sobre a média de cada valor do vetor $\\left[4,5,10,3,3\\right]$\n", + " \n", + " 2. Mostre que $A^2 = A$\n", + " \n", + " 3. Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. \n", + " \n", + " 4. O que acontece se repetirmos o exemplo porém aplicarmos _inversão de fase_ e inversão sobre a média quatro vezes?\n", + " \n", + " 5. Fazer o exemplo para uma entrada de três qubits onde $f$ \"escolhe\" a cadeia 001\n", + " 6. Crie um circuito quântico utilizando um oracle diferente. Dica:Verifique a ação de $U_f$ sobre os estados da base ( incluindo a ancila )" + ] } ], "metadata": { diff --git a/grover.ipynb b/grover.ipynb old mode 100644 new mode 100755 index 1271766..c80ed0d --- a/grover.ipynb +++ b/grover.ipynb @@ -2,19 +2,20 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "# Importing standard Qiskit libraries and configuring account\n", + "import numpy as np\n", "from qiskit import QuantumRegister, ClassicalRegister\n", "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", "from qiskit.compiler import transpile, assemble\n", "from qiskit.tools.jupyter import *\n", "from qiskit.visualization import *\n", "# Loading your IBM Q account(s)\n", - "provider = IBMQ.load_account()" + "#provider = IBMQ.load_account()" ] }, { @@ -23,10 +24,11 @@ "source": [ "# Algoritmo de Grover\n", "- Introdução\n", - "- Construção do Sistema\n", + "- Preparação dos estados\n", + "- Aplicando Oracle\n", "- Inversão sobre a média\n", - "- Exemplo\n", - "- Aplicação do algoritmo" + "- Circuito Quântico\n", + "- Exercícios" ] }, { @@ -35,8 +37,7 @@ "source": [ "## Observações dos autores\n", "\n", - "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", - "- Caso ainda estejam com dificuldades de vizualizar a evolução do sistema tembém recomendamos aos leitores a tentar reproduzir (matricialmente, se necessário) casos reduzidos do algoritmo aqui apresentado, assim como os exemplos mostrados durante a explicação. Portanto esperamos que o leitor esteja pronto com papel e lápis em mãos, pois a melhor maneira de se aprender assuntos muito técnicos que envolvem muita matemática é: fazendo. Portanto, para encorajar o leitor a \"por a mão na massa\" colocamos alguns textos em negrito como: **Exercício**, **(verifique esta afirmação)** ou **curiosidade**. \n", + "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch-Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", " \n", "\n" ] @@ -47,9 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um array dezordenado de elementos de tamanho $n$, como fazer para achar um elemento específico no mesmo? A solução mais simples que não envolve a ordenação do array implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições.\n", - " \n", - " O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{n}$ vezes. Em muitos trabalhos e livros de computação quântica, considera-se o tamanho da entrada como sendo $n =2^N$ para $N$ sendo o número de qubits no sistema.\n", + " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", " " ] }, @@ -57,15 +56,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Construção do Sistema\n", - "\n", + "## Preparação dos estados\n", " Considere o operador unitário $U_f$ que implementa a função(ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", " $$\n", " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", " $$\n", " \n", " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancila).\n", - " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de faze_.\n", + " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de fase_.\n", " \n", " \n", " Considere uma entrada qualquer $|x\\rangle$. O estado inicial do sistema se encontraria como a seguir:\n", @@ -87,554 +85,381 @@ " $$\n", " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", - " Levando este resultado em consideração, então a faze do sistema (ou sinal da equação) é determinada pelo resultado da função **(verifique esta afirmação)**, matematicamente falando:\n", + " Levando este resultado em consideração, então a fase do sistema (ou sinal da equação) é determinada pelo resultado da função, matematicamente falando:\n", " $$\n", " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", - " _Relembrando que recomendamos fortemente ao leitor que reveja os conceitos apresentados no módulo que fala sobre o algoritmo de Deutsch e Deutsch-Jozsa_.\n", - " Terminadas nossas observações quanto a _inversão de faze_ podemos prosseguir para o algoritmo. \n", - " \n", + " \n", " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancila enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", " \n", " Para um sistema cuja entrada tem três qubits, o estado se encontraria como a seguir:\n", " $$\n", - " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Agora seja $f$ uma função que \"busca\" pela cadeia $011$, então ao aplicar a inversão de faze o estado resultante ficaria da seguinte forma **(verifique afirmação)**:\n", - " \n", - " $$\n", - " \\frac{1}{2\\sqrt{2}}\\left(|000\\rangle + |001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2\\sqrt{2}} \\right|^2 = \\left| - \\frac{1}{2\\sqrt{2}} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", - " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. \n", - " \n", - " \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inversão sobre a média\n", - "\n", - " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", - " \n", - " *Exercício*: Calcule os valores invertidos sobre a média de cada valor do vetor $\\left[4,5,10,3,3\\right]$\n", - " \n", - " Agora considere que ao inves de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", - " \n", - " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", - " $$\\left[\\begin{array}{ccccc}\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\end{array}\\right]\n", - " \\left[\\begin{array}{c}\n", - " 4 \\\\\n", - " 5 \\\\\n", - " 10\\\\\n", - " 3 \\\\\n", - " 3 \\\\\n", - " \\end{array}\\right] \n", - " = \n", - " \\left[\\begin{array}{c}\n", - " 5 \\\\\n", - " 5 \\\\\n", - " 5\\\\\n", - " 5 \\\\\n", - " 5 \\\\\n", - " \\end{array}\\right]$$\n", - " \n", - " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", - " \n", - " **Exercício**: Mostre que $A^2 = A$\n", - " \n", - " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", - " $$\n", - " \\bar{V} = -V + 2AV \n", - " $$\n", - " Evidenciando o vetor $V$ obtemos: $(-I + 2A)V$. Desse modo, o operador de inversão sobre a média é obtido a partir da operação matricial: \n", - " $$\n", - " -I + 2A\n", - " $$\n", - " \n", - " **Exercício**: Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exemplo \n", - " \n", - " Agora faremos um exemplo do algoritmo de Grover. Mais uma vez relembrando que aconselhamos ao leitor a estar de papel e lápis em mãos para refazer os exemplos, exercícios ou até mesmo testar casos diferentes. E não, não pararemos de \"bater nesta tecla\" pois trata-se de um excelente hábito principalmente para quem deseja aprender seja computação quântica, algebra linear, cálculo ou qualquer outra matéria semelhante. Agora , para o exemplo:\n", - " \n", - " Considere uma superposição de todos os estados possíveis de uma entrada de três qubits:\n", - " $$\n", - " \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right)\n", - " $$\n", - " \n", - " Este estado pode ser construido aplicando-se portas hadamard $H^{\\otimes 3}$ num estado de três qubits $|000\\rangle$ **(verifique esta afirmação)**.\n", - " Agora considere a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Desse modo o estado do sistema antes de se aplicar o _oracle_, ou seja o operador $U_f$ se encontrará na seguinte forma:\n", - " \n", - " $$\n", - " |\\psi_0\\rangle = \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle + |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right) \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Considere que o _oracle_ implementa a função $f$ a qual a mesma \"escolhe\" a cadeia $011$ como cadeia a ser buscada. \n", - " No algoritmo de Grover é necessário rodar a aplicação do oracle e a operação de inversão sobre a média ao menos ${\\sqrt{n}}$ vezes. \n", - " Então para o caso de $3$ qubits até duas (arredondando para baixo) vezes será o suficente para o nosso exemplo, para ver o que acontece. Sabendo sobre o propósito da _ancila_ no sistema podemos omiti-la sem perda de generalização, porém nunca se esqueca que ela ainda está lá, ok?\n", - " \n", - " Aplicando o oracle em $|\\psi_0 \\rangle$ obtemos:\n", - " $$\n", - " |\\psi_1\\rangle = \\frac{1}{2\\sqrt{2}} \\left(|000\\rangle+|001\\rangle + |010\\rangle - |011\\rangle + |100\\rangle + |101\\rangle + |110\\rangle + |111\\rangle\\right) \n", - " $$\n", - " \n", - " Observe que a média das amplitudes de probabilidade dos qubits de entrada é $\\frac{3}{8\\sqrt{2}}$.\n", - " Então aplicando a inversão sobre a média em $| \\psi_1 \\rangle$ obtemos:\n", - " \n", - " $$\n", - " |\\psi_2\\rangle = \\frac{1}{4\\sqrt{2}}|000\\rangle+\\frac{1}{4\\sqrt{2}}|001\\rangle + \\frac{1}{4\\sqrt{2}}|010\\rangle + \\frac{5}{4\\sqrt{2}}|011\\rangle + \\frac{1}{4\\sqrt{2}}|100\\rangle + \\frac{1}{4\\sqrt{2}}|101\\rangle + \\frac{1}{4\\sqrt{2}}|110\\rangle + \\frac{1}{4\\sqrt{2}}|111\\rangle\n", - " $$\n", - " \n", - " \n", - " **Exercício**: Calcule a média e aplique a inversão sobre a média do estado $| \\psi_1\\rangle$\n", - " \n", - " \n", - " Mais uma vez aplicando $U_f |\\psi_1 \\rangle$ obtemos:\n", - " \n", - " $$\n", - " |\\psi_3\\rangle = \\frac{1}{4\\sqrt{2}}|000\\rangle+\\frac{1}{4\\sqrt{2}}|001\\rangle + \\frac{1}{4\\sqrt{2}}|010\\rangle - \\frac{5}{4\\sqrt{2}}|011\\rangle + \\frac{1}{4\\sqrt{2}}|100\\rangle + \\frac{1}{4\\sqrt{2}}|101\\rangle + \\frac{1}{4\\sqrt{2}}|110\\rangle + \\frac{1}{4\\sqrt{2}}|111\\rangle\n", - " $$\n", - " \n", - " \n", - " \n", - " \n", - " Aplicando novamente $(-I + 2A) |\\psi_2\\rangle$ obtemos:\n", - " $$\n", - " |\\psi_4\\rangle = -\\frac{1}{8\\sqrt{2}}|000\\rangle-\\frac{1}{8\\sqrt{2}}|001\\rangle -\\frac{1}{8\\sqrt{2}}|010\\rangle + \\frac{11}{8\\sqrt{2}}|011\\rangle -\\frac{1}{8\\sqrt{2}}|100\\rangle -\\frac{1}{8\\sqrt{2}}|101\\rangle -\\frac{1}{8\\sqrt{2}}|110\\rangle -\\frac{1}{8\\sqrt{2}}|111\\rangle\n", - " $$\n", - " \n", - " \n", - " A partir daqui já podemos mensurar os qubits da entrada. Observe que a probabilidade do sistema retornar $|011\\rangle$ é bem maior que retornar qualquer outro estado. Mais especificamente $\\left|\\frac{11}{8\\sqrt{2}}\\right|^2 = 0,9453125$, enquanto que $\\left|-\\frac{1}{8\\sqrt{2}}\\right|^2 = 0,0078125$ o que não chegar a ser zero de probabilidade, porém já uma probabilidade baixa o suficiente para considerarmos este resultado bom. \n", - " \n", - " **Exercício**: Refaça o exemplo para $f$ que \"escolhe\" a cadeia 001\n", - " \n", - " ### Curiosidades\n", - " Estas curiosidades tratam-se de alguns exercícios extras para os que tem curiosidade de saber o que acontece ao se explorar diferentes possibilidades\n", - " \n", - " **Curiosidade**: O que acontece se repetirmos o exemplo porém aplicarmos inversão de faze e inversão sobre a média quatro vezes?\n", - " \n", - " **Curiosidade**: Qual a probabilidade de se obter um resultado específico quando a entrada tem $2$ qubits?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Aplicação do algoritmo" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Antes de começarmos\n", - "\n", - "Antes de darmos início ao algoritmo precisamos considerar o que queremos buscar.\n", - "\n", - "No nosso exemplo iremos considerar o vetor $v$ tal que$ v = [ 66, 57, 67, 68 ]$. Agora vamos assumir \n", - "queremos encontrar o valor 67 que entre os indíces 0 - 3 está na posição 2.\n", - "\n", - " A parti de agora vamos considerar os indíces do vetor e não mais os valores em si. Transformando os indíces em binário teremos um vetor $v'$ tal que $v' = [ 00, 01, 10, 11 ]$. E queremos portanto o indíce 10 (2). \n", - " \n", - "Tendo isso em mente devemos desenvolver uma função $f$ que irá \"marcar\" o indíce que nós estamos buscando retornando o 1 se o valor do indíce corresponde ao valor buscado e 0 caso contrário. Portanto a função terá o seguinte comportamento:\n", - "\n", - "**Função:**\n", - "\n", - "

$f(00) \\rightarrow 0$ | $f(10) \\rightarrow 1$

\n", - "

$f(01) \\rightarrow 0$ | $f(11) \\rightarrow 0$

\n", - "\n", - "**Assim ao implementarmos teremos o seguinte comportamento:**\n", - "\n", - "

$|00, 0 \\oplus f(00)\\rangle$ $\\rightarrow$ $|00,0\\rangle$ | \n", - " $|01, 0 \\oplus f(10)\\rangle$ $\\rightarrow$ $|01, 0\\rangle$

\n", - "

$|10, 0 \\oplus f(10)\\rangle$ $\\rightarrow$ $|10,1\\rangle$ | \n", - " $|11, 0 \\oplus f(11)\\rangle$ $\\rightarrow$ $|11, 0\\rangle$

\n", - "\n", - "*Obs.: $\\oplus$ é a soma modulo 2.*\n", - "\n", - "Dessa forma quando a função retornar 1 o último qubit mudara de 0 para 1. Um outra foram de implementarmos isso é cosiderando o último qubit como $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ e assim quando a função retornar um o sinal será mudado, isso pode ser representado da seguinte forma:\n", - "$$ O\n", - "|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big) \\rightarrow (-1)^{f(x)}|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big) \n", - "$$\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Implementando a função (Oracle)\n", - "\n", - "A função pode ser implementada com um portão Not e Toffoli como mostrado abaixo:\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 39, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qub = QuantumRegister(3)\n", - "function = QuantumCircuit(qub)\n", - "\n", - "#--- Função ---\n", - "function.x(qub[1])\n", - "function.ccx(qub[0], qub[1], qub[2])\n", - "\n", - "function.draw()\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Implementando o Algoritmo de Grover" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Agora que temos todas informações necessárias podemos de fato parti para implementação do algoritmo
que pode ser separado nós seguintes passos:\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Passo 1\n", - "\n", - " Nossa aplicação utilizará um vetor com 4 indices ou seja $N = 2^2$ \n", - " o que significa 2 qubits. Portanto o algoritmo inicial com $|0\\rangle^2$\n", - " e um qubit auxiliar para aplicação da nossa função (Oracle).\n", - " Como o mostrado abaixo:" + " \\frac{1}{2}\\left(|00\\rangle + |01\\rangle + |10\\rangle + |11\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$ \n", + " Utilizando a API _Qiskit_ disponibilizada pela IBM a preparação do estado ficaria da seguinte forma:" ] }, { "cell_type": "code", - "execution_count": 120, - "metadata": {}, - "outputs": [], - "source": [ - "qr = QuantumRegister(3)\n", - "cr = ClassicalRegister(3)\n", - "grover = QuantumCircuit(qr, cr)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Passo 2\n", - "\n", - "Nós utilizamos o Hadamard para computar as superposições.\n", - "\n", - "$|\\psi\\rangle = \\frac{1}{\\sqrt{N}} \\sum_{x=0}^{N-1}|x\\rangle \\Big(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\Big)$" - ] - }, - { - "cell_type": "code", - "execution_count": 121, + "execution_count": 24, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
        ┌───┐     \n",
+       "q_0: |0>┤ H ├─────\n",
+       "        ├───┤     \n",
+       "q_1: |0>┤ H ├─────\n",
+       "        ├───┤┌───┐\n",
+       "q_2: |0>┤ X ├┤ H ├\n",
+       "        └───┘└───┘\n",
+       " c_0: 0 ══════════\n",
+       "                  \n",
+       " c_1: 0 ══════════\n",
+       "                  
" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 121, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#-- indíces --\n", - "grover.h(qr[0])\n", - "grover.h(qr[1])\n", - "\n", - "#---qubit auxiliar ----\n", - "grover.x(qr[2])\n", - "grover.h(qr[2])\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Passo 3\n", - "\n", - "O passo três pode ser quebrado em 4 subpassos
\n", - "e é onde o algoritmo de fato começa
\n", - "\n", - "1) Aplicar o oracle *O*
\n", - "2) Aplicar a transformação de $H^n$ de Hadamard
\n", - "3) Aplicar a mudança condicional de fase
\n", - "para todas as bases computacionais execeto para $|0\\rangle$ recebendo a fase de -1
\n", - "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$
\n", - "4) Aplicar a transformação de $H^n$ de Hadamard novamente
" + "qub = QuantumRegister(3,'q')\n", + "cb = ClassicalRegister(2,'c')\n", + "qc = QuantumCircuit(qub,cb)\n", + "qc.h(qub[0])\n", + "qc.h(qub[1])\n", + "#Preparando a ancila\n", + "qc.x(qub[2])\n", + "qc.h(qub[2])\n", + "#Drawing circuits\n", + "qc.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Aplicando do nosso oracle\n", - "\n", - "Como vimos anteriormente nós precisamos criar um circuito que implementasse
\n", - "nossa função (Oracle) e dessa forma sermos capazes de \"marcar\" o indíce que buscamos
\n", - "que nesse caso é 2 ou 10.
\n", - "\n", - "**Subpasso 1**\n", - "\n" + "## Aplicando o Oracle\n", + " Agora seja $f$ uma função que \"busca\" pela cadeia $11$, então ao aplicar a inversão de fase o estado resultante ficaria da seguinte forma:\n", + " \n", + " $$\n", + " \\frac{1}{2}\\left(|00\\rangle + |01\\rangle + |10\\rangle - |11\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", + " $$\n", + " \n", + " Explicando de forma simplificada, é como se o estado $11$ estivesse sendo marcado para que a busca pudesse ser efetuada.\n", + " Um operador que já implementa esta função é o operador $Toffoli$ o qual já se encontra implementado na API do _Qiskit_." ] }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
        ┌───┐          \n",
+       "q_0: |0>┤ H ├───────■──\n",
+       "        ├───┤       │  \n",
+       "q_1: |0>┤ H ├───────■──\n",
+       "        ├───┤┌───┐┌─┴─┐\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├\n",
+       "        └───┘└───┘└───┘\n",
+       " c_0: 0 ═══════════════\n",
+       "                       \n",
+       " c_1: 0 ═══════════════\n",
+       "                       
" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 122, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#--- Função ---\n", - "grover.x(qr[1])\n", - "grover.ccx(qr[0], qr[1], qr[2])" + "qc.ccx(qub[0], qub[1], qub[2])\n", + "qc.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n", - "\n", - "Agora aplicaremos a transformação de Hadamard \n", - "\n", - "**Subpasso 2**\n", - "\n" + " Para fins de demonstração efetuaremos uma medição nos qubits para verificar as probabilidades do sistema somente com a inversão de fase." ] }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 26, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
        ┌───┐          ┌─┐   \n",
+       "q_0: |0>┤ H ├───────■──┤M├───\n",
+       "        ├───┤       │  └╥┘┌─┐\n",
+       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
+       "        └───┘└───┘└───┘ ║  ║ \n",
+       " c_0: 0 ════════════════╩══╬═\n",
+       "                           ║ \n",
+       " c_1: 0 ═══════════════════╩═\n",
+       "                             
" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 123, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "grover.h(qr[0])\n", - "grover.h(qr[1])" + "qc.measure(qub[0],cb[0])\n", + "qc.measure(qub[1],cb[1])\n", + "qc.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Realizando o próximo passo realizaremos a mudança condicional
\n", - "de fase para cada base computacional onde $|0\\rangle$.
\n", - "\n", - "**Subpasso 3**\n" + "Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", + " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " ] }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 27, "metadata": {}, "outputs": [ { "data": { + "image/png": "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jjtywQUXrDD/oosuYuzYsey2226MHz+eF154Ydm8GTNmcPDBB7PzzjszduxYnn/+eQAuu+wydtxxRxoaGpgzZ063rYukrmeA9pCu+LKePn06++yzDzvttBNHH300Cxcu7Lb16e2WLFnCySefzHXXXcf999/PDTfcwJNPPrlcm+2224477riDe+65h49//OOcdtppy+Ydf/zxnHDCCfz5z3/m9ttvZ+ONNwZg55135pe//CXDhg3r1vWR1PUM0B7QVV/Wp59+OscffzwPPvggG2ywAddcc023rldv9tBDD7HFFluw+eabM3DgQA4++GBuueWW5drsvvvuDBo0CICddtqJmTNnAvDkk0+yePFi9t57bwDe8573LGu33XbbMXz48G5cE0ndxQDtAV3xZZ2Z/OlPf+Kggw4C4NOf/jS/+c1vunGterdZs2bxvve9b9nzIUOGMGvWrFbbX3PNNeyzzz4APPvss6y//vocccQR7Lnnnnz7299myZIlXV6zpJ5lgPaArviynjt3Luuvvz79+/dv0zK1vMxcYVpEtNj2uuuuY+LEiZxwwgkALF68mPvvv58zzzyTP/zhD0ybNo0JEyZ0ab2Sel7/ni6gL6ryZX3zzTcDf/uyvuuuuxg6dChHH300EyZMYL/99mvzMrWiIUOG8OKLLy57PnPmTDbddNMV2v3xj3/kvPPO4+abb2bNNddc9trtttuOzTffHIADDjiABx98sFvqltRz3APtAe39sp4wYUKLX9b9+/fngAMO4LHHHmOjjTbijTfeYPHixStdplq2ww47MHXqVKZPn87ChQu58cYb2XfffZdr89hjj3HSSScxYcIEBg8evNxrX3/9dWbPng3A3XffzciRI7u1fkndzwDtAV3xZR0R7LbbbvzqV78C4Nprr2X//ffvvpXq5fr3788555zDIYccwtixYxk/fjyjRo3i7LPPXnZ++rTTTmP+/PkcddRR7LHHHhx++OEA9OvXjzPPPJPx48ez6667AnDEEUcAcOmllzJ69GhmzpzJ7rvvzoknntgzKyip00VLhxP7iqamprzjjjt65L1vu+02vvnNb7JkyRI+85nP8NWvfpWzzz6bpqYm9ttvPz7xiU8wadIkNtlkEwCGDh267LzanXfeyamnnkpmsv3223P++eczcOBApk2bxjHHHMNrr73Gtttuy6WXXrpsz1WS1DYNDQ0PZeZOq2pngPZQgEqS6lNbA9RDuJIkVWCASpJUgQEqSWqXjgxFCvDmm28yevRoTj755GXTbrjhBnbddVd22203DjnkkF4xdrQBKklqs44ORQpw9tlns8suuyx7vnjxYk455RRuuukm7rnnHkaPHs1ll13WLevTEQaoJKnNOjIUKcAjjzzCq6++umw4UigGl8lMFixYQGYyb968XnEduwEqSWqzjgxF+u6773LqqadyxhlnLNdmwIABnHvuuey6665svfXWTJkyhc9+9rNdswKdyACVJLVZR8aNvvzyyxk3bhxDhw5drt2iRYu44ooruOuuu5g0aRKjR4/m/PPP7/ziO5lj4UqS2qwj40b/5S9/4f777+fyyy9n/vz5LFy4kHXWWYcDDzwQgC222AKA8ePHt9g5qd4YoJKkNqsdirSxsZEbb7yRH//4x8u1WToU6fXXX7/cUKS17SZMmMAjjzzCaaedxqxZs5gyZQqzZ89m44035s477+QDH/hAt61TVQaoJKnNaseNXjoU6dJxo5cORVo7bjQsPxRpSxobGzn55JM54IADGDBgAMOGDeOiiy7qrlWqzKH8HMpPklSjrUP5uQeq1dLJV23Y0yV0mnM+91pPlyCpBQZoJ/DLWpL6Hi9jkSSpAgNUkqQKDFBJkiowQCVJqsAAlVTXqt4664UXXmDvvfdmjz324MMf/jBXXHHFstecddZZbLPNNgwbNqzb1kOrHwNUUt3qyK2zNtlkE373u99x9913c9ttt3HBBRcsG/T8ox/9KLfffnu3r49WLwaopLrVkVtnDRw4cNkYrAsXLuTdd99d9poPfehDveJ2WapvBqikutWRW2cBzJgxg912241tt92WL3/5yzQ2NnZpvepbDFBJdasjt86CYgzWe+65hwcffJBrr72WV155pctqVd/jSESS6lZHbp1Vq7GxkZEjR3L//fdz0EEHdWnNvY0jqVXnHqikulV766yFCxdy4403su+++y7XZumtsyZMmLDcrbNefPFF3nrrLQBef/11HnjgAbbaaqturV+rNwNUUt2qvXXW2LFjGT9+/LJbZy3tTFR766w99tiDww8/HICnnnqKcePGsfvuu/Oxj32ML37xi2y99dbLXjN69GgWLFjA6NGj+f73v99j66jeq9tvZxYRXwC+DjQCfwW+kpl/aqXtwcBxQBOwFjAJ+G5m3tRK+8OACcBvMvNjq6qls25n5iGQ+uM2kdrG35UVtfV2Zt26BxoRnwIuBM6mCMX7gFsiYngrL9kTuAM4oGz/W+CXEbF7C8seAfwAaDGMJUnqTN19CPck4MrMvCwzJ2fmCcAs4PiWGmfmlzPz+5n5QGY+k5lnAA8B42vbRcQA4GfA/wOmdu0qSJLUjQEaEQOBHYFbm826FdilHYtaF2i+n/5dYFpmXlW9QkmS2q47L2PZGOgHvNxs+svAPis2X1FEfBEYClxdM+0jwKeA7du4jGOBY6Ho2v7www8DRXf5QYMG8cwzzwCw/vrrM2LECCZOnAhAv379GDNmDFOmTGH+/PkAjBo1irlz5wKrzzmEpZ/HiBEjWLhwITNmzACKYdEaGhqYPHkyAOussw4jR47k0UcfZcmSJQA0NTUxdepU3njjDQC23HJLFixYsGxkmMbGRtZbbz2mTJkCwLrrrstWW23FxIkTyUwigqamJp5++mnmzZsHwMiRI3nzzTeXXTzf1u20Onn88cdZtGgRAGPGjOH555/ntdeKvyF7+3Zq6ffp5ZeLr4ihQ4cycOBApk4tDiptuOGGDB8+nEcffRSAAQMGsO222zJ58uRlvW233nprXn31VV599VUANttsMyKCadOmAbDRRhvR2NjIE088AcCaa67J6NGj+etf/8o777wDwDbbbMOsWbOYM2cOAJtvvjmZyfTp0wEYPHgwgwcPZtKkSQCsvfbajBo1qtdup9Xp+2vOnDmdsp3aqts6EUXEEOBFYI/aTkMRcRpwWGZ+cBWv/yRFcH56aSeiiNgYeAw4PDP/WE67EtjYTkTVrC4dVtwmUtv4u7KitnYi6s490NnAEqD5VdDvZcW90uXUhOcRzXrgbkPRm/f2mtFJ1ihfsxgYnZlTOl66JEnL67ZzoJm5kKID0Lhms8ZR9MZtUUQcClwDHJmZv2g2+y/AthSHb5f+3ETRE3d74LlOKV6SpGa6eyi/HwJXR8QDwL0U13gOAS4BiIifAmTmEeXzT1PseX4NuDsilu69LszMuZk5H3ii9g0i4nWgf2YuN12SpM7UrQGamT+PiI2Ab1Ecen0C2D8zp5dNml8PehxFjReUP0vdBezVtdVKktS6bh9MPjMvBi5uZd5eK3vexuUfWaUuSZLaw7uxSOo29vjU6sTB5CVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqqBdARoRh0bER2qefzsiZkTE7yOisfPLkySpPrV3D/T0pQ8iYgfgm8C/AQOA8zqvLEmS6lv/drbfDJhSPv4E8N+ZeU5E3Ar8vlMrkySpjrV3D/RtYN3y8T8At5eP36iZLknSaq+9e6B/As6LiHuAnYBDyukfAF7ozMIkSapn7d0D/RKwkCI4j8vMmeX0/fAQriSpD2nXHmhmzgAObGH6VzqtIkmSeoF2XwcaEWtFxCER8Y2I2KCc9v6IaOj88iRJqk/t2gONiC0pOg69B9gAuB54HTi+fH5MZxcoSVI9au8e6AXArcAmwFs1028C9u6soiRJqnft7YW7CzA2M5dERO3054EhnVaVJEl1rspYuANamDac4lpQSZL6hPYG6K3ASTXPMyLWA84AftNpVUmSVOfaewj3JODOiJgCrAX8HNgSeBk4tJNrkySpbrX3OtCZEbE9cBiwA8Ue7I+B/8rMt1b6YkmSViPt3QOlDMqflD+SJPVJqwzQiDgY+HVmLioftyozb+y0yiRJqmNt2QP9BbAp8Er5uDUJ9OuMoiRJqnerDNDMXKOlx5Ik9WXtCsSI2CMiVgjdiOgXEXt0XlmSJNW39u5R3gm0NGj8BuU8SZL6hPYGaFCc62xuI2B+x8uRJKl3aNNlLBFxU/kwgWsi4p2a2f2AbYD7Ork2SZLqVluvA51T/hvAayx/J5aFwD3AZZ1YlyRJda1NAZqZRwFExDTg3Mz0cK0kqU9r71B+Z3RVIZIk9SZtGYnoMWDPzHwtIh6n5U5EAGTmdp1ZnCRJ9aote6A3AEs7Da1sJCJJkvqMtoxEdEZLjyVJ6sscmk+SpAracg50pec9a3kOVJLUV7T1biySJKlGu86BSpKkQrefA42IL0TEcxHxdkQ8FBG7r6RtY0RMiIgnI2JJRFzZSrv1IuLfImJmRLwTEc9ExKFdthKSpD6vW68DjYhPARcCX6AY/u8LwC0RsXVmPt/CS9YEZgPfB45tZZkDgFsphhg8FJgBDOVvl95IktTpuvs60JOAKzNz6bi5J0TEvsDxwCnNG2fmNOBEgIg4pJVlHgW8F9gjMxeW06Z1sE5Jklaq264DjYiBwI7Auc1m3QrsUnW5wHjgXuBHEXEQMBe4DvhuZi5qoY5jKfdmGxsbefjhhwEYMmQIgwYN4plnngFg/fXXZ8SIEUycOBGAfv36MWbMGKZMmcL8+cVQwKNGjWLu3LnAhh0ov74s/TxGjBjBwoULmTFjBgCbbLIJDQ0NTJ48GYB11lmHkSNH8uijj7JkyRIAmpqamDp1Km+88QYAW265JQsWLGDmzJlA8Xmvt956TJkyBYB1112XrbbaiokTJ5KZRARNTU08/fTTzJs3D4CRI0fy5ptvMmvWLKDt22l18vjjj7NoUfFfecyYMTz//PO89tprQO/bTquTpb8ra6+9NqNGjeq122l1+v6aM2cO06dPB2Dw4MEMHjyYSZMmAe3bTm0VmW26QmX5F0W8HxhVPp2cmc+24TVDgBcpDgffXTP928BnMnPkKl5/MzA7M49sNv1JYHNgAnBR+fgi4JrM/NrKltnU1JR33HHHqkpfpZOvWn3+A57zudd6uoRO4TapT26X+uM2WVFDQ8NDmbnTqtq1azD5iNgIuBz4OPDu3ybHzcDRmTmn1Rf/TfPEbu0m3W21BvAK8PnMXAI8VNZ5fkR8Pav8hSBJ0iq0txfufwJbArsDa5U/ewBbsOr7gc4GlgCbNpv+XuDldtZRaxbwVBmeS00GBgEbd2C5kiS1qr0B+lGKPb17M3Nx+XMv8H/Kea0qO/g8BIxrNmsccF8766h1L7BlRNSuyweABRShLUlSp2tvgL4KtHQz7QVAWw7f/hA4MiKOiYhREXEhMAS4BCAifhoRP619QURsHxHbA+sBDeXzrWua/AfQAFwYESMj4qPAGcDFHr6VJHWVdp0DBc4ELoiIz2bmiwAR8T7gvHLeSmXmz8vzk98CGoEngP0zc3rZZHgLL5vY7PmBwHSKzkJk5gsR8RGKcH4EeAn4CXBW+1ZNkqS2qzKY/BbAtIh4sXz+PuBtinOZ/7mq5WXmxcDFrczbq4Vp0YZl/g8duxRGkqR2cTB5SZIqcDB5SZIq8IbakiRV0K4AjYiBEXFGRDxV3k1lSe1PVxUpSVK9ae8e6HeAz1H0un0X+DrFsHlzKO6sIklSn9DeAD0UOC4zL6UYVehXmXkicBorDpAgSdJqq70BugkwqXz8v8AG5ePfAR/prKIkSap37Q3Q5ylGDgJ4hr8N3/dh4K3OKkqSpHrX3gD9JfAP5eMLgTMi4jngStowiIIkSauLdg3ll5mn1Dz+RUTMoBgB6KnMvLmzi5MkqV61dyzc5ZRD6P1PJ9UiSVKv0e6BFCJih/KuKQ+WP1dHxA5dUZwkSfWqvQMpfAb4C8WdVH5b/mwCPBAR/9T55UmSVJ/aewj3u8CpmXl27cSIOIXi9mHXdFZhkiTVs/Yewh0MXNfC9OspbmcmSVKf0N4AvRPYq4XpewF3dbQYSZJ6i7bcUPvgmqe3AN+LiJ34W+/bscDBwOmdXp0kSXWq6g21jy1/av0IuLjDFUmS1Au05Yba3jNUkqRmDEdJkiqoMpDCARFxd0TMjohXI+KuiNi/K4qTJKletXcghWMoBpR/FvgG8C/Ac8AvI+Lozi9PkqT61N6BFL4BnJSZ/14z7fKIeIgiTH/SaZVJklTH2nsIdzjFzbObuwXYrOPlSJLUO1S5ofa4FqZ/BJje8XIkSeod2nsI91zgR+XdV+4DEtgN+CxwQifXJklS3WrvDbUvjYhXgK9SjD4EMBk4NDN/1dnFSZJUr9ocoBHRn+JQ7d2Z+cuuK0mSpPrX5nOgmbkYuBFYt+vKkSSpd2hvJ6JHgS27ohBJknqT9gbo6cB5ETE+IoZFREPtTxfUJ0lSXWpvL9zflP/eSNEDd6kon/frjKIkSap37Q3QvbukCkmSepk2BWhEDAJ+AIwHBgC3Aydm5uwurE2SpLrV1nOgZwBHUhzC/RnFaET/0UU1SZJU99p6CPdg4J8z81qAiPgv4N6I6JeZS7qsOkmS6lRb90CHAX9a+iQzHwAWA0O6oihJkupdWwO0H7Cw2bTFtL8TkiRJq4W2BmAA10TEOzXT1gIui4gFSydk5sc7szhJkupVWwP0qhamXdOZhUiS1Ju0KUAz86iuLkSSpN6kvUP5SZIkDFBJkioxQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKuj1AI+ILEfFcRLwdEQ9FxO6raL9n2e7tiJgaEcc1m98vIr5Ts8znIuKsiOjftWsiSerLujVAI+JTwIXA2UATcB9wS0QMb6X9FsBvy3ZNwPeAH0XEJ2uafQP4InAi8EHgy+XzU7poNSRJorv30k4CrszMy8rnJ0TEvsDxtBx4xwEzM/OE8vnkiNgZ+BpwQzltF+DXmfnr8vm0iLgJ2LlL1kCSJLpxDzQiBgI7Arc2m3UrRQi25MMttP89sFNEDCif3wPsHREfLN9na+DvKfZcJUnqEt25B7ox0A94udn0l4F9WnnNpsDtLbTvXy5vFvCvwLrApIhYUs77bmZe3NICI+JY4FiAxsZGHn74YQCGDBnCoEGDeOaZZwBYf/31GTFiBBMnTgSgX79+jBkzhilTpjB//nwARo0axdy5c4EN2/QB9AZLP48RI0awcOFCZsyYAcAmm2xCQ0MDkydPBmCdddZh5MiRPProoyxZsgSApqYmpk6dyhtvvAHAlltuyYIFC5g5cyZQfN7rrbceU6ZMAWDddddlq622YuLEiWQmEUFTUxNPP/008+bNA2DkyJG8+eabzJo1C2j7dlqdPP744yxatAiAMWPG8Pzzz/Paa68BvW87rU6W/q6svfbajBo1qtdup9Xp+2vOnDlMnz4dgMGDBzN48GAmTZoEtG87tVVkZievQitvFDEEeBHYIzP/VDP9NOCwzPxgC695Crg6M79TM21P4I9AY2a+FBGfBn4AfB34K7A9xXnWr2fm5SurqampKe+4444Or9vJV60+/wHP+dxrPV1Cp3Cb1Ce3S/1xm6yooaHhoczcaVXtunMPdDawhGKvstZ7WXGvdKmXWmm/GJhTPv8BcG5mXls+fzwiNqM4p7rSAJUkqapuOweamQuBh4BxzWaNo+hl25L7WfHw7jjgwcxcVD4fRBHMtZbgNa6SpC7U3b1wfwhcHREPAPdS9LIdAlwCEBE/BcjMI8r2lwBfiogLgEuBXYEjgcNqlvlr4F8i4jmKQ7hNFL19f9rVKyNJ6ru6NUAz8+cRsRHwLaAReALYPzOnl02GN2v/XETsD5xPcanLTODEzLyhptkJwHeAiykO784CLgPO7Mp1kST1bd0+Wk/ZO7bFHrKZuVcL0+4CdljJ8uYBXyl/JEnqFp4nlCSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKuj1AI+ILEfFcRLwdEQ9FxO6raL9n2e7tiJgaEcd1dJmSJHVUtwZoRHwKuBA4G2gC7gNuiYjhrbTfAvht2a4J+B7wo4g4tjhXAAAHW0lEQVT4ZNVlSpLUGbp7D/Qk4MrMvCwzJ2fmCcAs4PhW2h8HzMzME8r2lwFXAV/rwDIlSeqwbgvQiBgI7Ajc2mzWrcAurbzswy20/z2wU0QMqLhMSZI6rH83vtfGQD/g5WbTXwb2aeU1mwK3t9C+f7m8aO8yI+JY4Njy6f82NDRMaUvxdWBjYHZXv8l//t+ufofVTpdvF7dJu/m7Up960+/KZm1p1J0BulQ2ex4tTFtV+6XTYyVtWlxmZv4Y+PGqy6wvEfFgZu7U03VoeW6X+uM2qU+r43bpzgCdDSyh2Kus9V5W3INc6qVW2i8G5lAEZXuXKUlSh3XbOdDMXAg8BIxrNmscRc/ZltzPiodixwEPZuaiisuUJKnDuvsQ7g+BqyPiAeBeil62Q4BLACLipwCZeUTZ/hLgSxFxAXApsCtwJHBYW5e5Gul1h537CLdL/XGb1KfVbrtE5spOP3bBG0Z8ATgZaASeAP5vZt5dzvsjQGbuVdN+T+B8YDQwE/jXzLykrcuUJKkrdHuASpK0OnAsXEmSKjBAJUmqwACVJKkCA1TSaiMiovZfqSvZiaiORcRQYEuKASPeBaZk5ks9W5XUeywN0vSLTl3AAK1TEXE8cDQwBpgPPAPMoBhc4leZOSUi1sjMd3uwzD4lItbOzLd6ug6tKCLWAA4CBgODgBeBuzLzlR4tTKs1A7QORcRGFIF5HvAfFF8K+wB7Ax+k+HL4SmZOiojwr+uuFxEbAo8CvwGuAe5b+rnXboOI+CDFLfje7LFi+5iIWBe4nOL3412KPzQTeAu4C7gmM5/0d6X7RMQAYAtgema+09P1dBXPgdanw4GnMvOszJyTmU9m5r9n5ieB/wOsDdwcERv7hdBt/gnYhOL2eXcDz0TEmRExsiY8hwE/o7jrhLrPicBIYP/M3AT4DHAB8Ffgo8A5ETHY35Vu9UVgInBJRBwYEZtGRL/aBhGxXkTsV4Ztr2SA1qeFwLoRsQ1ARKxZ3vuUzLyH4gvibeAjPVdin7MdcAXwMaAJuI5iSMlJEfE/5W3y/gnYKjOn9lyZfdK+wFWZ+ReA8g/Oayi+xL8KjAKu7sH6+qJPAQ9Q9OH4b4pTTz+IiN0iYv2yzeHAaZm5qIdq7DADtD79guJQ1FciYt3MfCczF5bnecjM54HXgaE9WWRfERFrApOAFzLzlcx8LDNPAXai2MOZBJwOfBf41x4rtA+KiP4Uw3d+MiIGl9P6RUS/zFxSDul5HDA0Isb0ZK19RbkdFgGXZebuFPfWvJzij8+7gTsi4hvAV4A/91ihncBzoHWmpvv9QcCFQAPF3s7FFIdEhgJ7UJwb3TYzp/VAmX1OGaIbZuZL5aGorO3AFRF7AXcAwzNzRg+V2SdFxFjgvyj+8PxhZr7cbP4wYDIwMjNf7IES+5SIaAQ+DUzKzN83m9cEHFPO3xAY1pu3iQFapyJiA2A4sAvwCYo70UBxj9Q1gJ9m5uk9U13fsrTzSUSMAObXfkHXzPs2cGRmjui5Svue8qjMGsBRwNkUd5j6BfBz4AWKQ+8HAqMy80M9VWdfExFrU/yR+XbtNbk1/QW+S3HOuqmnauwMBmgdiYj3Ap+lOG8zm6IX4evAnygOdQwA3g/8HnjaThFdr2abnAS8QnEz91nA9cCNmTm//IL4PEXv25t7rNg+rvyj80iKc2vbA/OAdyjOxX0vM3v14cLeprVezxExCHgYuCIze/UpDwO0jkTElRS3bfs1MJfi8O22wAcovry/5ZdA92plmzRRXE40A/hBZt7aYwX2YRGxHjCv9ku63CNdC3gPsA3FEQN/Z7pJS9ukhTZrUXQy+llmLuy24rqAAVonyr2YeRSHNe6umTYcGAv8MzACODQzH+6xQvuQlWyTYcDOFHudmwGHuU26X0RcSrF3+QDF9YYrXHsbERtm5mteA9o92rhNNsjM17u9uC5gL9z6sTXwHMUlLEBxviAzp2fmzynO47wO/GMP1dcXtbZNns/M6yl6Fc7DbdLtIuIwij9gzgN+RXGJxMERsWV5/o2IeA9wRURsa3h2vVa2ySci4v0122Rt4Kqll+j1du6B1onyP9bNFMOQHQE823yYvog4AfjnzNy+B0rsc9wm9SsiLgOWAOcABwOfo+gfMAX4LfAHisEVLszMgT1VZ1/SF7eJe6B1ohxj9f9RjDL0U+CIiBgWEevAshPve1Jc86Zu4DapT+W1n88Br2fm1Mw8NzO3BT5EMXTf5ygu/foRDqDQLfrqNnEPtM6UhzZOBT5OMYj8/cCrFGPhzgKOyczHe67CvsdtUn/KsYk3Kce4HQgsataZ6FMUwyrukJmP9FSdfUlf3CYGaJ0qL584ABhPMWzfE8D1mflkjxbWh7lN6lvZAzcyc0lEfJ7iUOGgnq6rL1vdt4kB2guEty2rO26T+hYRJwH9MvMHPV2LCqvjNjFAJa12yjt8LPGPnPqxOm4TA1SSpArshStJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFfx/8MYwZ65U6k0AAAAASUVORK5CYII=\n", "text/plain": [ - "" + "
" ] }, - "execution_count": 124, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Select the QasmSimulator from the Aer provider\n", + "simulator = Aer.get_backend('qasm_simulator')\n", "\n", - "grover.z(qr[0])\n", - "grover.z(qr[1])\n" + "# Execute and get counts\n", + "result = execute(qc, simulator).result()\n", + "counts = result.get_counts(qc)\n", + "plot_histogram(counts, title='O indíce procurado')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "## Inversão sobre a média\n", "\n", - "Agora aplicaremos a transformação de Hadamard novamente\n", - "\n", - "**Subpasso 4**\n" - ] - }, - { - "cell_type": "code", - "execution_count": 125, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 125, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "grover.h(qr[0])\n", - "grover.h(qr[1])" + " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", + " \n", + " Agora considere que ao inves de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", + " \n", + " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", + " $$\\left[\\begin{array}{ccccc}\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", + " \\end{array}\\right]\n", + " \\left[\\begin{array}{c}\n", + " 4 \\\\\n", + " 5 \\\\\n", + " 10\\\\\n", + " 3 \\\\\n", + " 3 \\\\\n", + " \\end{array}\\right] \n", + " = \n", + " \\left[\\begin{array}{c}\n", + " 5 \\\\\n", + " 5 \\\\\n", + " 5\\\\\n", + " 5 \\\\\n", + " 5 \\\\\n", + " \\end{array}\\right]$$\n", + " \n", + " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", + " \n", + " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", + " $$\n", + " \\bar{V} = -V + 2AV \n", + " $$\n", + " Evidenciando o vetor $V$ obtemos: $(-I + 2A)V$. Desse modo, o operador de inversão sobre a média é obtido a partir da operação matricial: \n", + " $$\n", + " -I + 2A\n", + " $$\n", + " \n", + " ### Implementando inversão sobre a média\n", + " \n", + " Sob a perspectiva de computação quântica este operador pode ser obtido a partir da seguinte fórmula: \n", + " \n", + " $$\n", + " H^{\\otimes n}\\left(2|0\\rangle\\langle0| - I \\right)H^{\\otimes n}\n", + " $$\n", + " \n", + " Considerando a entrada do sistema $|\\psi\\rangle$, a qual será efetuada a busca, como de uma superposição de todos os estados possíveis. Ou seja : $H^{\\otimes n} | 0 \\rangle^{\\otimes n} = |\\psi\\rangle$.\n", + " E Considerando tanto $|0\\rangle$ como $\\langle 0|$ como vetores de dimensão $n$ obtemos:\n", + " \n", + " $$\n", + " 2|\\psi\\rangle\\langle\\psi | - I\n", + " $$\n", + " \n", + " Do ponto de vista de implementação o passo a passo para aplicar a inversão sobre a média no sistema seria da seguinte forma: \n", + " 1. Aplicar transformações de Hadamard $H^{\\otimes n}$\n", + " 2. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", + "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$
\n", + " 3. Reaplicar transformações de Hadamard $H^{\\otimes n}$\n", + " \n", + " A aplicação do operador $U_f$(ou oracle)junto com os três passos $1,2$ e $3$ compõe a interação de Grover ou _Grover's interation_.\n", + " O algoritmo tem que ser executado até $\\sqrt{N}$ vezes, mais especificamente a aplicação da interação de Grover no sistema. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Passo 3\n", - "\n", - "Agora repitiremos os subpassos de 1 a 4, porque são necessárias $\\sqrt{N}$ interações,
\n", - "onde N é tamanho do nosso vetor que no nosso caso é 4, o que nós dá 2 iterações.
\n", - "\n" + "# Circuito Quântico" ] }, { "cell_type": "code", - "execution_count": 126, + "execution_count": 61, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐\n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
+       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├───────────────\n",
+       "        └───┘└───┘└───┘               └───┘               \n",
+       " c_0: 0 ══════════════════════════════════════════════════\n",
+       "                                                          \n",
+       " c_1: 0 ══════════════════════════════════════════════════\n",
+       "                                                          
" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 126, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#--- Função ---\n", - "grover.x(qr[1])\n", - "grover.ccx(qr[0], qr[1], qr[2])\n", - "\n", - "#---Hadamard\n", - "\n", - "grover.h(qr[0])\n", - "grover.h(qr[1])\n", - "\n", - "\n", - "#----Troca de fase\n", - "\n", - "grover.z(qr[0])\n", - "grover.z(qr[1])\n", - "\n", - "\n", - "#--- Hadarmard\n", - "\n", - "grover.h(qr[0])\n", - "grover.h(qr[1])\n", - "\n" + "#Inicialização dos estados\n", + "qub = QuantumRegister(3,'q')\n", + "cb = ClassicalRegister(2,'c')\n", + "qc = QuantumCircuit(qub,cb)\n", + "qc.h(qub[0])\n", + "qc.h(qub[1])\n", + "#Preparando a ancila\n", + "qc.x(qub[2])\n", + "qc.h(qub[2])\n", + "\n", + "#Interação de grover\n", + "for i in range(int(np.ceil(np.sqrt(4)))):\n", + " # Oracle\n", + " qc.ccx(qub[0], qub[1], qub[2])\n", + "\n", + " #---Hadamard\n", + " qc.h(qub[0])\n", + " qc.h(qub[1])\n", + "\n", + " #----Troca de fase\n", + " qc.z(qub[0])\n", + " qc.z(qub[1])\n", + "\n", + " #--- Hadarmard\n", + " qc.h(qub[0])\n", + " qc.h(qub[1])\n", + "\n", + "qc.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Passo 4\n", - "\n", - "Agora que já fizemos as iterações necessárias vamos fazer a medição e o valor
\n", - "obtido deve ser o indíce que nós buscamos que nesse caso é 10 (2)." + "Após a última aplicação podemos efetuar a medição dos qubits da entrada, ou seja efetuar a medição nos qubits $0$ e $1$. \n", + "O circuito quântico resultante ficaria então da seguinte forma:" ] }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 62, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "text/html": [ + "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐┌─┐   \n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├┤M├───\n",
+       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤└╥┘┌─┐\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├─╫─┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘ ║ └╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├────────────────╫──╫─\n",
+       "        └───┘└───┘└───┘               └───┘                ║  ║ \n",
+       " c_0: 0 ═══════════════════════════════════════════════════╩══╬═\n",
+       "                                                              ║ \n",
+       " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
+       "                                                                
" + ], "text/plain": [ - "
" + "" ] }, - "execution_count": 127, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "grover.measure(qr, cr)\n", - "\n", - "grover.draw()" + "qc.measure(qub[0],cb[0])\n", + "qc.measure(qub[1],cb[1])\n", + "qc.draw()" ] }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 69, "metadata": {}, "outputs": [ { "data": { - "image/png": "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p3DIIYc0lunatSv/9V//xfPPP7/be9u1a8ezzz7L/vvvz86dO/nyl7/MiSeeyJFHHsnDDz/cWO7GG2+kc+fOOdsnyR/VQEWkxZg5cyaf//zn6dOnD23btuXss8/mhRde2K1MWVkZhx12GK1b716/MDP2339/AHbu3MmuXbsws93KuDvPPvssX/3qV7O7I1IQlEBFpMWoq6vjoIMOanxdUVFBXV1dyu+vr69nxIgRDBo0iJEjR3LEEUfstn7GjBl87nOfo1+/+GmNZV+kBCoiLYa777EsvhbZlJKSEqZNm8bcuXOZNWsW8+fP3239xIkTOfvss5sdpxQHJVARSVs2GuI0mDBhAqWlpaxduzbjcVdUVPDBBx80vl61ahU9evRIeztdunTh2GOP5ZVXXmlctmvXLp577jm+8pWvZCRWKXxKoCKSloaGOL/97W+ZMWMGEydO5O9///tuZRoa4owZM2a35Q0NcV577TWmTZvGK6+8wltvvdW4fuXKlUydOpWePXtmJfbDDjuMJUuWsHz5cnbs2MGkSZM45ZRTUnrvxx9/zIYNGwDYunUrr776KgMHDmxcP3XqVAYMGLDbJWLZt6kVroikJbYhDtDYECe2JWtZWRllZWVMnjx5t/furSHODTfcwK233soFF1yQldhbt27NHXfcwTnnnEN9fT0XXHABlZWVPPLIIwBcfPHFrF69muOPP55NmzbRqlUr7r//fmbMmMHq1au58sorqa+v59NPP+Wss87i5JNPbtz2M888o8ZDLYwSqIikJVFDnJkzZ6b8/vr6eo477jiWLl3Kt771rcaGOC+88ALl5eVUVVVlPOZYo0aNYtSoUbstu/jiixufd+/enXnz5u3xviFDhvDqq68m3e69996buSClKCiBikhaMtUQZ8OGDVx44YXMnz+fPn36MH78eCZNmpTJUEWySvdARSQt2WiIs2zZMlasWMHw4cOprq5m1apVjBw5ktWrV2cydJGMUgIVkbRkoyHO4MGDee+996itraW2tpaKigqmTp1K9+7ds7krIs2iS7gikpZsNsQRKSaW6H5GS1FTU+NTpkzJdxgiIlJASktLZ7r7EXsrp0u4zRS1Q/nKlSs588wzOeqooxg2bBj3339/47q5c+dy0kknceyxx3LeeeexcePGnOyLiIikTgm0GZrTobx169b86Ec/4m9/+xuTJ0/m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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAFKCAYAAACtoA4lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XuYXWV59/HvTcIhiZwCAWYMAWNoCAphAMtBzghFEKSIKFqDtsoLKsJLVaqvGEDEFsRCKQhSEITGAopVUYRiqsihoBACmBgOIYGQgEmAEMIhyXC/f6w16c5kJplZc9oz8/1c11zZe61nr33vWZn5zbPWep4VmYkkSeqc9fq6AEmS+iMDVJKkCgxQSZIqMEAlSarAAJUkqQIDVJKkCgxQqYdExBURcVbF134yIu6ueb5xRDweEX/ZfRUODBGxfURkRAzt61o0uBigUgeVofZoRLwWEc9HxHcjYrP22mfmyZn5jW56++8AF2fmA920PUldZIBKHRARfw/8E/AlYFNgL2A74L8iYoMefu9NgGmZeXlPvs86auiV3p29SPUnBqi0DmWAnQOcmpm/yswVmTkHOJ4iRP+mndddGxHnlY8PjIh5EfH3EfHniFgQEZ+qabtFRPwsIl6JiAeAd7asy8xXgMsiYlzZdlhEXBQRcyNiSUTcHRHDynV7RcS9EfFyREyPiAPX8rnmRMRXImJGRLwUEd+PiI1a1XtmRDwPfL9c/pmIeDIiXizrbazZ3rsi4r/KdS9ExFdbfx9qt92qjjMj4hFgWUQMjYh/iIinImJpWd9f17QfEhHfjohFETEbOLLV52osa3uxrPUz7X0PpK4wQKV12wfYCLildmFmvgrcBhzawe1sQ9F7fTvwdxShuHm57jLgDaAB+Nvyqz3fBnYv6xoJfBl4KyLeDvwCOK9c/kXgxxExai3b+jjwVxSB/RfA11rVO5Lij4STIuJg4FsUfzg0AHOB/4DiHC1wJ/AroBEYB/x6rd+N1Z1AEYSbZeZK4ClgP4rv1znADRHRULb9DPABoAnYAziu1bZ+CMwr6zgOOD8iDulELVKHGKDSum0JLCp/sbe2oFzfESuAc8se7C+BV4HxETEE+BDw9cxclpmPAde1tYGIWI8iXE/LzOcyszkz783MNyl6wr/MzF9m5luZ+V/AH4Aj1lLTv2bms5n5IvBNiiBr8RYwOTPfzMzXKcL2msx8qHy/rwB7R8T2FIH2fGZelJlvZObSzLy/g98XgH8p63gdIDNvzsz55ee4EXgCaLmA6niK88EtdX+r5vuzLbAvcGZZx8PAvwGf6EQtUocYoNK6LQK2bOf8XEO5viMWtwrh14C3AaOAocCzNevmtrONLSl6w0+1sW474MPl4duXI+JlijBpaKNti9bv2VjzfGFmvlHzvLG2rrIHvpiiR71tOzV1VG0dRMSkiHi45nO8m//9Q6Wxjbpra3wxM5e2Wv/2LtQmtckAldbtPuBN4NjahRExAng/nTtU2ZaFwEqKEGoxpp22iygO9b6zjXXPAtdn5mY1XyMy8x/X8t6t33N+zfPWt2qaTxHSwKrPvwXwXPnebdUEsAwYXvN8mzbarHqviNgOuAr4PLBFZm4GPAZE2WRBG3XX1jiyPKRcu/65dmqTKjNApXXIzCUU5+EujYjDI2L98rDlzRTn2q7v4vabKc6vnh0RwyNiJ+DEdtq+BVwDfKe8WGZIROwdERsCNwBHRcRflcs3Ki/YGb2Wt/9cRIyOiJHAV4Eb19J2CvCpiNi1fL/zgfvLC6puBbaJiNMjYsMoxq3uWb7uYeCIiBgZEdsAp6/jWzKCIlAXApQXW727Zv1NwBfKujcH/qHm+/MscC/wrfLz70Jxvvnf1/GeUqcZoFIHZOYFFAHzbeAV4H6KXtch5fnArvo8xeHc54FrKa96bccXgUeB3wMvUgyvWa8Mjw+WdS4s6/sSa/85nwLcAcwuv85rr2Fm/ho4C/gxRS/wncBHy3VLKS6mOqr8DE8AB5UvvR6YDswp32ttIU1mzgAuouj5vwDsDNxT0+Qq4PZymw/R6uIuivO421P0Rn9CcR73v9b2nlIV4Q21pcEpIuYAn87MO/u6Fqk/sgcqSVIFBqgkSRV4CFeSpArsgUqSVIEBKklSBYP6zgdbbLFFjhnT3nh1SdJg9PDDDy/KzLXNIQ0M8gAdM2YMU6dO7esyJEl1ZOTIke1NpbkaD+FKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqKS6duedd/KXf/mX7L777lx88cVrrL/sssvYa6+92HfffTnmmGN49tlnV62bN28exx57LHvuuSd77bUXzzzzDACZyXnnncd73vMe9txzT6688spe+zwaOIb2dQGS1J7m5ma+/OUvc8stt9DY2MghhxzC4Ycfzo477riqzS677MLUqVMZPnw411xzDZMnT+aaa64B4JRTTuGMM87goIMO4tVXX2W99Yo+w5QpU3juuee4//77WW+99Vi4cGGffD71b/ZAJdWtBx98kHe84x1sv/32bLDBBhx77LHcdtttq7XZb7/9GD58OAB77LEH8+fPB+BPf/oTK1eu5KCDDgLgbW9726p23//+9/nSl760KlBHjRrVWx9JA4gBKqluLViwgLe//e2rnjc2NrJgwYJ2299www28733vA+Cpp55i0003ZdKkSRxwwAF8/etfp7m5GYCnn36an/zkJxx88MF8+MMf5qmnnurZD6IByQCVVLcyc41lEdFm25tuuolp06Zx6qmnArBy5Uruu+8+zj33XH79618zZ84cpkyZAsDy5cvZcMMNmTp1KpMmTVr1GqkzDFBJdauxsZHnnntu1fP58+ezzTbbrNHuN7/5DRdddBFTpkxhww03XPXaXXbZhe23356hQ4dy5JFH8sgjj6xad/TRRwPwgQ98gD/+8Y+98Gk00BigkurWbrvtxuzZs5k7dy7Lly/nlltu4fDDD1+tzSOPPMIZZ5zBlClTVjuXudtuu/Hyyy+zaNEiAO666y7Gjx8PwBFHHMFdd90FwD333MO4ceN66RNpIPEqXEl1a+jQoVxwwQUcd9xxNDc38/GPf5wJEyZw/vnn09TUxPvf/34mT57MsmXL+NSnPgXA6NGjmTJlCkOGDOHcc8/lmGOOITPZddddmTRpEgCnn346J510Et/97ncZMWIEl1xySV9+TPVT0dY5hsGiqakpp06d2tdlSJLqyMiRIx/MzD3W1c5DuJIkVWCASpJUgQHaR7oyPdmWW27J/vvvz/7778/HPvaxNV575plnsu222/Zo/ZI02HkRUR/o6vRkw4YNW3UFYWvTpk1jyZIlvfI5JGkwswfaB7oyPdnaNDc3M3nyZM4+++yeKFuSVMMA7QNdmZ4M4I033uDggw/m0EMP5Re/+MWq5VdddRWHH354mwPNJUndy0O4faDK9GS33nrrqmWPPPIIDQ0NzJkzhw9+8IPstNNObLTRRvz0pz/l5z//eY/VLUn6XwZoH+js9GS33nrrqunJABoaGgDYfvvt2XfffXnkkUcYNmwYTz/9NLvvvjsAr732GrvvvjsPPvhgD38aSRqcPITbB7oyPdnLL7/Mm2++CcDixYu5//77GT9+PIcddhh/+tOfmD59OtOnT2f48OGGpyT1IHugfaAr05PNmjWLM844g/XWW4+33nqL0047bbWrdyVJvcOp/JzKT6U777yTr371qzQ3N/OJT3yC008/fbX1l112Gddffz1Dhw5lyy235NJLL11tvO0rr7zC3nvvzZFHHskFF1wAwFFHHcULL7zARhttBMCPf/xjb94s1bmOTuVnD1Si62NzAc4//3z22WefNbZ95ZVX0tTU1CufQ1LvMUAlVh+bC6wam1sboPvtt9+qx3vssQc33XTTqucPP/wwCxcu5JBDDuHhhx/utbr7my9ft3lfl9BtLjjxpb4uQX3Mi4gkujY296233uKss87inHPOabPt5z//efbff38uvPDCNocwSeqf7IFKdG1s7tVXX82hhx7K6NGj12h75ZVX0tjYyNKlSznxxBO58cYb+ehHP9q9xUvqEwaoRNfG5v7+97/nvvvu4+qrr2bZsmUsX76cESNGMHnyZBobGwHYeOONOe6443jooYcMUGmAMEAlVh+b29DQwC233ML3vve91dq0jM29+eabV7uStrbdlClTePjhh5k8eTIrV65kyZIlbLHFFqxYsYLbb7+dAw88sLc+kqQeZoBKdG1sbnvefPNNjjvuOFasWEFzczMHHHAAkyZN6q2PJKmHOQ7UcaBSr/Eq3IGh6pjpZ599lkmTJtHc3MyKFSs46aSTVv1BWk9jph0HKknqdl0ZM7311lvzq1/9ig033JBXX32V9773vRx++OGr5vfub2OmHcYiSeqwrtzPeIMNNlh18d3y5ct56623erf4bmaASpI6rKv3M543bx777rsvO++8M6eddtqq3if0vzHTHsLtBp7XkTRYdPV+xqNHj+buu+9mwYIFfOITn+Doo49mq6226pdjpu2BSpI6rLNjpqdMmbLa/YxbNDQ0MH78eO67775V24XVx0zXOwNUktRhXbmf8XPPPcfrr78OFPc2fuCBB9hhhx1YuXIlixcvBlg1ZnrChAm996Eq8hCuJKnDujJm+vHHH+ess84iIshMPve5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\n", "text/plain": [ "
" ] }, - "execution_count": 128, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -644,17 +469,28 @@ "simulator = Aer.get_backend('qasm_simulator')\n", "\n", "# Execute and get counts\n", - "result = execute(grover, simulator).result()\n", - "counts = result.get_counts(grover)\n", + "result = execute(qc, simulator).result()\n", + "counts = result.get_counts(qc)\n", "plot_histogram(counts, title='O indíce procurado')" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] + "source": [ + "## Exercício\n", + "\n", + " 1. Calcule os valores invertidos sobre a média de cada valor do vetor $\\left[4,5,10,3,3\\right]$\n", + " \n", + " 2. Mostre que $A^2 = A$\n", + " \n", + " 3. Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. \n", + " \n", + " 4. O que acontece se repetirmos o exemplo porém aplicarmos _inversão de fase_ e inversão sobre a média quatro vezes?\n", + " \n", + " 5. Fazer o exemplo para uma entrada de três qubits onde $f$ \"escolhe\" a cadeia 001\n", + " 6. Crie um circuito quântico utilizando um oracle diferente. Dica:Verifique a ação de $U_f$ sobre os estados da base ( incluindo a ancila )" + ] } ], "metadata": { From 39cd588bd61202a1dda9eccc234e20cbe534e33b Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Mon, 12 Aug 2019 20:25:18 -0300 Subject: [PATCH 25/49] Atualizando Deutsch -Jozsa --- .../deutsch_jozsa-checkpoint.ipynb | 143 +++++++++++++---- deutsch_jozsa.ipynb | 147 ++++++++++++++---- grover.ipynb | 123 +++++---------- 3 files changed, 277 insertions(+), 136 deletions(-) diff --git a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb index 129fb06..24c9eeb 100644 --- a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb +++ b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb @@ -9,9 +9,10 @@ "\n", "## Observação dos autores\n", "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", "\n", "### Cronograma\n", + "- Antes de comecarmos\n", "- Paralelismo Quântico\n", "- Problema de Deutch\n", "- Porta Hadamard para N qubits\n", @@ -22,38 +23,33 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Paralelismo Quântico\n", + "# Antes de começarmos\n", "\n", - "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", - "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", - "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", - "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", - "(só que é exponencial no número de qubits no sistema, tá ok?).\n", + " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", "\n", + "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", "\n", - "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", - " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", - " \n", - "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", + "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", "\n", + " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", + "\n", + " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", "\n", - "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", - " \n", - " \n", - "$$\\begin{eqnarray}\n", - " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", - " = \n", - " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", - " \\end{eqnarray}$$\n", - " \n", - " \n", - "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", "\n", + "## Avaliando uma função\n", "\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", + " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", "\n", + "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", "\n", - "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" + " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " \n", + " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", + "\n", + "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", + " \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", + " " ] }, { @@ -62,9 +58,102 @@ "source": [ "# Problema de Deutch\n", "\n", - "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "Agora que temos um noção do comportamento de $U_f$ e como podemos obte-lo podemos falar do problema de Deutsch.\n", + "\n", + "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", + "\n", + "### Conceitos Iniciais:\n", + "\n", + "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", + "\n", + "### Como o algoritmo funciona:\n", + "\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", + "\n", + "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Antes de seguirmos para nosso exemplo:**\n", + "\n", + "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", + "\n", + "\n", + "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", + "\n", + "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Exemplo:\n", + "\n", + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 1$ e $f(1) = 1$ que claramente esse é uma função constante.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", + "\n", + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", "\n", - "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Esses estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", "\n", "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", @@ -311,7 +400,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.7.3" } }, "nbformat": 4, diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index f220b06..03384ec 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -9,9 +9,10 @@ "\n", "## Observação dos autores\n", "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", "\n", "### Cronograma\n", + "- Antes de comecarmos\n", "- Paralelismo Quântico\n", "- Problema de Deutch\n", "- Porta Hadamard para N qubits\n", @@ -22,38 +23,39 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Paralelismo Quântico\n", + "# Antes de começarmos\n", "\n", - "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", - "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", - "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", - "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", - "(só que é exponencial no número de qubits no sistema, tá ok?).\n", + " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", "\n", + "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", "\n", - "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", - " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", - " \n", - "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", + "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", "\n", + " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", "\n", - "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", - " \n", - " \n", - "$$\\begin{eqnarray}\n", - " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", - " = \n", - " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", - " \\end{eqnarray}$$\n", - " \n", - " \n", - "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", + " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "\n", + "## Avaliando uma função\n", "\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", + " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", "\n", + "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", "\n", - "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" + " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " \n", + " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", + "\n", + "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", + " \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", + " " ] }, { @@ -62,9 +64,102 @@ "source": [ "# Problema de Deutch\n", "\n", - "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", + "\n", + "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", "\n", - "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", + "### Conceitos Iniciais:\n", + "\n", + "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", + "\n", + "### Como o algoritmo funciona:\n", + "\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", + "\n", + "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Antes de seguirmos para nosso exemplo:**\n", + "\n", + "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", + "\n", + "\n", + "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", + "\n", + "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Exemplo:\n", + "\n", + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 1$ e $f(1) = 1$ que claramente esse é uma função constante.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", + "\n", + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "\n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Esses estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", "\n", "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", diff --git a/grover.ipynb b/grover.ipynb index 95da4b7..731b12a 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 111, "metadata": {}, "outputs": [], "source": [ @@ -72,17 +72,17 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 112, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] }, - "execution_count": 39, + "execution_count": 112, "metadata": {}, "output_type": "execute_result" } @@ -127,7 +127,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 113, "metadata": {}, "outputs": [], "source": [ @@ -149,16 +149,16 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 121, + "execution_count": 114, "metadata": {}, "output_type": "execute_result" } @@ -206,16 +206,16 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 122, + "execution_count": 115, "metadata": {}, "output_type": "execute_result" } @@ -240,16 +240,16 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 123, + "execution_count": 116, "metadata": {}, "output_type": "execute_result" } @@ -271,24 +271,32 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 124, + "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", - "grover.z(qr[0])\n", - "grover.z(qr[1])\n" + "grover.x(qr[0])\n", + "grover.x(qr[1])\n", + "grover.h(qr[1])\n", + "\n", + "grover.cx(qr[0], qr[1])\n", + "\n", + "grover.h(qr[1])\n", + "grover.x(qr[0])\n", + "grover.x(qr[1])\n", + "\n" ] }, { @@ -303,122 +311,71 @@ }, { "cell_type": "code", - "execution_count": 125, + "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 125, + "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "grover.h(qr[0])\n", - "grover.h(qr[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Passo 3\n", - "\n", - "Agora repitiremos os subpassos de 1 a 4, porque são necessárias $\\sqrt{N}$ interações,
\n", - "onde N é tamanho do nosso vetor que no nosso caso é 4, o que nós dá 2 iterações.
\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 126, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#--- Função ---\n", - "grover.x(qr[1])\n", - "grover.ccx(qr[0], qr[1], qr[2])\n", - "\n", - "#---Hadamard\n", - "\n", "grover.h(qr[0])\n", "grover.h(qr[1])\n", - "\n", - "\n", - "#----Troca de fase\n", - "\n", - "grover.z(qr[0])\n", - "grover.z(qr[1])\n", - "\n", - "\n", - "#--- Hadarmard\n", - "\n", - "grover.h(qr[0])\n", - "grover.h(qr[1])\n", - "\n" + "grover.h(qr[2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Passo 4\n", + "## Passo 3\n", "\n", - "Agora que já fizemos as iterações necessárias vamos fazer a medição e o valor
\n", + "Como foram necessárias apenas 1 interação podemos vamos fazer a medição e o valor
\n", "obtido deve ser o indíce que nós buscamos que nesse caso é 10 (2)." ] }, { "cell_type": "code", - "execution_count": 127, + "execution_count": 119, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA20AAAEsCAYAAABQaVsqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3X1cVHX+//8njIoYIITkFRph2SaKKLp+sgwvsimv01XTktQUW7ONW2mg9mnNytB1XbU2V7wssCzTRMyfupm4u+mHJRVMq08fwytcN68hLCSH8/3Dn7NOgHIxzJyBx/12OzfhPWfOeXnmPWd4zjnnfbwMwzAEAAAAADAlb3cXAAAAAAAoH6ENAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEysnrsLgHvFx8crOzvb5euNiorSwoULXb5eVI67+odUvT7iif3aU7c1PB99z5Gnbg9P3O/VJLYHahuOtNVx2dnZLt+puWOdqBp3vVbVXa8n9mtP3dbwfPQ9R566PTxxv1eT2B6obTjSBkVFRSkjI8Nl6+vZs6fL1oXqc3X/kJzTRzyxX3vqtobno+858tTt4Yn7vZrE9kBtwpE2AAAAADAxQhsAAAAAmBihDQAAAABMjNAGAAAAACZGaAMAAAAAEyO0AQAAAJVUUlKiK1euuLsM1BEM+Q8AAIA6q7CwUBs2bNCePXuUk5Oj/Px81a9fX23btlV0dLQeffRRtW3b1uE5JSUlmjBhggoLC/X+++/LYrG4qXrUFXXmSNvq1asrff+M6Ohobd++vWYKAiqguLhY27dv1/vvv6+dO3fKZrO5uySgTjIMQ//85z/1/vvva9OmTSosLHR3SQCqqbCwUNOmTVPLli315JNP6v3335ePj4/uuecetWrVSl988YUSExN1991366GHHrLfOPtaYFu1apXatWtHYINL1GhoS0hIUEREhAICAtSiRQtNnDhR58+ftz++du1a9ejRQwEBAapXz/UH/Ww2m6ZNm6aQkBD5+/tr2LBhOnv2rP3xwYMHKy0tzeV1mV2LFi20YsUKhzbDMBQQEKCPP/7YTVXVLoZhaPHixQoNDZXVatXo0aPVu3dvhYWF6d1333V3eTfkif1j1apV8vPzKzVZLBZZLBbT/oHuidvaE+3YsUORkZHq1q2bRo8ercGDB6tZs2ZKSEjQzz//7O7y3IK+9x+euv+Q6vbruHv3bkVGRuqPf/yj+vfvr3/84x86f/68du7cqY8++kjp6enKzc3Vv/71L7366qvKyclR165dNWvWLD311FNatWqVfv/732vWrFnu/q+gjqjR0GaxWJSamqpz584pJydHeXl5GjdunP3xoKAgTZ48WQsXLqzJMsqVlJSktLQ0ZWZmKi8vT5I0ZswY++ODBw/Wpk2b3FKbWZ08eVKnTp1Sx44dHdpzc3P1ww8/qEuXLm6qrHZ5+eWX9dxzz+nMmTMO7SdPntSTTz6pt956y02V3Zin9o9x48apsLDQYVq5cqXq16+v5cuXy8/Pz90lluKp29rTbNu2TVarVV999ZVD+6VLlzRv3jyNGjVKJSUlbqrOPeh7jjxx/yHV7dfx008/VZ8+feTt7a2//e1veu+993TffffJ27v0n8XNmzfXSy+9pK+//lrDhw/XK6+8otWrV+vll18msMGlqh3aPvzwQ3Xo0EF+fn566KGH9Pzzz2v48OGSpDlz5qhTp06qX7++QkJCNGXKFGVkZNifa7VaNWrUKIWHh1e3jCpJTk5WQkKCwsPD1bhxY82bN09bt27V0aNHJUkdO3ZUvXr1tHfvXrfUZ0ZZWVmyWCyKiIhwaM/JyVHTpk3VqlUrN1VWe/zf//2fXnvttTIfMwxDkvTCCy/o3LlzriyrQmpL/0hJSVFsbKxWrFjh8EWTmdSWbW1mNptNEydOlGEY5Qaz9evXa8uWLS6uzL3oezfmCfsPqe6+jocPH9aQIUN01113ac+ePbr//vsr9LzAwED5+PjYf7/+Z8AVqhXa3nnnHb3wwgt6++23lZ+frwEDBmjx4sXq1KlTmfNfO8WkJiQlJVVq2fn5+Tp+/Liio6PtbW3atFFAQIAOHDhgbxs0aBCnSF4nKytLbdu2la+vr0N7Tk5Orf5WzpWSk5Pl5eV1w3mKi4v1zjvvuKiiiqsN/WPZsmWaOHGi1qxZo8cff9zd5ZSrNmxrs9u+fbtOnDhxwyNp3t7eWrJkiQurcj/6Xvk8Zf8h1c3XsaSkROPGjVO9evW0ZcsWhYSEVPh5EyZMsB9hGz58uGbNmqWDBw/WcMXAf1T5QrIff/xRzz//vFJTU9WjRw9J0oQJE/Tcc8+VGdrWr1+vZcuWadeuXRVeR2pqqv785z9Lkl577TX16dOn3HkTExOVmJhY4WUXFBRIkho3buzQHhgYaH9Mkvr376/p06dr9uzZFV52bZaVlaXDhw+rSZMmDu2FhYWaPn26m6qqXb766it5eXnZj6qVxWKx6NChQy6sqmI8vX+8+eabevHFF7Vu3ToNHDjQ3eXckKdva0/wy1Miy1JSUqIvv/zSBdWYB32vbJ60/5Dq5uuYnp6uf/zjH1qxYoVCQ0Mr9JzrBx25dg3bmTNntGPHDs2cOZMv9uE6RhVt2bLFCAwMdGg7evSoIck4deqUQ/uHH35oBAUFGZ999lmZy9q5c6dhsVgc2i5cuGB06tTJKCoqMs6ePWt06NDBuHLlSlXLNVatWmXExMQ4LF+SsX//fof5AgICjLS0NPvvycnJxpAhQ6q83oqS5Lbp+u1yM0FBQcbrr79unDhxwmEKDAw0Nm/eXKFlxMTEuPX/y2Tu/uGsPlKZug3DMObNm2f4+voa27Ztq9Tz3FWzmbY1k+dP9L2qbw/DqP7+w1nbg8/zG2+Phx56yAgNDTV+/vnnCv3/bDabMW7cOEOS8fvf/97hsenTpxve3t7GsWPHPGZ7MHnGVJ4qnx55+vRp3XbbbQ5t7733npo1a6ZmzZrZ21atWqVJkyYpPT1dvXr1qvDyMzMz1aNHD/n4+Cg4OFhhYWH67rvvqlpuKYGBgWrdurX27dtnb8vNzVVBQYHDaZabNm3S4MGDnbbe8hiG4ZYpJiamwjUePnxYFy5ckNVqVWhoqH0qKirSxYsXK3U6RUxMjNv+z2afli5dWqFtmJaWVmv7R3X7SGXqlqRXX31Vr7zyij755BM99NBDlXquO2o207auzdP//u//3nTbeXl5KT4+3u21Vmei71V9e0jO239Ud3vweX7j7VFYWKi//vWvio2NrdCI5WUdYbveU089pZKSEm3evNkjtgeT50zlqXJoi4iI0OHDh7Vr1y4VFxfrvffeU1JSkqKiouzzLF68WFOnTtW2bdt03333lVqGzWZTUVGRiouLJUlFRUUqKiqSYRg6d+6cgoKC7PMGBQU5feCFuLg4zZ07V0eOHFFBQYESEhJktVoVFhYm6eopoDt37tSAAQOcul5PlZWVpUaNGpUaaWr37t1q1aqVmjZt6qbKapfRo0crKCiozFGspKvX0ISFhal///4uruzGPLV/zJgxQ/Pnz9e2bdsq9cWSO3nqtvY0bdu21cMPP1zuNaZeXl7y9vbWb3/7WxdX5j70PUeeuP+Q6ubruH//fhmGoXvvvfem894ssElSeHi4QkJCGKwOLlPl0NalSxfNnDlTQ4cOVWhoqDIzM9WtWzeH69mee+45FRQUqFevXg73LrkmJSVFvr6+slqtstls8vX1la+vr44dO6bg4GBduHDBPu+FCxcUHBxcbj1z5swpNQLSzSQmJmrgwIHq2rWrWrZsKZvNptTUVPvj27ZtU6dOnUqd711XZWVlqWvXrqW+odqzZ0+tvWjZHfz8/LR582bdcsstZf6xGBwcrM2bN5vuZp6e2D+ys7P1xhtv6Mcff5TVai11nyWzXtfhidvaU73zzju65557JMnh/ejt7S1vb2+lpKSobdu27irP5eh7/+Gp+w+pbr6O187WuvZ+Lk9FApt0dX9wzz336PDhw84uFShTte5oPXv2bIcBOsLCwjRx4kT77zc6xCdJY8eO1dixY8t8LDAwUNOnT9fly5d16dIlHTlyRG3atCl3WTNmzNCMGTMqVb/FYtH8+fM1f/78Mh931amRnmLBggVltte1kdNcoXv37srJydGbb76pd999V+fOnVOzZs00fvx4TZkyRc2bN3d3iaV4Yv+Iioq66X7KjDxxW3uq2267TXv27NGyZcu0ZMkSHT16VDabTWPGjNHvfvc7de7c2d0luhR97z88df8h1c3X8eGHH9aOHTvUsmXLG8539OhRbdy4sUI3zl64cOFNR3sGnKVaoe16BQUFOnbsWLnD/VdWYGCg4uPj1bNnT0lXdzCuPrJw++232+85B7jaHXfcoQULFmjBggXy8vLSqVOn3F0SUCcFBATohRde0AsvvCDDMOTt7a3Vq1e7uywAlfDLMRfKEx4erkOHDlXoy1Fn/c0LVITTQtvBgwfl7+9/w6NhlRUbG6vY2FinLCsqKqrco3rl4U73AIDr8a06UPuZ8WwWwGmhrXv37g73NzObqKgoh0FSAAAAAMATVHkgEgAAAABAzSO0AQAAAICJEdoAAAAAwMQIbQAAAABgYoQ2AAAAADAxQhsAAAAAmJjThvyH58rOzrbfxNxV6+P2C57D1f3j2jqr20c8sV976raG56PvOfLU7eGJ+72axPZAbUJoq+PcsXPhnnmew12vU3X7iCf2a0/d1vB89D1Hnro9PHG/V5OqWlfu8VMKb9281M8VXadZtwc8n5dhGIa7iwBwY15eXuKtCpgD70eg9kqcm6ykhLhSPwPuxjVtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEysnrsLgHvFx8crOzvb5euNiorSwoULq/Rcd9UsVa9uT+Sp25p+XTlVrdsTa0ZpvI6OPHV7eOJ+D7UDfc81ONJWx2VnZ7v8jVbddbqjZneu1508dVvTr12zXk+sGaXxOjry1O3hifs91A70PdfgSBsUFRWljIwMl62vZ8+e1V6Gq2uWnFO3J/LUbU2/rpjq1u2JNaM0XkdHnro9PHG/h9qBvlfzONIGAAAAACZGaAMAAAAAEyO0AQAAAICJEdoAAAAAwMQIbQAAAABgYoQ2AAAAADAxhvwHAAAA4BI2m03ffvutvvzySxUWFqphw4b61a9+pfbt26tBgwZlPmfLli1q2rSpoqOjXVyteRDaAAAAANSob775Rm+//bZSUlJ08eLFUo/7+Pho6NCheuaZZ3TffffZ2zdv3qxhw4YpJiZG27dvd2XJplJnTo9cvXp1pW/EFx0dXac7B9zr7NmzSkpKUkREhKSrN65ctGiR8vPz3VwZULdcvnxZKSkpuv/++9W0aVNJ0osvvqgjR464uTIAML+ioiJNnz5dERERWrp0qfr166dVq1Zp//79OnLkiA4dOqS1a9fqqaee0pYtW3T//fdr9OjROnfunD2wRUZG6oMPPnD3f8WtajS0JSQkKCIiQgEBAWrRooUmTpyo8+fP2x9fu3atevTooYCAANWr5/qDfjabTdOmTVNISIj8/f01bNgwnT171v744MGDlZaW5vK6zK5FixZasWKFQ5thGAoICNDHH3/spqrKV1hYqJCQEK1fv97e9tNPP6l79+76zW9+o5KSEjdWV7aDBw+qXbt2mj59ur7++mtJ0oEDBxQfH6+oqCgdPXrUvQXegKf1D0latWqV/Pz8Sk0Wi0UWi0WFhYXuLrFMnratPfG9WFBQoF69eik2NlZ79uzR6dOnJUnz589Xu3bttHXrVjdX6B6e1vdqkqfuPyReR9S8c+fO6YEHHlBSUpLGjRunvLw8rVmzRmPHjlVUVJTCwsLUrl07jRw5Un/+85918uRJvfLKK/roo4/Utm1bDR06VJGRkdq+fbuCgoLc/d9xqxoNbRaLRampqTp37pxycnKUl5encePG2R8PCgrS5MmTtXDhwposo1xJSUlKS0tTZmam8vLyJEljxoyxPz548GBt2rTJLbWZ1cmTJ3Xq1Cl17NjRoT03N1c//PCDunTp4qbKyufn56epU6dq9uzZMgxDNptNI0aMkI+Pj9asWSNvb3MdcC4qKpLVatW5c+ckXf0Avf7f48ePa8CAAab8A9cT+4ckjRs3ToWFhQ7TypUrVb9+fS1fvlx+fn7uLrEUT9zWnvZelKSJEyfqf/7nfyTJ4T1nGIaKi4v16KOP6tixY+4qzy08se/VJE/cf0i8jqh5ly5dktVq1YEDB7RhwwYtX75cISEhN3zOLbfcopdfflnz5s3T+fPnZRiGVqxYUecDm+SE0Pbhhx+qQ4cO8vPz00MPPaTnn39ew4cPlyTNmTNHnTp1Uv369RUSEqIpU6YoIyPD/lyr1apRo0YpPDy8umVUSXJyshISEhQeHq7GjRtr3rx52rp1q/0oRseOHVWvXj3t3bvXLfWZUVZWliwWi/2UvWtycnLUtGlTtWrVyk2V3diUKVN06tQpbdiwQXFxccrLy1NaWpp8fHzcXVop69at07/+9a9yQ1lJSYkOHTqkzz77zMWV3Zyn9o9fSklJUWxsrFasWOHwRZOZeOq29qT34rFjx/TRRx/ZvzD5pZKSEhUVFWnp0qUursy9PLXvuYon7D8kXkfUvJkzZ2rv3r1at26dHn300Qo/b/Pmzfaz9Ro2bKjnnnvOlF9Uu1q1Qts777yjF154QW+//bby8/M1YMAALV68WJ06dSpz/h07digyMrI6qyxXUlJSpZadn5+v48ePO4xC06ZNGwUEBOjAgQP2tkGDBnGK5HWysrLUtm1b+fr6OrTn5OSY+lu5W265RdOmTdOTTz6pjIwMbd26VQEBAe4uq0xpaWmyWCw3nMfb21sbN250UUUV56n943rLli3TxIkTtWbNGj3++OPuLqdcnrqtPem9+Mknn1ToD4XrT/esCzy177mCp+w/JF5H1KwvvvhCixcv1pQpUzRw4MAKP+/6a9j+/ve/609/+pMyMjL0zjvv1GC1HsKookuXLhm33nqrsWXLFoc2SQ5t13z00UeGn5+fsXfv3lKP7dy507BYLKXa+/TpYwQHBxuvvvpqVcu0W7VqlRETE2P//fjx44YkIzc312G+1q1bGykpKfbft23bZnTu3Lna678ZSW6brt8uN9O3b1+jfv36RnBwsMPk4+NjzJo1q0LLiImJcWnN18ybN8+QZCQnJ1f6uc6q2xMnV/cPZ23rqvSRxYsXGw0bNjQ2bdpU6ee6umazbGvei7Vj8sS+Z5btcU119h/O2h6e+HnOVDumX/a9J554wvD39zcKCgoq3CfT09ONBg0aGF26dDHOnz9vGIZhlJSUGFFRUUaHDh2MkpKSOtH3ylPlI227du1SSUmJHnnkEXvbmTNnJKnUkbZ169Zp4sSJ2rRpkzp37lzhdaxevVrz58+vaok35O/vL0mlRuK7ePGiw7e+x44dU+vWrWukhusZhuGWKSYmplJ1fvHFF5o1a5ays7MdJl9f30p9MxcTE+OymiUpNTVVb7zxhsaPH69FixaVe7pTTdZd0enZZ5+t0LU9r7/+eq3tH9Xd1lXpI3/4wx+UkJCgtLS0Sn0r6K6azbCta/t7sSIDMVgsFvXp06fGa+F9bt7tITln/1Hd7eGJn+dmnBKSlpb5M1PF+94PP/ygDz/8ULGxsfa/t2/m+iNs1w864uXlpWeeeUZffvllqcuValvfuzaVp8qh7fTp07rtttsc2t577z01a9ZMzZo1s7etWrVKkyZNUnp6unr16lWpdYSGhla1vJsKDAxU69attW/fPntbbm6uCgoKHE6z3LRpkwYPHlxjdXiSw4cP68KFC7JarQoNDbVPRUVFunjxomlPp9iyZYsmT56sjRs3avHixTp9+rTWrVvn7rLKNXHixJuekmWxWDR27FjXFFRBnto/JOnVV1/VK6+8ok8++UQPPfSQu8u5KU/d1p72Xuzfv79CQkLk5eVV7jw2m02TJk1yYVXu5al9ryZ52v5D4nVEzdq3b5+Ki4vVr1+/Cs1fXmC75toBoj179ji9Vk9S5dAWERGhw4cPa9euXSouLtZ7772npKQkRUVF2edZvHixpk6dqm3btjncJO8am82moqIiFRcXS7o6al5RUdENU6YzxcXFae7cuTpy5IgKCgqUkJAgq9WqsLAwSdKPP/6onTt3asCAAS6px+yysrLUqFGjUiNN7d69W61atbLfv8hMdu/erccee0zvvvuuHnjgAfv1NLNnzzbtRa0dOnTQb3/72xvO89///d9q0aKFiyqqGE/sH5I0Y8YMzZ8/X9u2bav0F0vu4onb2hPfi/Xr19ebb74pwzDKDW69e/fWkCFDXFyZ+3hi36tJnrj/kHgdUbNycnIkqUJn190ssElXb01x2223KTs72+m1epIqh7YuXbpo5syZGjp0qEJDQ5WZmalu3bo5nBr53HPP2e9xc/29S65JSUmRr6+vrFarbDabfH195evrW6Xhk+fMmVNqBKSbSUxM1MCBA9W1a1e1bNlSNptNqamp9se3bdumTp06qUmTJpWupzbKyspS165dS91Tb8+ePab8Vu7gwYMaMGCAFixY4PBH1TPPPKMzZ86Y+hv+N998UzNmzCh1gXhAQID+8Ic/6OWXX3ZTZeXztP4hSdnZ2XrjjTf0448/ymq1lrrP0vTp091dYpk8bVt78ntx5MiR+uCDD0r9EWuxWPTkk08qPT1d9evXd1N1rudpfa8meer+Q+J1RM1q1qyZ+vXrd9Ph/bOysm4a2KSrp0g++uijuvvuu2uiXI9RrTtaz549W7Nnz7b/HhYWpokTJ9p/v9kRs7FjxzrtFK8ZM2ZoxowZlXqOxWLR/Pnzy71ujlMjHS1YsKDM9iVLlri4kopp3769w83cr2nUqJG+//57N1RUcRaLRa+//rpefPFFbdq0SbGxsVq7dq0GDhyoRo0aubu8Mnla/5CkqKgolx3ZdyZP29ae/F6UpBEjRmjo0KHaunWrvvvuO8XHx+vEiRNq3ry5u0tzOU/rezXJU/cfEq8jataIESM0YsSIm87XqVMnJSYmKj4+/qb3YfvLX/7irPI8VrVC2/UKCgp07Nixcof7r4rx48crMzNTly9fVmZmptLT05227Iq4/fbb7fecA9yhcePGGjNmjGJjYzVy5Eh3lwPUWfXq1bOfKh8fH18nAxsAOFO9evX0yiuvuLsMj+G00Hbw4EH5+/urTZs2zlqkVq5c6bRlRUVFVfqo3qxZs5y2fgAAAACoCqeFtu7du6ugoMBZi3O6qKgoh0FSAAAAAMATVHkgEgAAAABAzSO0AQAAAICJEdoAAAAAwMQIbQAAAABgYoQ2AAAAADAxp40eCc+VnZ2tnj17unR91R3J09U1X1tnXRyB1FO3Nf264uusTt2eWDNK43V05KnbwxP3e6gd6Hs1j9BWx7mjw1f39gvuepPWxdtGeOq2pl9Xbr1VXbcn1ozSeB0deer28MT9HmqHqvaB3OOnFN66eamfK7rOutb3vAzDMNxdBIAb8/LyEm9VwBx4PwK1V+LcZCUlxJX6Gc7Htq4crmkDAAAAABMjtAEAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwMUIbAAAAAJgYoQ0AAAAATIzQBgAAAAAmRmgDAAAAABMjtAEAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwsXruLgDuFR8fr+zsbJevNyoqSgsXLqzSc91Vs1S9ugHAjNinAoD5caStjsvOznb5h3V11+mOmt25XgCoSexTAcD8ONIGRUVFKSMjw2Xr69mzZ7WX4eqaJefUDQBmxD4VAMyNI20AAAAAYGIcaQNMymaz6ZtvvtFXX30lSdqwYYPat2+vO++8U97efN8CuIphGDpx4oRycnKUn58vSdq7d6/at28vHx8fN1cHAKgLCG2Ayezfv19vvfWWPvjgA126dMnePmzYMElSYGCgnnjiCU2ePFn33HOPu8oEar2TJ08qOTlZK1as0MmTJx0e69Kli+rXr68BAwZo8uTJ6tOnj7y8vNxUKQCgtuPresAkCgoKNGnSJHXu3Flr167VyJEj9c4772j//v2SpC+++ELLly9Xv379lJycrPbt2yshIUFFRUVurhyoXUpKSrR48WLdddddevXVV9WxY0e99dZb2r17t7799ltJ0gcffKDJkyfrb3/7m/r27auBAweWCnYAADgLR9oAEzh69Kj69u2r3NxcTZs2TTNnzlTjxo0d5omOjlZ0dLSeeuopLVy4UDNnztS8efP017/+VVu3btVtt93mpuqB2qOoqEgjRoxQenq6+vXrp8WLF6tNmzal5hsxYoRGjBihpKQk/eUvf9GMGTMUGRmpTz75RP/1X//lhsoBALUZR9oAN/v+++/Vq1cvnT17VhkZGZo3b16pwPZLISEhSk5O1qZNm/TNN9+ob9++KigocFHFQO1UUlKiESNGaPPmzVq0aJE2b95cZmC7XsOGDRUfH6+cnBwFBQXJarUqJyfHRRV7DsMwdPHiRXeXAQAei9AGuJFhGIqLi9O///1vbd++XT169KjU8wcOHKiNGzfq4MGDmjZtWg1VCdQNb775ptLT07Vo0SL97ne/q9Q1anfddZcyMjLk5+enxx9/XJcvX67BSt2noKBAS5cu1ejRo3X33XcrODhYTZo0UefOnTVx4kRt2LBBV65ccXiOYRiaOXOmoqOjdebMGTdVDgCerc6EttWrV1f6njDR0dHavn17zRQE6OqIkJs2bdJrr72mrl27VmkZDz30kJ65ZXQ/AAAd6UlEQVR//nklJyfr73//u5MrBOqGvLw8TZ8+Xf3799eUKVOqtIzQ0FAtW7ZMhw4d0rx585xcoXv99NNPSkxMVMuWLfX000/r73//u9q1a6dRo0ZpxIgRCg4O1vr16zVs2DCFhYVp2bJlMgzDHtjeeOMNPfjggwoODnb3fwUAPFKNhraEhARFREQoICBALVq00MSJE3X+/Hn742vXrlWPHj0UEBCgevVcf3mdzWbTtGnTFBISIn9/fw0bNkxnz561Pz548GClpaW5vC4zKywsVEhIiNavX29v++mnn9S9e3f95je/UUlJiRurK1+LFi20YsUKhzbDMBQQEKCPP/7YTVVJCxYs0J133qn4+PhqLWf27NkKDg7WwoULnVQZULcsXbpURUVFWrx4cbVGgezXr58GDBigt956S8XFxU6s0H1ycnIUFRWluXPnavDgwfrnP/+pEydO6OOPP9Zbb72lt99+W3/961915swZpaWl6Y477lBcXJz9C6U33nhDcXFxWrJkCbcrAYAqqtG9p8ViUWpqqs6dO6ecnBzl5eVp3Lhx9seDgoI0efJkt/2hmZSUpLS0NGVmZiovL0+SNGbMGPvjgwcP1qZNm9xSm1n5+flp6tSpmj17tgzDkM1m04gRI+Tj46M1a9aY8gP55MmTOnXqlDp27OjQnpubqx9++EFdunRxS13ffPONdu/erd/+9reyWCzVWpavr6+eeuoppaWlcfoRUEmGYWjFihXq16+fwsPDq728Z555RqdPn9Ynn3zihOrca9++fYqJidGlS5f06aefKjU1tdyzAiwWiwYNGqRdu3bpz3/+s3bu3KmFCxcqNjaWwAYA1VTtPeiHH36oDh06yM/Pz/6t2vDhwyVJc+bMUadOnVS/fn2FhIRoypQpysjIsD/XarVq1KhRTvmQrIrk5GQlJCQoPDxcjRs31rx587R161YdPXpUktSxY0fVq1dPe/fudUt9ZjVlyhSdOnVKGzZsUFxcnPLy8pSWlmbam8xmZWXJYrEoIiLCoT0nJ0dNmzZVq1at3FLXnj17JEn9+/d3yvL69esnm82mL774winLA+qKY8eO6dSpU057L/bu3VsNGjSwv8c91fnz5zVgwAAFBgbq888/V58+fSr0PC8vL+Xl5clms8nb21t5eXncww4Aqqlaoe2dd97RCy+8oLffflv5+fkaMGCAFi9erE6dOpU5/44dOxQZGVmdVZYrKSmpUsvOz8/X8ePHFR0dbW9r06aNAgICdODAAXvboEGDOEXyF2655RZNmzZNTz75pDIyMrR161YFBAS4u6xyZWVlqW3btvL19XVoz8nJcdtRNknKzs6Wn5+f7rrrLqcs79r7Ljs72ynLA+qKa++Zzp07O2V5DRo0UGRkpMe/F+Pj43XmzBl9/PHHuv322yv0nOuvYYuLi9Nbb72lzz77TEuXLq3hagGgdqtyaPvxxx/tgx/06NFDFotFEyZMkM1mKzO0rV+/XsuWLdOiRYsqtPy9e/fqvvvu0wMPPKDevXsrNzf3hvMnJiY6hK2buTY8+i+HVg8MDHQYOr1///614hSXmnDp0iUlJiaqadOm7i7lhrKysnT48GE1adLEYZo7d26VB/9whosXL+rWW2912ilDAQEB8vHx0YULF5yyPKCuyM/Pl3T1VhrOEhIS4tHvxa+//lopKSmaNm1auV/E/tIvA9uSJUv09NNPq2fPnpo1a1atucYPANzCqKItW7YYgYGBDm1Hjx41JBmnTp1yaP/www+NoKAg47PPPitzWTt37jQsFotD27/+9S+joKDAMAzD+OSTT4wnnniiqqUahmEYq1atMmJiYuy/X7hwwZBk7N+/32G+gIAAIy0tzf57cnKyMWTIkGqtuyIkuW26frtUREpKihEUFGSMHz/eiIiIMEpKSir1/JiYGJfWHBQUZLz++uvGiRMnHKbAwEBj8+bNLq2biYmJyYzTL/epzz77rNGgQQPj+++/r9D+saSkxJg+fbohyYiLizNsNpv9sS1bthiSjLVr17JPZWJiYrrJVJ4qf8V/+vRp3XbbbQ5t7733npo1a6ZmzZrZ21atWqVJkyYpPT1dvXr1qvDymzdvLn9/f0lXTzVx9uiSgYGBat26tfbt22dvy83NVUFBgcNplps2bdLgwYOduu6yGP//0MiunmJiYipV55YtWzR58mRt3LhRixcv1unTp7Vu3bpK/39jYmJcUvPhw4d14cIFWa1WhYaG2qeioiJdvHix0qdHVqfuX05vvPGGpKvXjdxsXunmfeTrr7+WdPU9567+xMTkiVNmZqakq2eEVGT+irwfmzVrptjYWLf/3yoylbVP/eSTT/TII4+U+pwvi2GUPsJ2/RkEVqtVTZs2LfOsFWfuU5mYnDElJC0t82cmtrWrpvJUObRFRETo8OHD2rVrl4qLi/Xee+8pKSlJUVFR9nkWL16sqVOnatu2bbrvvvtKLcNms6moqMh+ykRRUZGKioocCr52Ct7UqVOrWmq54uLiNHfuXB05ckQFBQVKSEiQ1WpVWFiYpKungO7cuVMDBgxw+ro90e7du/XYY4/p3Xff1QMPPGC/tm327NmmHeo/KytLjRo1KjVy5O7du9WqVSu3ntp57XpKZw1WcG0511+nCeDmIiMjVa9ePe3evdspyzt69Kj+/e9/e+x78cKFC8rNzVW3bt1uOq9h3DiwSZK3t7e6du3KoF4AUA1VDm1dunTRzJkzNXToUIWGhiozM1PdunVzOPf9ueeeU0FBgXr16iU/Pz/7dE1KSop8fX1ltVpls9nk6+srX19fHTt2TJJUXFys4cOH66WXXio18t8vzZkz56bz/FJiYqIGDhyorl27qmXLlrLZbEpNTbU/vm3bNnXq1ElNmjSp1HJro4MHD2rAgAFasGCBhgwZYm9/5plndObMmSodbXOFrKwsde3atdSR2j179rh1EBJJ6tGjh2699dZS94+rquXLl+vOO++s9PsAqOsaNmyoRx55RCkpKU657mrFihXy8vLSoEGDnFCd6x0/flyS1LZt2xvOV5HAdk3btm3tIzMDACqvWiMgzJ49W+fOndPp06e1aNEiffvttw6hzTAM/fzzzyosLHSYrhk7dmyZhwXDwsJks9k0evRoDR061CEklGfGjBk6dOhQpeq3WCyaP3++zp49qx9++EEbNmxwCGiuOjXSE7Rv317nz5/XhAkTHNobNWqk77//XiNHjnRTZTe2YMECh9tMXLNkyRJt2LDB9QVdp2HDhvZ7q1VmEJ2yfPbZZ/Z7vnEvJKDyJk+erNOnT2vZsmXVWs6ZM2e0ZMkS9e/f337Whqf51a9+pW+++UZ9+/a94XyXL1/Wzp07K3Tj7BdffNHjR9MEAHdy2l93BQUFOnbsWIVHmbqZdevWaevWrUpNTVXPnj317LPPOmW5lXH77bfb7zkH1IQXX3xRwcHBGjt2bJW/4f/hhx/01FNP6c4779TTTz/t5AqBusFqtapv375KSEi46WjF5TEMQ88884wKCgrs16x6Ih8fH9199903vZVLw4YN9emnn1boxtlNmzZ12u1NAKAuctroHgcPHpS/v7/atGnjlOU99thjeuyxx5yyLEmKiorS2LFjK/WcWbNmOW39QFmaNGmipUuX6tFHH9Xo0aP1/vvvq379+hV+/qVLlzRkyBCdOHFCGRkZatSoUQ1WC9ReXl5eWr58uSIjI9WvXz999tlnatGiRYWff+1UwXXr1mnOnDlq3759DVZrHrfccou7SwCAOsFpR9q6d++ugoICeXl5OWuRTlWV0Aa4wpAhQ/SnP/1J69evV+/evXX48OEKPS8nJ0f33XefMjIytHr1at1///01XClQu7Vu3VqbN2/WyZMn1a1bN23fvr1Czztz5owee+wxvfHGG5o0aZISExNruFIAQF3DxS+ACcTHxys1NVVffvmlIiMj9eyzz+rgwYOlhn4tKSnRF198oaeeekpdunTRv//9b23atElPPPGEmyoHapf7779fu3btkp+fn6xWq4YMGaJPP/1UV65cKTXv8ePH9fLLL6tdu3b6+OOPNWfOHC1ZssS0X14CADyXc29+BqDKHn/8cfXs2VPTp09XcnKy3nrrLQUHB9vvGxgTE6OcnBzl5+erUaNGmjBhgl577TUFBwe7uXKgduncubP27dunpKQkvf3220pLS5Ovr68iIyMVEhIiSQoNDdXJkyfl5eWlRx55RElJSerQoYObKwcA1FaENsBEWrZsqXfffVd//OMftWHDBn3xxRf66quvJF09yjZ69Gh17dpVQ4cOVePGjd1cLVB7+fr66pVXXtH06dOVnp6uPXv2KDs7WydPnpQk9erVS9HR0Ro8eLDuuOMON1cLAKjtCG2ACYWEhGjSpEmaNGmSu0sB6rSGDRtq+PDhjCQMAHArrmkDAAAAABPjSBuUnZ2tnj17unR9UVFR1V6GK2u+ts7q1g0AZsQ+FQDMjdBWx7njAzMqKqpa63XXh3x16wYAM6rqfi33+CmFt25e6ufKrJd9KgBUDKGtjlu4cKG7S6g0T6wZAMyqqvvUxLnJSkqIK/UzAMD5uKYNAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEyM0AYAAAAAJlbP3QUAAAAArvbzlSs6f6GgVPv3Z86X+XMj34by92vkktqAXyK0AQAAoM7x9vbWe5t26PuzFxza/7TyozJ/nvzEYEIb3IbTIwEAAFDnWLy9NaD3vRWaN6rdnWrdsmkNVwSUj9AGAACAOumuO0J1z52tbzhP/XoWPRzzaxdVBJSN0AYAAIA6q1+v/5K3t1e5jz/QraMCA/xcWBFQmktD29q1a9WjRw8FBASoXr3Sl9NFRETIz8/PPvn6+srLy0v79u2r8dpsNpumTZumkJAQ+fv7a9iwYTp79myNrxcAAADuE3JroLp3bl/mYwF+tyjm1x1dXBFQmktDW1BQkCZPnqyFCxeW+fihQ4dUWFhon55//nm1a9dOnTt3rvHakpKSlJaWpszMTOXl5UmSxowZU+PrBQAAgHv1ua+zGvn6lGp/pOev1aBBfTdUBDiqkdD2+eefy2q1qmnTpgoMDNTw4cMlSVarVaNGjVJ4ePhNl3HlyhWtXLlSkyZNqokSS0lOTlZCQoLCw8PVuHFjzZs3T1u3btXRo0ddsn4AAAC4h29DHz3Uo6tDW6vmIerY7k43VQQ4cnpoW79+vQYNGqS4uDgdP35cJ06c0IQJEyq9nI0bNyo/P1+xsbFVqiMpKUmRkZEVmjc/P1/Hjx9XdHS0va1NmzYKCAjQgQMHqrR+AAAAeI6uHX+lpk2C7L8P7NNd3l7lX+sGuJJTQ9ulS5c0adIkLVq0SMOGDZOPj4/8/f1ltVorvaylS5dq5MiRCgwMtLelpqbq3nvv1b333qsdO3bc8PmJiYkVDlwFBVdvrNi4cWOH9sDAQPtjAAAAqL2uvwUAQ/zDbLwMwzCctbAtW7boySef1OnTp+V1g28mMjIy9OCDD+rKlStlPv7dd9/prrvu0p49e9StWzdJ0sWLF9W7d2/t2bNHhYWF6tWrl/bv3y+LxVLtui9evKigoCDt379fUVFR9vbGjRsrJSVFgwYNqvY6biZxbnKNrwMAAACAeSUlxJXZXnoIx2o4e/asgoKCbhjYKmLp0qXq2LGjPbBJUmZmpnr06CEfHx/5+PgoLCxM3333ndq2bVvdshUYGKjWrVtr37599tCWm5urgoKCCp9iWV3lvUAAAJhR4txk+2fX9T8Dns5mK5HFwl2xahr7kMpxao+Mjo7WkSNHlJ6erpKSEl28eFHbtm2zP26z2VRUVKTi4mJJUlFRkYqKinT9wb7i4mKtXr1aTz/9tMOyz507p6Cg/5xnHBQUpHPnzjmt9ri4OM2dO1dHjhxRQUGBEhISZLVaFRYW5rR1AAAAwNwIbDAjpx5pi4iI0PLlyzV16lSNGjVK/v7+Gj9+vP2atpSUFI0bN84+v6+vryTpyJEj9nC0YcMG/fTTT3r88ccdlh0cHKwLFy7Yf79w4YKCg4PLrWXOnDlas2aNDh06VKHaExMTdeHCBXXt2lWXL19W3759lZqaWqHnOgOnRwIAPM31n118jgGoLPYhpZV3xNGp17TVpOuvabt06ZJiYmKUnZ3tlGvaAABA5XBqE4DqYB9SOU490laTAgMDFR8fr549e0qSFixYQGADAAAAUOt5TGiTpNjY2Crftw0AAAAAPBFXWgIAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwMUIbAAAAAJgYoQ0AAAAATIzQBgAAAAAmRmgDAAAAABMjtAEAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwMUIbAAAAAJgYoQ0AAAAATIzQBgAAAAAmRmgDAAAAABMjtAEAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwMUIbAAAAAJgYoQ0AAAAATIzQBgAAAAAmRmgDAAAAABMjtAEAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwMUIbAAAAAJhYPXcXAAAAAKD2+uHSj/poyy4ZhmP7yg//vzJ/7nt/tFq1uM1V5XkEQhsAAACAGuN/SyPd0shX+w5+69D+7ZETpX5u2bSJWjYPcWl9noDTIwEAAADUqIcf6KoG9W9+vGhAn3vl7eXlgoo8C6ENAAAAQI0K8L9FPf8r6obzdLg7XHe0au6iijwLoQ0AAABAjevRNVKBAX5lPlbPYtEjvbq5uCLP4dLQtnbtWvXo0UMBAQGqV6/04dGIiAj5+fnZJ19fX3l5eWnfvn01XpvNZtO0adMUEhIif39/DRs2TGfPnq3x9QIAAAB1Qf369fRIz7KDWY9fd9Ctjf1dXJHncGloCwoK0uTJk7Vw4cIyHz906JAKCwvt0/PPP6927dqpc+fONV5bUlKS0tLSlJmZqby8PEnSmDFjany9AAAAQF0R+atw3d6yqUOb/y2+6tntxqdO1nU1Eto+//xzWa1WNW3aVIGBgRo+fLgkyWq1atSoUQoPD7/pMq5cuaKVK1dq0qRJNVFiKcnJyUpISFB4eLgaN26sefPmaevWrTp69KhL1g8AAADUdl5eXhrYp7tDm/WBX8vHp4GbKvIMTg9t69ev16BBgxQXF6fjx4/rxIkTmjBhQqWXs3HjRuXn5ys2NrZKdSQlJSkyMrJC8+bn5+v48eOKjo62t7Vp00YBAQE6cOBAldYPAAAAoLTQ5iHq3L6tpKtD/Hfu0NbNFZmfl2H88jZ3VXfp0iXdfvvtWrhwoZ544oly58vIyNCDDz6oK1eulDtP3759FRoaqlWrVtnbHnzwQWVnZys+Pl4vvfSSs8rWiRMn1Lp1a+Xm5uqOO+6wt99+++16/fXXb/h/cZbEuck1vg4AAAAA5pWUEFdmu1Nvrr1r1y55eXnp8ccfr9ZyvvvuO+3YsUN79uxxaF+9erU+/fRT+zVnzuLvf/Wix/z8fIf2ixcvKiAgwKnrKk95LxAAAGaUODfZ/tl1/c8AUFHH8v6t20ObubsMj+DU0yPPnj2roKAgeVXzhnhLly5Vx44d1a2b4+gyoaGh1VpueQIDA9W6dWuHUSpzc3NVUFBQ4VMsAQAAAFQcga3inHqkLTo6WkeOHFF6err69++vgoICZWZmymq1Sro6rP7PP/+s4uJiSVJRUZEkycfHxx70iouLtXr1ar366qvOLO2m4uLiNHfuXPXq1UvBwcFKSEiQ1WpVWFiYS9bP6ZEAAE9z/WcXn2MAUH0uOT0yIiJCy5cv19SpUzVq1Cj5+/tr/Pjx9tCWkpKicePG2ef39fWVJB05csQejjZs2KCffvqp2qdYzpkzR2vWrNGhQ4cqNH9iYqIuXLigrl276vLly+rbt69SU1OrVUNlcFoJAMCTcHokALiOUwcicYXVq1crLy/PqQORAACAyiG0AYDrOPVIW00bP368MjMzdfnyZWVmZio9Pd3dJQEAAABAjfKo0LZy5Up3lwAAAAAALuX0m2sDAAAAAJyH0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgIkR2gAAAADAxAhtAAAAAGBihDYAAAAAMDFCGwAAAACYGKENAAAAAEyM0AYAAAAAJkZoAwAAAAATI7QBAAAAgInVc3cBAADA3AzDUO7xUyoxShza/+9oXpk/N2rYUC2bNXFZfQBQ23kZhmG4uwgAAGBuH2/7uzKzv67QvCMH9FKniLtquCIAqDs4PRIAANxU3x5d1NCnwU3na9X8NnVsd6cLKgKAuoPQBgAAbsqvka/6dO980/kG9rlX3l5eLqgIAOoOQhsAAKiQe6Mj1CSocbmPR7W7U61bNnVhRQBQN7g0tK1du1Y9evRQQECA6tUrPQZKRESE/Pz87JOvr6+8vLy0b9++Gq/NZrNp2rRpCgkJkb+/v4YNG6azZ8/W+HoBAPAU9SwW9ev9X2U+Vr+eRQ/H/NrFFQFA3eDS0BYUFKTJkydr4cKFZT5+6NAhFRYW2qfnn39e7dq1U+fONz8do7qSkpKUlpamzMxM5eVdHQFrzJgxNb5eAAA8yT1tWuvO21uWan+gW0cFBvi5oSIAqP1qJLR9/vnnslqtatq0qQIDAzV8+HBJktVq1ahRoxQeHn7TZVy5ckUrV67UpEmTaqLEUpKTk5WQkKDw8HA1btxY8+bN09atW3X06FGXrB8AAE/g5eWlAX3uldd1160F+N2imF93dGNVAFC7OT20rV+/XoMGDVJcXJyOHz+uEydOaMKECZVezsaNG5Wfn6/Y2Ngq1ZGUlKTIyMgKzZufn6/jx48rOjra3tamTRsFBATowIEDVVo/AAC1VbOQW9Ut6h7774/0/LUaNKjvxooAoHZzami7dOmSJk2apEWLFmnYsGHy8fGRv7+/rFZrpZe1dOlSjRw5UoGBgZKkvXv36r777tMDDzyg3r17Kzc394bPT0xMrHDgKigokCQ1bux4cXVgYKD9MQAA8B8P3h+thj4NGOIfAFyg9Ggg1bBr1y55eXnp8ccfr9ZyvvvuO+3YsUN79uyxt7Vo0UJbt26Vv7+/tmzZot///vdKSUmpbsmSJH9/f0lXj7hd7+LFiwoICHDKOm4mcW6yS9YDAIAznTh1WjPmLXN3GQBQKyQlxJXZ7tTQdvbsWQUFBTmc514VS5cuVceOHdWtWzd7W/Pmze0/N2jQoMzRJ6sqMDBQrVu31r59+xQVFSVJys3NVUFBQYVPsayu8l4gAADMyjCMan/mAwBuzqmnR0ZHR+vIkSNKT09XSUmJLl68qG3bttkft9lsKioqUnFxsSSpqKhIRUVFMgzDPk9xcbFWr16tp59+usx1XLp0SYmJiZo6daozS1dcXJzmzp2rI0eOqKCgQAkJCbJarQoLC3PqegAAqC0IbADgGk490hYREaHly5dr6tSpGjVqlPz9/TV+/Hj7NW0pKSkaN26cfX5fX19J0pEjR+zhaMOGDfrpp5/KPMWyuLhYw4cP10svvaSIiIgb1jJnzhytWbNGhw4dqlDtiYmJunDhgrp27arLly+rb9++Sk1NrdBznYHTIwEAAIC6rbyz77yM6w9zmZjNZtPIkSP18MMPV2k0SgAAAADwRB4T2tauXasJEyaoS5cukqQOHTrozTffdHNVAAAAAFCzPCa0AQAAAEBd5PSbawMAAAAAnIfQBgAAAAAmRmgDAAAAABMjtAEAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwMUIbAAAAAJgYoQ0AAAAATIzQBgAAAAAmRmgDAAAAABMjtAEAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwMUIbAAAAAJgYoQ0AAAAATIzQBgAAAAAmRmgDAAAAABMjtAEAAACAiRHaAAAAAMDECG0AAAAAYGKENgAAAAAwMUIbAAAAAJjY/wNPtzDxWQPNeAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0AAAAEsCAYAAADqytNKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3XtYVXXe//8XoJIKGwjxlCKimQ0eUGQcNUMtowwPd2qpjR084F3a6Lc0mKzG20lDp7zVGrsiK000J8cKD6SOFv0qHYZMcLTDjKEiSRqm7CKRhPX7w9s97kCO+8h6Pq5rXbI/a+213nz87L157XXyMQzDEAAAAACYgK+7CwAAAAAAVyEAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADANAhAAAAAA0yAAAQAAADCNJu4uAO41Z84c5eTkuHy70dHRWr58ucu3i7px1/iQPHOM0B9wF28de3zG2PPW/0egsWEPkMnl5OS4/M3YHdtE/bjr/8pTxwj9AXfx1rHHZ4w9b/1/BBob9gBB0dHRyszMdNn2hgwZ4rJtoeFcPT4kzx4j9AfcxVvHHp8x9rz1/xFoTNgDBAAAAMA0CEAAAAAATIMABAAAAMA0CEAAAAAATIMABAAAAMA0CEAAAACNhGEYKisrc3cZgEfjMtgAAAAe5sKFC0pPT9fHH3+snJwcnTlzRk2aNFFkZKRiYmI0cuRI9e7d2+45hmFo/vz5+vvf/66MjAxdc801bqoe8Gym2QO0Zs2aOl8HPyYmRrt27XJOQUAtlJWVadeuXXrzzTf1wQcfqLy83N0lAaZkGIb+8Y9/6M0339SWLVv0448/urskNFIXLlzQH//4R3Xo0EH33HOPXnvtNVVUVOjGG29URESEPv/8cz311FOKjo7WoEGD9NFHH0n6T/h59tln1a1bNzVr1szNvwnguZwagJKSkhQVFSWLxaL27dtr+vTp+v77723z58+fr86dO8tisah169YaN26c8vPznVmSnfLycs2bN09hYWEKDAzU2LFjVVRUZJs/evRopaenu6web9G+fXu9+uqrdm2GYchiseidd95xU1WNi2EYWrlypTp06KD4+HhNmjRJw4YNU0REhN544w13l1ctxsd//PjjjwoLC9PmzZttbefPn9fAgQM1btw4VVRUuLE61NaePXvUq1cv9e/fX5MmTdLo0aPVtm1bJSUl6eeff3Z3eVXy5rFn5veQQ4cOqV+/fnr66ac1cOBA7dq1S8XFxfr444/117/+Venp6frqq69UVFSk559/XgUFBYqLi9Ps2bOVnJysZ599VjNmzNCqVavk62ua77iBOnPqq8PPz09paWk6c+aMcnNzVVBQoAcffNA2f/LkycrJyZHVatWxY8cUHh6uCRMmOLMkOykpKUpPT1dWVpYKCgpsNV02evRobdmyxWX1eINvvvlGhYWFlXa75+Xl6YcfflC/fv3cVFnj8vTTT2v27Nn67rvv7Nq/+eYb3X///XrxxRfdVFn1GB/2AgICNHfuXC1cuFCGYai8vFx33323/P39tX79ev5A8QI7d+5UfHy8Pv/8c7v2kpISLV26VBMnTvTIMOGtY8/M7yH79+/X4MGDVVRUpG3btik9PV3Dhw+Xn59fpWVDQ0P16KOP6vDhw3r44Ye1cuVKLV26VNOnTyf8ALXQ4FfIW2+9pZ49eyogIEC33XabHn30UY0fP16StHjxYvXp00dNmzZVWFiYZs2apczMTNtzu3fvrqCgIEmXvt3x9fXVV1991dCSai01NVVJSUmKjIxUUFCQli5dqh07dujYsWOSpN69e6tJkybav3+/y2rydNnZ2fLz81NUVJRde25urtq0aaOOHTu6qbLG49///reeeeaZKucZhiFJeuyxx3TmzBlXllUrjI/KZs2apcLCQr399ttKTExUQUGB0tPT5e/v7+7SUIPy8nJNnz5dhmFcNeRs3rxZGRkZLq6sdrxx7Jn1PeT06dO64447FBQUpL///e+68847a/W8li1bymKx2B43a9aM8APUQoNeJWvXrtVjjz2mVatWqbi4WAkJCVq5cqX69OlT5fKXDyO40oYNGxQUFKSAgACtWLFCCxYsqFctKSkpldZdneLiYuXn5ysmJsbW1qVLF1ksFh08eNDWNmrUKA6Du0J2dra6deum5s2b27Xn5uY26m/mXCk1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bdeel5enH374Qf369XNLXV9++aX27t2rhx56SH5+fg1aV/PmzTV16lSlp6fru+++c1CFdeepfe0Kp06dUlxcnLKysrR69Wq9//77GjFiRJX/tz4+PhowYIA2btyo9957T998843mzp2rPn36EH4AAHCyBv+1+tZbb6lnz54KCAiwHYozfvx4SdLixYvVp08fNW3aVGFhYZo1a5YyMzNtz+3evbvtZG/DMOTr66uvvvqqoSXVWmpqqpKSkhQZGamgoCAtXbpUO3bs0LFjxyRJvXv3VpMmTbR//36X1eQNZs2apcLCQr399ttKTExUQUGB0tPT5e/v7+7SqpSdnS0/Pz9FRUXZtefm5qpNmzbq2LGjW+rat2+fJOnOO+90yPpGjBih8vJyffrppw5ZX314al87W3l5ucaOHasTJ05o165dmjp1qnx8fGr13OLiYv3www9q1qyZvv32W4/diwoAQGPRoAC0du1aPfbYY1q1apWKi4uVkJCglStXqk+fPlUuv2fPHvXq1cuubcOGDQoKClJAQIBWrFihBQsW1KuWlJSUSuuuTnFxsfLz8xUTE2Nr69KliywWiw4ePGhrGzVqFIfB/ULLli01b9483X///crMzNSOHTtksVjcXdZVZWdnq1u3bmrevLlde25urlv3SOTk5CggIMBh53pcft3l5OQ4ZH314al97WwvvPCCPvnkE7300ku66aabav28y+f83HTTTXrvvfdUWFiouXPnOrFSAABQ7wD0008/2U68Hjx4sPz8/DRt2jSVl5dXGYA2b96sV155RStWrLBrnzRpkoqLi1VYWKgFCxaoZ8+ekqT9+/dr0KBBuvnmmzVs2DDl5eVVW09ycrJdcKnJ5UsG//Jyw8HBwXaXE77zzju1ffv2Wq/XTEpKSpScnKw2bdq4u5RqZWdn68iRI2rVqpXdtGTJknpfeMARzp07p2uvvdZhhw1aLBb5+/vr7NmzDllffXhqXzvT+fPntXDhQt1+++12h9DW5Mrws337dg0bNkyzZ8/W6tWra3y/AwAADWDUU0ZGhhEcHGzXduzYMUOSUVhYaNf+1ltvGSEhIcb7779f7TpPnTpltGzZ0jhz5oxx8uRJw2q1GoZhGNu3bzd++9vf1rdUwzAM4/XXXzfi4uJsj8+ePWtIMg4cOGC3nMViMdLT022PU1NTjTFjxjRo27UhyW3Tlf1SG+vWrTNCQkKMKVOmGFFRUUZFRUWdnh8XF+fSmkNCQoxFixYZJ06csJuCg4ONbdu2ubRub5zo6+r74/XXXzckGR988EGtf7+NGzcavr6+xs0332z88MMPtvYTJ04Yfn5+xuOPP+41/cHExMTExOSJU3Xq/dXz6dOnK915fsOGDWrbtq3atm1ra3v99dc1Y8YMbd26VUOHDq12nRcvXlRJSYlOnjypdu3aKTAwUJLUrFkzNWnSpL6lVik4OFjh4eH67LPPbG15eXmyWq12h9Jt2bJFo0ePdui2q2IYhlumuLi4OtWZkZGhhx9+WO+++65Wrlyp06dPa9OmTXX+fePi4lxS85EjR3T27FnFx8erQ4cOtqm0tFTnzp2r82FZDan7l9Ozzz4rSfr+++9rXFaqeYx88cUXki695twxPjy5r53ZH9u3b1d4eHit++qXe36uvOBBhw4ddOutt1a519kT+4OJick1U1LKy1X+zMR0eWKMVJ6qU+8AFBUVpSNHjujDDz9UWVmZNmzYoJSUFEVHR9uWWblypebOnaudO3dq0KBBds+vqKjQiy++qNOnT0uSCgoKNHPmTEVERKh79+625S4fZuWM4+ITExO1ZMkSHT16VFarVUlJSYqPj1dERISkS4f5ffDBB0pISHD4tr3R3r17NWHCBL3xxhu6+eabbecCLVy40GNP3M7OzlaLFi0qXZVs79696tixo1sP37t8/tnliyE01OX1XHlemyt5cl870/79+/XrX/+6Vhc9qC78XNa/f3998cUXKikpcUa5AACYXr0DUL9+/TR//nzddddd6tChg7KystS/f3+7839mz54tq9WqoUOHKiAgwDZdlpGRoR49eqhly5bq37+/WrRood27d9v29pSVlWn8+PF68sknK11V6pcWL15c4zK/lJycrJEjRyo2NlbXXXedysvLlZaWZpu/c+dO9enTR61atarTehujQ4cOKSEhQcuWLdOYMWNs7TNnztR3331Xr71ArpCdna3Y2NhKexD37dvn9pPyBw8erGuvvbbSPXPqa/Xq1eratWudXweO4sl97SyGYej48ePq1q1bjcvWJvxIUrdu3VRRUWG7ND8AAHCsBh1XtnDhQi1cuND2OCIiQtOnT7c9rm73k6+vrzIyMq46v7y8XJMmTdJdd91l9wf31TzxxBN64oknaln5JX5+fnru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\n", "text/plain": [ - "
" + "
" ] }, - "execution_count": 127, + "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grover.measure(qr, cr)\n", - "\n", "grover.draw()" ] }, { "cell_type": "code", - "execution_count": 128, + "execution_count": 121, "metadata": {}, "outputs": [ { "data": { - "image/png": "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p3DIIYc0lunatSv/9V//xfPPP7/be9u1a8ezzz7L/vvvz86dO/nyl7/MiSeeyJFHHsnDDz/cWO7GG2+kc+fOOdsnyR/VQEWkxZg5cyaf//zn6dOnD23btuXss8/mhRde2K1MWVkZhx12GK1b716/MDP2339/AHbu3MmuXbsws93KuDvPPvssX/3qV7O7I1IQlEBFpMWoq6vjoIMOanxdUVFBXV1dyu+vr69nxIgRDBo0iJEjR3LEEUfstn7GjBl87nOfo1+/+GmNZV+kBCoiLYa777EsvhbZlJKSEqZNm8bcuXOZNWsW8+fP3239xIkTOfvss5sdpxQHJVARSVs2GuI0mDBhAqWlpaxduzbjcVdUVPDBBx80vl61ahU9evRIeztdunTh2GOP5ZVXXmlctmvXLp577jm+8pWvZCRWKXxKoCKSloaGOL/97W+ZMWMGEydO5O9///tuZRoa4owZM2a35Q0NcV577TWmTZvGK6+8wltvvdW4fuXKlUydOpWePXtmJfbDDjuMJUuWsHz5cnbs2MGkSZM45ZRTUnrvxx9/zIYNGwDYunUrr776KgMHDmxcP3XqVAYMGLDbJWLZt6kVroikJbYhDtDYECe2JWtZWRllZWVMnjx5t/furSHODTfcwK233soFF1yQldhbt27NHXfcwTnnnEN9fT0XXHABlZWVPPLIIwBcfPHFrF69muOPP55NmzbRqlUr7r//fmbMmMHq1au58sorqa+v59NPP+Wss87i5JNPbtz2M888o8ZDLYwSqIikJVFDnJkzZ6b8/vr6eo477jiWLl3Kt771rcaGOC+88ALl5eVUVVVlPOZYo0aNYtSoUbstu/jiixufd+/enXnz5u3xviFDhvDqq68m3e69996buSClKCiBikhaMtUQZ8OGDVx44YXMnz+fPn36MH78eCZNmpTJUEWySvdARSQt2WiIs2zZMlasWMHw4cOprq5m1apVjBw5ktWrV2cydJGMUgIVkbRkoyHO4MGDee+996itraW2tpaKigqmTp1K9+7ds7krIs2iS7gikpZsNsQRKSaW6H5GS1FTU+NTpkzJdxgiIlJASktLZ7r7EXsrp0u4zRS1Q/nKlSs588wzOeqooxg2bBj3339/47q5c+dy0kknceyxx3LeeeexcePGnOyLiIikTgm0GZrTobx169b86Ec/4m9/+xuTJ0/moYceanzvd77zHcaNG8f06dM57bTTdku8ItJyZeOEfc6cOYwaNYoRI0Zw/PHHp9UlqaVTAm2G5szs0KNHD6qrqwHo1KkTAwcObBzUetGiRRxzzDEAjBw5kj/+8Y852BsRKWTZOmEfN24c11xzDdOmTeP666/nlltuydUuFT0l0GZo7swODVasWMG7777L4YcfDkBlZWVjIv7973/PqlWrMhOwiBStbJ2wmxmbNm0CYOPGjZG6JLVUSqDN0NwO5QCffPIJo0eP5rbbbmuchHfChAk8+OCDHHfccXzyySe0adMmI/GKSPHK1gn7bbfdxrhx46iqquLmm2/m5ptvzljM+zp1Y2mG5nYo37lzJ6NHj+acc87hjDPOaFw+cODAxhFZFi9ezEsvvZS5oEWkKGXrhP2RRx7hJz/5CWeeeSbPPPMMV199Nc8880xGYt7XqQbaDM3pUO7uXH311QwcOJBvf/vbu61bs2YNAJ9++injx4/noosuynToIlJksnXC/uSTTza+Puuss9SIKA2qgTZDczqUz58/n6eeeorBgwczYsQIAG666SZGjRrFxIkTeeihhwA4/fTTszYzhUhLdc1jXbO27TtGr8/KdmNP2MvLy5k0aRK/+tWvUnpvUyfsPXr0YPr06Xzxi19k2rRp9OvXLxvh75M0kIIGUhBpcYoxgQK89NJL/PCHP2w8Yf/e977X5Al7x44dG0/YTz31VAYPHkyrVsGFx4YT9jfeeIPrr7+eXbt20a5dO+68804OPfTQrO1DMUh1IAUlUCVQkRanWBOo5IZGIhIREckiJVAREZEI1IhIRNKWzUugoMugUhxUA5WilY1xQZ999lmGDRtGt27dmD17dk72Q0SKkxKoFKVsjQtaWVnJr3/968axiEVEklEClaKUrXFBBw0axIABA3KzEyJS1JRApShla1xQEZFUKYG2cFHvIwKMGTOGgQMH7nG5MxcTgmdrXFARkVQpgbZgzbmPCHD++efz9NNP77E8FxOCZ2tc0FzJxomLJkYWyS0l0BasOfcRAY455hi6dt2zO0MuJgTP1kD+uZCtExdNjCySW+oHmgHF2icu0X3ETNRaGiYEP/XUU7M2IXi2BvJ/7rnnuPbaa1m7di3nnnsuVVVVTJw4MaOxx564AI0nLoccckhjmbKyMsrKypg8efIe7z/mmGNYsWLFHss1MbJIbimBtmCZuI+YyIQJE7juuuv42c9+ximnnJK1CcFHjRrFqFGjdlt28cUXNz7v3r078+bN2+N9Rx99NOvWrUu4zdNPP53TTz89s4HGydaJy2233cY555zDzTffjLvz5z//udnbFJHklEBbsObeR0xGE4I3LVsnLpoYuWUo1ite+yLdA23BmnMfsSmaELxp2Tpx0cTIIrmlBNqCxd5HPProoznrrLMa7yM23EtcvXo1Q4YM4b777mP8+PEMGTKksVvKJZdcwsknn8zixYsZMmQIjz/+OAATJ07kyCOP5KijjqJHjx6aEDxOtk5cGiZGBjQxskgO6BJuCxf1PiLAgw8+mHD55ZdfzuWXX565IPcxzWkA1blzZy655BKmT5/O2rVrGTJkCNdddx0XXngh99xzz24TI//85z/P856K7O7ll19unBD8wgsv5Lvf/e5u69977z3GjBnDu+++yw033MBVV13VuG7MmDFMnjyZAw88kNdff32PbU+YMIFx48axaNEiunXrlvV9ASVQkbzIxonL0UcfzV/+8pfMBSmSQQ3dtyZNmkRFRQUnnHACp5xyym6tzxu6bz3//PN7vP/888/n0ksv5Yorrthj3cqVK5k6dSo9e/bM6j7E0yVcERHJumz1Owe44YYbuPXWWzPSGC8dSqAiIpJ1mRq/Ot4LL7xAeXk5VVVVzd5WunQJV0REsi4b3be2bNnC+PHjG7vN5ZpqoCIiknXZ6L61bNkyVqxYwfDhw6murmbVqlWMHDmS1atXNzfclOQ8gZrZlWa21My2mdlMMxveRNn9zOxRM3vXzHaa2dQEZc42s8lmtsbMNpnZ38zszKzuhIiIpCUb3bcGDx7Me++9R21tLbW1tVRUVDB16lS6d++eoaibltMEamZfB+4BbgNqgNeBF8ysV5K3lADbgF8Af0pS5kvAFOC0cJvPA880lZhFRCS3stXvPJ9yfQ90LPCouz8Qvr7KzE4BrgCujy/s7puBywHM7F+AAxKU+U7colvN7DTgLOC1DMYuBSibw5ppSDORzMpG961YtbW1zQswTTmrgZpZW+BwIH56icnAMXu+o1k6Afr1ExGRrMllDfRAgkuy8Xd3VwMnZupDzOzbQE8gYf3ezC4DLgMoLy9n1qxZQHCDu0OHDixevBiALl260LdvX2bPng1ASUkJ1dXVLFy4kM2bNwPBtF3BrB7ZHdx5x44dzJ07F4B27doxZMgQ5s2bx/bt2wGoqqqirq6OtWvXAtCnTx/cneXLlwOfTY01f/58ANq3b09lZSVz5sxh586dAFRXV7NixQrWrw/OO/r27cuOHTtYuXIlEJwZlpaWsmDBAgA6duzIoEGDqK2tpb6+HoCamhqWLFnChg0bAOjfvz9btmxpnM6svLyczp07s3DhQgA6derEgAEDmD17Nu6OmVFTU8OiRYsap+UaNGgQGzdubGzuHv89wQmZPtyNFixYwNatW4HgXsuaNWsax/nt3bs3ZsayZcsA6NatG+Xl5S3me4LjM324dzNr1ix69uxJ27ZtWbJkCRB0su/Vq1djLaNNmzYMHTo00veU7diz+T1l+/fG3VP63WtoqJPN7ylf/59SZYmaFmeDmVUAHwAj3P21mOXjgPPc/ZCkbw7K/QKocveRTZT5KkHiPNfd/7C3mGpqanzKlCkp7kFymh0hf3QJNz+K/W++mP9uiv3YF4PS0tKZ7n7E3srlsgb6MVAPxLdb/hx71krTFpM8v5FK8pSA/jOKiESTswTq7jvMbCYwCng6ZtUoYGJztm1mXwMeA0a7+++asy2RXNHJi0hxy3Ur3LuAx83sTWA6QQvbCuB+ADO7HfiCuzfe2DKzwUBbgnuo+5vZoQDu/k64/lyCmuf3gWlm1lDD3eHu63KyVyIi0uLkNIG6+1Nm1g24ESgH5gKnuvvysEg5ED+J4fNA75jXs8N/G8aAupxgP+4OHw1eBUZmLHgREZEYOR8L193vA+5Lsu6iBMv67GV7IzMRl4iISDo0Fq6IiEgESqAiIiIRKIGKiIhEoPlARUQkJ/a1rluqgYqIiESgBCoiIhKBEqiIiEgESqAiIiIRKIGKiIhEoAQqIiISgRKoiIhIBEqgIiIiESiBioiIRKAEKiIiEoESqIiISARKoCIiIhGklUDN7GtmdlLM65vNbKWZvWhm5ZkPT0REpDClWwO9peGJmR0G/BD4b6ANMD5zYYmIiBS2dKcz6w0sDJ9/BXjW3e8ws8nAixmNTEREpIClWwPdBnQKn58AvBw+3xCzXEREZJ+Xbg30NWC8mf0VOAI4J1w+EHg/k4GJiIgUsnRroGOAHQSJ83J3XxUu/zK6hCsiIi1IWjVQd18JnJFg+XczFpGIiEgRSLsfqJntZ2bnmNm1ZnZAuKyfmZVmPjwREZHClFYN1Mz6EzQc2h84AHga+CdwRfj6kkwHKCIiUojSrYHeDUwGugNbY5b/ATguU0GJiIgUunRb4R4DHO3u9WYWu3wFUJGxqERERApclLFw2yRY1ougL6iIiEiLkG4CnQyMjXntZtYZuBX4U8aiEhERKXDpXsIdC/zFzBYC+wFPAf2B1cDXMhybiIhIwUq3H+gqMzsUOA84jKAG+yvgf919a5NvFhER2YekWwMlTJQPhw8REZEWaa8J1MzOBv7o7jvD50m5+6SMRSYiIlLAUqmB/g7oAXwUPk/GgZJMBCUiIlLo9ppA3b1VouciIiItWVoJ0cxGmNkeSdfMSsxsRObCEhERKWzp1ij/AiQaNP6AcJ2IiEiLkG4CNYJ7nfG6AZubH46IiEhxSKkbi5n9IXzqwBNmtj1mdQlQBbye4dhEREQKVqr9QNeG/xqwnt1nYtkB/BV4IINxiYiIFLSUEqi7XwxgZsuAO91dl2tFRKRFS3cov1uzFYiIiEgxSWUkoneBL7n7ejObQ+JGRAC4+79kMjgREZFClUoNdCLQ0GioqZGIREREWoxURiK6NdFzERGRlkxD84mIiESQyj3QJu97xtI9UBERaSlSnY1FREREYqR1D1REREQCugcqIiISgfqBioiIRKB+oCIiIhGoH6iIiEgEaY2F28DM+gGV4csF7v6PzIUkIiJS+NJKoGbWDXgIOBP49LPF9hzwTXdfm/TNIiIi+5B0W+E+CPQHhgP7hY8RwOdJcT5QM7vSzJaa2TYzm2lmw/dSfqiZvWpmW83sAzO72cwsrsz5ZvaOmW0xsw/N7Akz65HmvomIiKQs3QR6MnCpu093913hYzrwH+G6JpnZ14F7gNuAGuB14AUz65WkfGfgJWA1cCRwNfADYGxMmWOBx4HHgCHAWcBg4H/T3DcREZGUpZtA1wCJJtPeAqRy+XYs8Ki7P+DuC9z9KqAOuCJJ+QuADsBod5/r7hOBnwJjY2qhw4CV7v5zd1/q7m8AE4CjUt8tERGR9KSbQP8TuNvMDmpYED4fH65LyszaAocDk+NWTQaOSfK2YcBr7r41ZtmLQAXQJ3w9HSg3szMscCBwLvB8SnskIiISQZTB5D8PLDOzD8LXBwHbgM8R3CNN5kCghOBybKzVwIlJ3tMDWJmgfMO6pe4+w8zOI7hk255gn14CRifZn8uAywDKy8uZNWsWABUVFXTo0IHFixcD0KVLF/r27cvs2bMBKCkpobq6moULF7J5c1AJr6ysZN26dUDXJna7+Xbs2MHcuXMBaNeuHUOGDGHevHls3x50z62qqqKuro61a4OLAH369MHdWb58OQBlZWWUlZUxf/58ANq3b09lZSVz5swhuIWdPR9++CGrVq0CguPduXNnFi5cCECnTp0YMGAAs2fPxt0xM2pqali0aBGbNm0CYNCgQWzcuJG6ujpgz+8JTsha7AsWLGDr1uDcbfDgwaxZs4Y1a9YA0Lt3b8yMZcuWAdCtWzfKy8vT+p6yGTvArFmz6NixI4MGDaK2tpb6+noAampqWLJkCRs2bACgf//+bNmyJa3vCY7Peuw9e/akbdu2LFmyBICuXbvSq1cvamtrAWjTpg1Dhw6N9D1lO/bq6mpWrFjB+vXrAejbty87duxg5crg56x79+6UlpayYMECgLS+p2z/3rh7Sr97q1cHP8XpfE/J60qZsXbt2pR+93bu3AmQ9HtKlbk3PdGKmY1LdWNN9RM1swrgA2CEu78Wt/3z3P2QBO+ZDLzv7t+KWdYbWAYMc/c3zGwwQcK8m6B2Wg78DHjH3b/RVLw1NTU+ZcqUVHcvqWsey+4f9B2j12dt28UcO2Q3/mKOHfR30xT93SSnvxsoLS2d6e5H7K1cLgeT/xioJ6g5xvoce9ZKG3yYpDwx77keeNPdfxa+ftfMNgOvmdkN7v5+88IWERHZU84Gk3f3HcBMYFTcqlEErXETmQEMN7P94sqvIqiFQtDIqD7ufQ2vDRERkSxIK4GaWVszu9XM3gv7cdbHPlLYxF3ARWZ2iZlVmtk9BA2C7g+3f7uZvRJT/jcELXwfNbMqMzsbuA64yz+79vxH4F/N7Aoz6xt2a/lvYJa7r0hn/0RERFKV7lB+PwK+DtwO/JygT2YfglavN+3tze7+VDia0Y0E9yrnAqe6+/KwSDnQL6b8BjMbBdwLvA2sJ2jxe1dMmUfNrBMwJly3AfgLcE2a+yYiIpKydBPo14DL3f3PZnYn8Ht3/4eZLSC4tPrLvW3A3e8D7kuy7qIEy/baVNTdJxD0/RQREcmJdO+Bdgfmh88/AQ4In/8ZOClTQYmIiBS6dBPoCoJ7lgCL+Wz4vmHA1oTvEBER2Qelm0Cf4bPe3/cAt5rZUuBRmh5EQUREZJ+S1j1Qd78+5vnvzGwlwdAS77n7c5kOTkREpFBFmlC7QThw+xsZikVERKRopD2QgpkdZma/NrO3w8fjZnZYNoITEREpVOkOpHAB8BZBf83nw0d34E0z+/fMhyciIlKY0r2E+xPgJne/LXahmV0P/Bh4IlOBiYiIFLJ0L+GWAb9NsPxpPhvkXUREZJ+XbgL9CzAywfKRwKvNDUZERKRYpDKh9tkxL18AbjezI/is9e3RwNnALRmPTkREpEClcg/0dwmWXRY+Yk0gyRi3IiIi+5pUJtTO2ZyhIiIixULJUUREJIIoAymcZmbTzOxjM1tjZq+a2anZCE5ERKRQpTuQwiXrBo2rAAATxUlEQVQEA8r/A7gWuA5YCjxjZt/MfHgiIiKFKd2BFK4Fxrr7L2KWPWRmMwmS6cMZi0xERKSApXsJtxfB5NnxXgB6Nz8cERGR4hBlQu1RCZafBCxvfjgiIiLFId1LuHcCE8LZV14HHPgicCFwVYZjExERKVjpTqj9SzP7CPgewehDAAuAr7n77zMdnIiISKFKOYGaWWuCS7XT3P2Z7IUkIiJS+FK+B+ruu4BJQKfshSMiIlIc0m1EVAv0z0YgIiIixSTdBHoLMN7MzjKzg82sNPaRhfhEREQKUrqtcP8U/juJoAVuAwtfl2QiKBERkUKXbgI9LitRiIiIFJmUEqiZdQB+BpwFtAFeBq5294+zGJuIiEjBSvUe6K3ARQSXcJ8kGI3of7IUk4iISMFL9RLu2cC33P3/AMzsf4HpZlbi7vVZi05ERKRApVoDPRh4reGFu78J7AIqshGUiIhIoUs1gZYAO+KW7SL9RkgiIiL7hFQToAFPmNn2mGX7AQ+Y2ZaGBe5+ZiaDExERKVSpJtDHEix7IpOBiIiIFJOUEqi7X5ztQERERIpJukP5iYiICEqgIiIikSiBioiIRKAEKiIiEoESqIiISARKoCIiIhEogYqIiESgBCoiIhKBEqiIiEgESqAiIiIRKIGKiIhEoAQqIiISgRKoiIhIBEqgIiIiESiBioiIRKAEKiIiEoESqIiISARKoCIiIhEogYqIiESgBCoiIhJBzhOomV1pZkvNbJuZzTSz4XspP9TMXjWzrWb2gZndbGaWpOwXzWyXmc3NTvQiIiKBnCZQM/s6cA9wG1ADvA68YGa9kpTvDLwErAaOBK4GfgCMTVC2K/Br4JWsBC8iIhIj1zXQscCj7v6Auy9w96uAOuCKJOUvADoAo919rrtPBH4KjE1QC30IeAyYkaXYRUREGuUsgZpZW+BwYHLcqsnAMUneNgx4zd23xix7EagA+sRs+0qgB/DjTMUrIiLSlFzWQA8ESggux8ZaTZD8EumRpHzDOsxsKDAOuMDd6zMTqoiISNNa5+EzPe61JVi2t/IAbmbtgP8Dvu/uS1P5cDO7DLgMoLy8nFmzZgFQUVFBhw4dWLx4MQBdunShb9++zJ49G4CSkhKqq6tZuHAhmzdvBqCyspJ169YBXVP56Mh27NjB3LlBu6h27doxZMgQ5s2bx/bt2wGoqqqirq6OtWvXAtCnTx/cneXLlwNQVlZGWVkZ8+fPB6B9+/ZUVlYyZ84cYERWY//www9ZtWoVEBzvzp07s3DhQgA6derEgAEDmD17Nu6OmVFTU8OiRYvYtGkTAIMGDWLjxo3U1dUBe35PcELWYl+wYAFbtwYXPwYPHsyaNWtYs2YNAL1798bMWLZsGQDdunWjvLw8re8pm7EDzJo1i44dOzJo0CBqa2uprw/OL2tqaliyZAkbNmwAoH///mzZsiWt7wmOz3rsPXv2pG3btixZsgSArl270qtXL2prawFo06YNQ4cOjfQ9ZTv26upqVqxYwfr16wHo27cvO3bsYOXKlQB0796d0tJSFixYAJDW95Tt3xt3T+l3b/XqoC6TzveU/GJjZqxduzal372dO3cCJP2eUmXuTeWuzAkv4W4BznP3p2OW3wtUufuXErzn10A3dz8tZtmRwJtAX4LkuhSIrXm2Ikiy9cCp7h5/ybhRTU2NT5kypVn7BXDNY9n9g75j9PqsbbuYY4fsxl/MsYP+bpqiv5vk9HcDpaWlM939iL2Vy9klXHffAcwERsWtGkXQGjeRGcBwM9svrvwqYBnwATAUODTmcT+wOHyebLsiIiLNkutWuHcBF5nZJWZWaWb3EDQIuh/AzG43s9huKL8hqLU+amZVZnY2cB1wlwd2hq1zGx/AR8D28PUnud09ERFpKXJ6D9TdnzKzbsCNQDkwl+Ay6/KwSDnQL6b8BjMbBdwLvA2sB8YTJGIREZG8yXkjIne/D7gvybqLEixLq6WLu98C3BItOhERkdRoLFwREZEIlEBFREQiUAIVERGJQAlUREQkAiVQERGRCJRARUREIlACFRERiUAJVEREJAIlUBERkQiUQEVERCJQAhUREYlACVRERCQCJVAREZEIlEBFREQiUAIVERGJQAlUREQkAiVQERGRCJRARUREIlACFRERiUAJVEREJAIlUBERkQiUQEVERCJQAhUREYlACVRERCQCJVAREZEIlEBFREQiUAIVERGJQAlUREQkAiVQERGRCJRARUREIlACFRERiUAJVEREJAIlUBERkQiUQEVERCJQAhUREYlACVRERCQCJVAREZEIlEBFREQiUAIVERGJQAlUREQkAiVQERGRCJRARUREIlACFRERiUAJVEREJAIlUBERkQiUQEVERCJQAhUREYlACVRERCQCJVAREZEIlEBFREQiUAIVERGJQAlUREQkAiVQERGRCJRARUREIlACFRERiSDnCdTMrjSzpWa2zcxmmtnwvZQfamavmtlWM/vAzG42M4sr86VwW9vMbImZXZ7dvRARkZYupwnUzL4O3APcBtQArwMvmFmvJOU7Ay8Bq4EjgauBHwBjY8p8Hng+3FYNcDswwcy+mr09ERGRli7XNdCxwKPu/oC7L3D3q4A64Iok5S8AOgCj3X2uu08EfgqMjamFXg6scverwm0+ADwGfD+7uyIiIi1ZzhKombUFDgcmx62aDByT5G3DgNfcfWvMsheBCqBPTJn4bb4IHGFmbZoTs4iISDK5rIEeCJQQXI6NtRrokeQ9PZKUb1jXVJnW4WeKiIhknLl7bj7IrAL4ABjh7q/FLB8HnOfuhyR4z2TgfXf/Vsyy3sAyYJi7v2Fm7wGPu/uPYsp8CZgKlLv7h3HbvAy4LHw5CFiYmT1My4HAx3n43Ewo5tihuONX7PlTzPEr9vT1dveyvRVqnYtIQh8D9exZ2/wce9YgG3yYpDwx70lWZhewNn6D7v4r4FephZwdZva2ux+RzxiiKubYobjjV+z5U8zxK/bsydklXHffAcwERsWtGkXQgjaRGcBwM9svrvwqglpoQ5kTE2zzbXff2ZyYRUREksl1K9y7gIvM7BIzqzSzewgaBN0PYGa3m9krMeV/A2wBHjWzKjM7G7gOuMs/u/Z8P9DTzO4Ot3kJcBFwZ472SUREWqBcXsLF3Z8ys27AjUA5MBc41d2Xh0XKgX4x5TeY2SjgXuBtYD0wniARN5RZamanAj8n6A6zCrg67PJSqPJ6CbmZijl2KO74FXv+FHP8ij1LctaISEREZF+isXBFREQiUAIVERGJQAlUREQkAiXQHIufSUZyR8deRDJJCTTH3N3NrLWZ5bQFtOjY55OZtYp5rhOZHNKxzx61ws0RMysFzgBGA2uAFQTDCP7V3f+ez9j2dTr2hcHMOrn7pnzH0RLp2GeHEmiOmNkk4BCC0Zg6Ad2BdgRDEk4CHnL3T/MXYXJm9hVgpruvaKJMa3fflcOwUqZjnz9mVkkwjWENsJjg5OUdglmW3g/LmOuHKON07LNPCTQHwj/ktwkGwH83XLY/wZCDXwfOBH5NMGH4zkL6gzazQcACYDswHXgY+JO7b4gpUwJcTAHW6HTs88fM+hFMdr+aIP5DCMatbkfwg/6gu8dPRVgQzKw7wd/I8+6+rolybQpxyFAd+xxxdz2y/AD+A3gDaB2+bh23/jTgI+AL+Y41QezXEYxVfCHwNLAJ+CfwOHA8wWhW/YFPgV75jlfHvnAewP8AfwQ6xSzrTpDwpwGbgW/lO84ksU8Ij+u68NifCrSLK9ML+H788kJ46Njn5qFGRLkxE+gNfAPA3XeZWZuYQfJfAmYB5+YpvqZ0AWqBP7j7vwFDgWsJ9udF4D3gKWCeN3GZMY907POnNzDL3TeZWYmZlbj7and/xN1HEIxjfamZdchznIkcAfwU+B7QFXgGWGpmE8zssLDMpcDl7r49TzE2Rcc+F/J9ttFSHsADwAZgHDFnhTHr3wGuyneccTG1Ao4FLkiwri1QBdxCcLZ4cb7j1bEvrAfwHYL7bofExd42fD4YWAocl+9Y4+KuIKj5XBa+bk1wCfTa8G+lHphDUIv7Tr7j1bHP30P3QHPIzK4h+MMuI7iM8gywE/gawSWJQ919S/4ibFqixipmNoJg8vJO7r45L4GlwMy+T3Dsu1Ocx36Pxh6FfuzN7PMEjbQOAH7k7g/Hra8iqP0fUEjH3sw6Elwi/8jd/xa3rgPBycv3gbMJjv3W3EfZNB373FACzTEz6w18meC6/lHANoLLiI+6+1/zGVuqwoYrn7q7h4npS+5+Rr7jSsTMWnnYwtbMBgPDgZOBYcAOCvTYh/31zJtoHVzIx74h4ZtZZ4LLcecDJcBk4GWCH8IvAu+4+zfyF2nTwu+hlbvXxy1/FOjn7sPzElgKzKwTcDtwAdCGIjv2kPTE8VEK5NgrgWZZ+KM9mOB+1ibgdXdfGbO+K/DP+D+SQhAX+xbgDXdfGldmKPBJ/PJCFXYqb+vu28Jjvym+Vl0szKwa2FgMxz6s8XwZOAE4FFgCPAFMcvcP8xlbKmITqZm1B34P/I+7P5Pn0PYQF+t+BPfORxDU7A4juHRbkMc+/P/pyX4PC+3YK4FmkZldR3D2N4BgntK1gANvAU8SJKRdsbWkQhEX+wcEsX8KzCaY6Hx6ocUcK6zpr3X3T5KsL9j+b3uLvdCFP4L/SnCrogOwDJjmMV0SzKyLx3THKRQJYv8AeNXdP4op0xo4PP4SYyGLu2pUkMc+FWbWBjjC3WfkOxZQAs2acOLwZcAP3P1+MzsY+ALBpcMjgP2A69x9at6CTGIvsR9OEPv17j61QJN/V+DvBP3fJgKvAXUe12fMzL4ILHL31bmPMrE0Y/+Hu9flPsrkwsuGDwHHEZxwfRCu2gJMAZ509wVh2YI6iUkQ+0qCE96twKvAE15gfW1jhcnl88ByT9A6tdCOd6y9xV6w8t2KaV99AJcDbyVZVw38DtgI9M13rPtS7GGMYwj6kE0mGITgI4IfxpMJahatgIMJuoEcku9495XYw/hvIOh6c2T4+hDg3wm6TbxN0DexLN9xRoj9LeAPhRp7GO93CVqnPkIwdGUPoCSuTGeCS+lt8h1vxNhPI2xJXAiPvAewrz6AfyO41zAifF0S+wdBUIt7A7gy37HuS7GH8d0L/DJMNp2Ab4c/3p+GiedHwHiCe895j3dfiT2M/zVgbILlJQT34RYBf853nPta7GGcM4C/hPtRH/4fvougwVCXsMzlBLeO8h7vvhC7BlLInj8By4HvmdlQd6/3mJZ87r4N2AV0y1eATSja2MNLQTMILoOau29y93vd/QhgIPBbgkET/h9wZ/4i3VMxxw6N9wbnAl81s7JwWUMn/np3n0bwI9gzbABVMIo5doAw5p3AAx60Tu1NcOXidIJuW1PM7FqCml5B3bst5tjznsH3xQef3Vs+lqCv1U6Cyz//SnCd/3DgKmA90Cff8e4rscfsQxuga/i8JHwdW4M+hOAst2e+Y92XYg/jOxr4B0HXle4J1h8MfAIclO9Y97HYywlOrE5OsK6G4MpGQ0PAgoq/mGNXI6IsCvvAtSNIOhcSXL9vB3xIUIP7hbvfk78IkyvW2GP6H/Yj6KIS23qylbt/amY3AZe6e6/8RbqnYo4dGluwtiIYb/U2glFkfkcw3OD7wL8Q3N+qdPcj8xVnIsUce4Owi4d70EWrcd5PD3/kzewnwKnuXpOvGJMp1tiVQDPMzD5HkHDGEjQG2UbQheVPBK0QDyAY+Wa6F1DrTyju2GGP+D8iSPR1BEODTfJwtB4zO42g7+qr+Yo1XjHHnoiZHQBcRDCAwqEEfaC3A28Ct3sBdwEp8tgTtrQNR/GZBTzi7j/NfWR7V4yxK4FmWDhKxhCC1obrgFKClquHECSjH7r7W3kLsAnFHDskjb+GIP6VwM+8cKdwepQijR0ar1hsiv0BDGt1+wH7E4x+s7kQk08xxw6J409QZj+C6fuedPcdOQtuL4o5dlACzajw0sMmgksN02KW9SIYtu8SoC/wb+4+O2+BJlDMsUOT8R9MEP+lBI0Tzi20+Is59gZm9kuCGtqbBH35NiYo09Xd1xdaf8Rijh1Sjv8Ad/9nzoPbi2KOHVAjokw+CGoQc4Cjk6xvS9Al4fZ8x7ovxV7s8Rdz7GF85xE08PgnwRB9vyQY7Ls/0D4ssz/wLDA03/HuK7E3Ef9XgH4x8TcMf1eV73j3ldgbHqqBZlB4I/w5giHAvkEwUsyncWWuIpjI9tA8hJhUMccOxR1/MccOYGYPELQMvoMg+Ywm+BFcCDwPvAIMAu5x97b5ijORYo4dijv+Yo69gfqBZpAHU+vcQHDW9GvgG2Z2sAVT9DTcDP8SQX+zglLMsUNxx1/MsYf9J5cSDOywxN3vdPehwJEEw9+NJui/OgF4PH+R7qmYY4fijr+YY4+lGmgWWDDzxE3AmQTDU80A1gAnErSsvMTd5+QvwuSKOXYo7viLNXYLxu/t7u5/N7O2wE6P+WExs68TTJ5wmLu/k684Eynm2KG44y/m2BsogWZR2DXhNOAsgi4hc4GnvYAHpG5QzLFDccdfzLE3CFuxmgdTal1KcBmuQ77jSkUxxw7FHX+xxa4EmiNWgLOWpKqYY4fijr+YY29gZmMJRlP6Wb5jSVcxxw7FHX8xxK4EKiJZZcEYv/XFeCJQzLFDccdfDLErgYqIiESgVrgiIiIRKIGKiIhEoAQqIiISgRKoiIhIBEqgIiIiESiBioiIRPD/AYlSAbop9sBJAAAAAElFTkSuQmCC\n", + "image/png": "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03B+ZnLeeeex11578a53vYuf/vSnr867++672Xvvvdlrr7244oorXm1ftWoVhx12GFOnTuWwww7jueee6/f9kAY7A1TazHzoQx/i1ltv7Xb+3XffzaOPPsqsWbP44he/yFlnnQXA+vXrOeecc/j2t7/N/fffz2233cYvf/lLAK644gr2339/Zs2axf77779BuEpDlQEqbWb22Wcftt12227nT58+naOPPpqI4O1vfzvPP/88y5YtY/bs2UyYMIGddtqJESNGcPjhhzNjxgwAZsyYwdFHHw3A0UcfzfTp0wdkX6TBzACVhpilS5cybty4V6c7OjpYunRpt+0AzzzzDGPHjgVg7NixPPvsswNbtDQIGaDSEJOZr2mLiG7bJTVmgEpDTEdHB0899dSr00uWLGHs2LHdtgNsv/32LFu2DIBly5bR1tY2sEVLg5ABKg0xBx98MDfffDOZyUMPPcRWW23F2LFjmTJlCo899hiLFi1i7dq13H777Rx00EEAHHTQQdx8880A3HzzzRx88MEbcxekQWH4xi5AUt866aSTuPfee1mxYgW77bYb5513Hi+//DIAJ5xwAtOmTeOuu+5ir732YuTIkXz5y18GYPjw4VxyySUceeSRrF+/nmOPPZbOzk4AzjjjDE488URuuukmdthhB6677rqNtn/SYBGNznsMFZMnT86ZM2du7DIkSYPI6NGjZ2fm1N76eQhXkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpggEN0IjYLyK+GxFPRURGxPFNLLNHRPwwIl4ql/t01D3hOiL2j4jZEbEmIh6LiFP6bSckSWLgR6BvAh4B/hZ4qbfOEbEVcBfwNPB24HTgk8CZNX0mANOB+4DJwMXAlyLiiL4uXpKkLgP6LNzMnE4RdkTE9U0sciwwCjguM18CHomITuDMiLg8i+cQngIsyczTymV+ERF/BpwN3NbX+yBJEgz+c6DvBH5chmeXO4AOYKeaPnfWLXcHMDUi3tDvFUqShqTB/jaWscCTdW1P18x7vPz37gZ9hgPbAUtrZ0TEycDJAO3t7cyZMwco3pE4atQoFi5cCMDWW2/NxIkTmTt3LgDDhg1j0qRJLFiwgNWrVwPQ2dnJypUrufLu3ftgVyVJr8e5713IokWLAGhra6OtrY358+cDMHLkSDo7O5k3bx7r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\n", "text/plain": [ "
" ] }, - "execution_count": 128, + "execution_count": 121, "metadata": {}, "output_type": "execute_result" } From 05ff14698e1771da48cd04102f10f545b022fcf6 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Mon, 12 Aug 2019 22:50:08 -0300 Subject: [PATCH 26/49] Deutsch -Jozsa quase pronto! --- deutsch_jozsa.ipynb | 395 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 340 insertions(+), 55 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index c2cf764..114a873 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -5,13 +5,14 @@ "metadata": {}, "source": [ "\n", - "# Problema de Deutch e Deutch-Jozsa\n", + "# Problema de Deutch e Deutsch-Jozsa\n", "\n", "## Observação dos autores\n", "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", "\n", "### Cronograma\n", + "- Antes de comecarmos\n", "- Paralelismo Quântico\n", "- Problema de Deutch\n", "- Porta Hadamard para N qubits\n", @@ -22,93 +23,160 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Paralelismo Quântico\n", + "# Antes de começarmos\n", "\n", - "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", - "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", - "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", - "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", - "(só que é exponencial no número de qubits no sistema, tá ok?).\n", + " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", "\n", + "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", "\n", - "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", - " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", - " \n", - "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", + "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", "\n", + " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", "\n", - "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", - " \n", - " \n", - "$$\\begin{eqnarray}\n", - " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", - " = \n", - " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", - " \\end{eqnarray}$$\n", - " \n", - " \n", - "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", + " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Avaliando uma função\n", + "\n", + " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", + "\n", + "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", + "\n", + " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " \n", + " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", + "\n", + "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", + " \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Problema de Deutsch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", + "\n", + "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", + "\n", + "### Conceitos Iniciais:\n", + "\n", + "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", "\n", + "### Como o algoritmo funciona:\n", "\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", "\n", + "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", "\n", - "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" + "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", + "\n", + "\n", + "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Problema de Deutch\n", + "**Antes de seguirmos para nosso exemplo:**\n", + "\n", + "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", + "\n", + "\n", + "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", + "\n", + "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Exemplo Teórico (1):\n", + "\n", + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 0$ e $f(1) = 1$ que claramente esse é uma função balanceada.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", "\n", - "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "#### 2º Passo:\n", "\n", - "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", "\n", - "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", "\n", - "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", "\n", - "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", "\n", - "$$\\begin{eqnarray}\n", - "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", - "\\end{eqnarray}$$\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", "\n", - "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", + "#### 3º Passo:\n", "\n", - "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", "\n", - "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", + "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", "\n", - "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$\n", "\n", - "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", + "#### 4º Passo:\n", "\n", - "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", "\n", - "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", - "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", "\n", - "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "$|\\psi_5\\rangle = \n", + "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", + "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", + "$|\\psi_5\\rangle =$ \n", "\n", - "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", "\n", - "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", - "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" + "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_5\\rangle =\\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$\n", + "\n", + "#### 5º Passo\n", + "\n", + "Agora nós podemos fazer a medição do nosso sistema representado por $|\\psi_5\\rangle$. \n", + "\n", + "Podemos percebe que quando medirmos o nós iremos obter ambos os estados $|10\\rangle$ e\n", + "$|11\\rangle$ com probabilidade de $\\frac{1}{2}$ cada um. Isso prova o que queriamos, que nada \n", + "mais do que, obter uma saída diferente de 00 se a nossa função for balanceada.\n", + "\n", + "\n", + "\n" ] }, { @@ -143,9 +211,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Problema de Deutch Jozsa\n", + "## Problema de Deutsch Jozsa\n", "\n", - "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", "\n", "\n", "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", @@ -189,6 +257,223 @@ "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo na prática (1):\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "# Importing standard Qiskit libraries and configuring account\n", + "import numpy as np\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", + "from qiskit.compiler import transpile, assemble\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "# Loading your IBM Q account(s)\n", + "#provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, Aer, execute\n", + "from qiskit.tools.visualization import plot_histogram\n", + "\n", + "q = QuantumRegister(2)\n", + "c = ClassicalRegister(2)\n", + "deutsch = QuantumCircuit(q, c)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deutsch.h(q[0])\n", + "\n", + "deutsch.x(q[1])\n", + "deutsch.h(q[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deutsch.cx(q[0], q[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = \n", + "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", + "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", + "\n", + "\n", + "$|\\psi_5\\rangle =$ \n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_5\\rangle = \\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deutsch.h(q[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deutsch.measure(q, c)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "backend = Aer.get_backend('qasm_simulator')\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Execução em uma máquina real\n", + "\n", + "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit import IBMQ \n", + "import getpass\n", + "\n", + "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Escolha um computador quântico operacional:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IBMQ.enable_account(MY_API_TOKEN)\n", + "IBMQ.backends(operational=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "backend = Aer.get_backend('ibmqx2')\n", + "\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] } ], "metadata": { @@ -207,7 +492,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.7.3" } }, "nbformat": 4, From 862f0bbf039e81f87a96721bd2e50e60e5e200ff Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Mon, 12 Aug 2019 22:59:18 -0300 Subject: [PATCH 27/49] Algoritmo de Grover concertado --- .ipynb_checkpoints/grover-checkpoint.ipynb | 89 ++++++++++++---------- grover.ipynb | 89 ++++++++++++---------- 2 files changed, 98 insertions(+), 80 deletions(-) diff --git a/.ipynb_checkpoints/grover-checkpoint.ipynb b/.ipynb_checkpoints/grover-checkpoint.ipynb index c80ed0d..438676d 100755 --- a/.ipynb_checkpoints/grover-checkpoint.ipynb +++ b/.ipynb_checkpoints/grover-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 57, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", + " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do conjunto até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", " " ] }, @@ -232,14 +232,6 @@ "qc.draw()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", - " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " - ] - }, { "cell_type": "code", "execution_count": 27, @@ -267,6 +259,14 @@ "plot_histogram(counts, title='O indíce procurado')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Considerando este resultado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", + " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -346,36 +346,38 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐\n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
-       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├───────────────\n",
-       "        └───┘└───┘└───┘               └───┘               \n",
+       "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐     \n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├─────\n",
+       "        ├───┤       │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤┌───┐\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘└───┘└───┘└───┘└───┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────────────────────────\n",
+       "        └───┘└───┘└───┘                                   \n",
        " c_0: 0 ══════════════════════════════════════════════════\n",
        "                                                          \n",
        " c_1: 0 ══════════════════════════════════════════════════\n",
        "                                                          
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 61, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "n_qubits = 2\n", + "n_ancila = 1\n", "#Inicialização dos estados\n", - "qub = QuantumRegister(3,'q')\n", + "qub = QuantumRegister(n_qubits+n_ancila,'q')\n", "cb = ClassicalRegister(2,'c')\n", "qc = QuantumCircuit(qub,cb)\n", "qc.h(qub[0])\n", @@ -385,7 +387,7 @@ "qc.h(qub[2])\n", "\n", "#Interação de grover\n", - "for i in range(int(np.ceil(np.sqrt(4)))):\n", + "for i in range(int(np.floor(np.sqrt(n_qubits)))):\n", " # Oracle\n", " qc.ccx(qub[0], qub[1], qub[2])\n", "\n", @@ -394,8 +396,15 @@ " qc.h(qub[1])\n", "\n", " #----Troca de fase\n", - " qc.z(qub[0])\n", - " qc.z(qub[1])\n", + " qc.x(qub[0])\n", + " qc.x(qub[1])\n", + " qc.h(qub[1])\n", + " \n", + " qc.cx(qub[0],qub[1])\n", + " \n", + " qc.h(qub[1])\n", + " qc.x(qub[0])\n", + " qc.x(qub[1])\n", "\n", " #--- Hadarmard\n", " qc.h(qub[0])\n", @@ -414,29 +423,29 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├┤M├───\n",
-       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤└╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├─╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├────────────────╫──╫─\n",
-       "        └───┘└───┘└───┘               └───┘                ║  ║ \n",
-       " c_0: 0 ═══════════════════════════════════════════════════╩══╬═\n",
+       "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐┌─┐        \n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├┤M├────────\n",
+       "        ├───┤       │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤└╥┘┌───┐┌─┐\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─╫─┤ H ├┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘└───┘└───┘└───┘ ║ └───┘└╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────────────────────╫───────╫─\n",
+       "        └───┘└───┘└───┘                               ║       ║ \n",
+       " c_0: 0 ══════════════════════════════════════════════╩═══════╬═\n",
        "                                                              ║ \n",
        " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
        "                                                                
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 62, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -449,17 +458,17 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { - "image/png": "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f/mX7L777lx88cVrrL/sssvYa6+92HfffTnmmGN49tlnV62bN28exx57LHvuuSd77bUXzzzzDACZyXnnncd73vMe9txzT6688spe+zwaOIb2dQGS1J7m5ma+/OUvc8stt9DY2MghhxzC4Ycfzo477riqzS677MLUqVMZPnw411xzDZMnT+aaa64B4JRTTuGMM87goIMO4tVXX2W99Yo+w5QpU3juuee4//77WW+99Vi4cGGffD71b/ZAJdWtBx98kHe84x1sv/32bLDBBhx77LHcdtttq7XZb7/9GD58OAB77LEH8+fPB+BPf/oTK1eu5KCDDgLgbW9726p23//+9/nSl760KlBHjRrVWx9JA4gBKqluLViwgLe//e2rnjc2NrJgwYJ2299www28733vA+Cpp55i0003ZdKkSRxwwAF8/etfp7m5GYCnn36an/zkJxx88MF8+MMf5qmnnurZD6IByQCVVLcyc41lEdFm25tuuolp06Zx6qmnArBy5Uruu+8+zj33XH79618zZ84cpkyZAsDy5cvZcMMNmTp1KpMmTVr1GqkzDFBJdauxsZHnnntu1fP58+ezzTbbrNHuN7/5DRdddBFTpkxhww03XPXaXXbZhe23356hQ4dy5JFH8sgjj6xad/TRRwPwgQ98gD/+8Y+98Gk00BigkurWbrvtxuzZs5k7dy7Lly/nlltu4fDDD1+tzSOPPMIZZ5zBlClTVjuXudtuu/Hyyy+zaNEiAO666y7Gjx8PwBFHHMFdd90FwD333MO4ceN66RNpIPEqXEl1a+jQoVxwwQUcd9xxNDc38/GPf5wJEyZw/vnn09TUxPvf/34mT57MsmXL+NSnPgXA6NGjmTJlCkOGDOHcc8/lmGOOITPZddddmTRpEgCnn346J510Et/97ncZMWIEl1xySV9+TPVT0dY5hsGiqakpp06d2tdlSJLqyMiRIx/MzD3W1c5DuJIkVWCASpJUgQHaR7oyPdmWW27J/vvvz/7778/HPvaxNV575plnsu222/Zo/ZI02HkRUR/o6vRkw4YNW3UFYWvTpk1jyZIlvfI5JGkwswfaB7oyPdnaNDc3M3nyZM4+++yeKFuSVMMA7QNdmZ4M4I033uDggw/m0EMP5Re/+MWq5VdddRWHH354mwPNJUndy0O4faDK9GS33nrrqmWPPPIIDQ0NzJkzhw9+8IPstNNObLTRRvz0pz/l5z//eY/VLUn6XwZoH+js9GS33nrrqunJABoaGgDYfvvt2XfffXnkkUcYNmwYTz/9NLvvvjsAr732GrvvvjsPPvhgD38aSRqcPITbB7oyPdnLL7/Mm2++CcDixYu5//77GT9+PIcddhh/+tOfmD59OtOnT2f48OGGpyT1IHugfaAr05PNmjWLM844g/XWW4+33nqL0047bbWrdyVJvcOp/JzKT6U777yTr371qzQ3N/OJT3yC008/fbX1l112Gddffz1Dhw5lyy235NJLL11tvO0rr7zC3nvvzZFHHskFF1wAwFFHHcULL7zARhttBMCPf/xjb94s1bmOTuVnD1Si62NzAc4//3z22WefNbZ95ZVX0tTU1CufQ1LvMUAlVh+bC6wam1sboPvtt9+qx3vssQc33XTTqucPP/wwCxcu5JBDDuHhhx/utbr7my9ft3lfl9BtLjjxpb4uQX3Mi4gkujY296233uKss87inHPOabPt5z//efbff38uvPDCNocwSeqf7IFKdG1s7tVXX82hhx7K6NGj12h75ZVX0tjYyNKlSznxxBO58cYb+ehHP9q9xUvqEwaoRNfG5v7+97/nvvvu4+qrr2bZsmUsX76cESNGMHnyZBobGwHYeOONOe6443jooYcMUGmAMEAlVh+b29DQwC233ML3vve91dq0jM29+eabV7uStrbdlClTePjhh5k8eTIrV65kyZIlbLHFFqxYsYLbb7+dAw88sLc+kqQeZoBKdG1sbnvefPNNjjvuOFasWEFzczMHHHAAkyZN6q2PJKmHOQ7UcaBSr/Eq3IGh6pjpZ599lkmTJtHc3MyKFSs46aSTVv1BWk9jph0HKknqdl0ZM7311lvzq1/9ig033JBXX32V9773vRx++OGr5vfub2OmHcYiSeqwrtzPeIMNNlh18d3y5ct56623erf4bmaASpI6rKv3M543bx777rsvO++8M6eddtqq3if0vzHTHsLtBp7XkTRYdPV+xqNHj+buu+9mwYIFfOITn+Doo49mq6226pdjpu2BSpI6rLNjpqdMmbLa/YxbNDQ0MH78eO67775V24XVx0zXOwNUktRhXbmf8XPPPcfrr78OFPc2fuCBB9hhhx1YuXIlixcvBlg1ZnrChAm996Eq8hCuJKnDujJm+vHHH+ess84iIshMPve5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\n", + "image/png": "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\n", "text/plain": [ "
" ] }, - "execution_count": 69, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -471,7 +480,7 @@ "# Execute and get counts\n", "result = execute(qc, simulator).result()\n", "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='O indíce procurado')" + "plot_histogram(counts, title='O indíce procurado')\n" ] }, { @@ -486,7 +495,7 @@ " \n", " 3. Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. \n", " \n", - " 4. O que acontece se repetirmos o exemplo porém aplicarmos _inversão de fase_ e inversão sobre a média quatro vezes?\n", + " 4. O que acontece se repetirmos o circuito porém aplicarmos _interação de grover_ quatro vezes?\n", " \n", " 5. Fazer o exemplo para uma entrada de três qubits onde $f$ \"escolhe\" a cadeia 001\n", " 6. Crie um circuito quântico utilizando um oracle diferente. Dica:Verifique a ação de $U_f$ sobre os estados da base ( incluindo a ancila )" diff --git a/grover.ipynb b/grover.ipynb index c80ed0d..438676d 100755 --- a/grover.ipynb +++ b/grover.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 57, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", + " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do conjunto até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", " " ] }, @@ -232,14 +232,6 @@ "qc.draw()" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", - " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " - ] - }, { "cell_type": "code", "execution_count": 27, @@ -267,6 +259,14 @@ "plot_histogram(counts, title='O indíce procurado')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Considerando este resultado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", + " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -346,36 +346,38 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐\n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
-       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├───────────────\n",
-       "        └───┘└───┘└───┘               └───┘               \n",
+       "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐     \n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├─────\n",
+       "        ├───┤       │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤┌───┐\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘└───┘└───┘└───┘└───┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────────────────────────\n",
+       "        └───┘└───┘└───┘                                   \n",
        " c_0: 0 ══════════════════════════════════════════════════\n",
        "                                                          \n",
        " c_1: 0 ══════════════════════════════════════════════════\n",
        "                                                          
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 61, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "n_qubits = 2\n", + "n_ancila = 1\n", "#Inicialização dos estados\n", - "qub = QuantumRegister(3,'q')\n", + "qub = QuantumRegister(n_qubits+n_ancila,'q')\n", "cb = ClassicalRegister(2,'c')\n", "qc = QuantumCircuit(qub,cb)\n", "qc.h(qub[0])\n", @@ -385,7 +387,7 @@ "qc.h(qub[2])\n", "\n", "#Interação de grover\n", - "for i in range(int(np.ceil(np.sqrt(4)))):\n", + "for i in range(int(np.floor(np.sqrt(n_qubits)))):\n", " # Oracle\n", " qc.ccx(qub[0], qub[1], qub[2])\n", "\n", @@ -394,8 +396,15 @@ " qc.h(qub[1])\n", "\n", " #----Troca de fase\n", - " qc.z(qub[0])\n", - " qc.z(qub[1])\n", + " qc.x(qub[0])\n", + " qc.x(qub[1])\n", + " qc.h(qub[1])\n", + " \n", + " qc.cx(qub[0],qub[1])\n", + " \n", + " qc.h(qub[1])\n", + " qc.x(qub[0])\n", + " qc.x(qub[1])\n", "\n", " #--- Hadarmard\n", " qc.h(qub[0])\n", @@ -414,29 +423,29 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├┤M├───\n",
-       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤└╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├─╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├────────────────╫──╫─\n",
-       "        └───┘└───┘└───┘               └───┘                ║  ║ \n",
-       " c_0: 0 ═══════════════════════════════════════════════════╩══╬═\n",
+       "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐┌─┐        \n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├┤M├────────\n",
+       "        ├───┤       │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤└╥┘┌───┐┌─┐\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─╫─┤ H ├┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘└───┘└───┘└───┘ ║ └───┘└╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────────────────────╫───────╫─\n",
+       "        └───┘└───┘└───┘                               ║       ║ \n",
+       " c_0: 0 ══════════════════════════════════════════════╩═══════╬═\n",
        "                                                              ║ \n",
        " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
        "                                                                
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 62, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -449,17 +458,17 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { - "image/png": "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f/mX7L777lx88cVrrL/sssvYa6+92HfffTnmmGN49tlnV62bN28exx57LHvuuSd77bUXzzzzDACZyXnnncd73vMe9txzT6688spe+zwaOIb2dQGS1J7m5ma+/OUvc8stt9DY2MghhxzC4Ycfzo477riqzS677MLUqVMZPnw411xzDZMnT+aaa64B4JRTTuGMM87goIMO4tVXX2W99Yo+w5QpU3juuee4//77WW+99Vi4cGGffD71b/ZAJdWtBx98kHe84x1sv/32bLDBBhx77LHcdtttq7XZb7/9GD58OAB77LEH8+fPB+BPf/oTK1eu5KCDDgLgbW9726p23//+9/nSl760KlBHjRrVWx9JA4gBKqluLViwgLe//e2rnjc2NrJgwYJ2299www28733vA+Cpp55i0003ZdKkSRxwwAF8/etfp7m5GYCnn36an/zkJxx88MF8+MMf5qmnnurZD6IByQCVVLcyc41lEdFm25tuuolp06Zx6qmnArBy5Uruu+8+zj33XH79618zZ84cpkyZAsDy5cvZcMMNmTp1KpMmTVr1GqkzDFBJdauxsZHnnntu1fP58+ezzTbbrNHuN7/5DRdddBFTpkxhww03XPXaXXbZhe23356hQ4dy5JFH8sgjj6xad/TRRwPwgQ98gD/+8Y+98Gk00BigkurWbrvtxuzZs5k7dy7Lly/nlltu4fDDD1+tzSOPPMIZZ5zBlClTVjuXudtuu/Hyyy+zaNEiAO666y7Gjx8PwBFHHMFdd90FwD333MO4ceN66RNpIPEqXEl1a+jQoVxwwQUcd9xxNDc38/GPf5wJEyZw/vnn09TUxPvf/34mT57MsmXL+NSnPgXA6NGjmTJlCkOGDOHcc8/lmGOOITPZddddmTRpEgCnn346J510Et/97ncZMWIEl1xySV9+TPVT0dY5hsGiqakpp06d2tdlSJLqyMiRIx/MzD3W1c5DuJIkVWCASpJUgQHaR7oyPdmWW27J/vvvz/7778/HPvaxNV575plnsu222/Zo/ZI02HkRUR/o6vRkw4YNW3UFYWvTpk1jyZIlvfI5JGkwswfaB7oyPdnaNDc3M3nyZM4+++yeKFuSVMMA7QNdmZ4M4I033uDggw/m0EMP5Re/+MWq5VdddRWHH354mwPNJUndy0O4faDK9GS33nrrqmWPPPIIDQ0NzJkzhw9+8IPstNNObLTRRvz0pz/l5z//eY/VLUn6XwZoH+js9GS33nrrqunJABoaGgDYfvvt2XfffXnkkUcYNmwYTz/9NLvvvjsAr732GrvvvjsPPvhgD38aSRqcPITbB7oyPdnLL7/Mm2++CcDixYu5//77GT9+PIcddhh/+tOfmD59OtOnT2f48OGGpyT1IHugfaAr05PNmjWLM844g/XWW4+33nqL0047bbWrdyVJvcOp/JzKT6U777yTr371qzQ3N/OJT3yC008/fbX1l112Gddffz1Dhw5lyy235NJLL11tvO0rr7zC3nvvzZFHHskFF1wAwFFHHcULL7zARhttBMCPf/xjb94s1bmOTuVnD1Si62NzAc4//3z22WefNbZ95ZVX0tTU1CufQ1LvMUAlVh+bC6wam1sboPvtt9+qx3vssQc33XTTqucPP/wwCxcu5JBDDuHhhx/utbr7my9ft3lfl9BtLjjxpb4uQX3Mi4gkujY296233uKss87inHPOabPt5z//efbff38uvPDCNocwSeqf7IFKdG1s7tVXX82hhx7K6NGj12h75ZVX0tjYyNKlSznxxBO58cYb+ehHP9q9xUvqEwaoRNfG5v7+97/nvvvu4+qrr2bZsmUsX76cESNGMHnyZBobGwHYeOONOe6443jooYcMUGmAMEAlVh+b29DQwC233ML3vve91dq0jM29+eabV7uStrbdlClTePjhh5k8eTIrV65kyZIlbLHFFqxYsYLbb7+dAw88sLc+kqQeZoBKdG1sbnvefPNNjjvuOFasWEFzczMHHHAAkyZN6q2PJKmHOQ7UcaBSr/Eq3IGh6pjpZ599lkmTJtHc3MyKFSs46aSTVv1BWk9jph0HKknqdl0ZM7311lvzq1/9ig033JBXX32V9773vRx++OGr5vfub2OmHcYiSeqwrtzPeIMNNlh18d3y5ct56623erf4bmaASpI6rKv3M543bx777rsvO++8M6eddtqq3if0vzHTHsLtBp7XkTRYdPV+xqNHj+buu+9mwYIFfOITn+Doo49mq6226pdjpu2BSpI6rLNjpqdMmbLa/YxbNDQ0MH78eO67775V24XVx0zXOwNUktRhXbmf8XPPPcfrr78OFPc2fuCBB9hhhx1YuXIlixcvBlg1ZnrChAm996Eq8hCuJKnDujJm+vHHH+ess84iIshMPve5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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAFKCAYAAACtoA4lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAHtpJREFUeJzt3XucX3V95/HXx0EkKZIbo5lJjSZYMYs0hEQrUTRc0iraroLLpVouiiwqIEWQ4FoVK7ib5SJVKUJrUbBAUdl1bRAIyYoCBUICBtNNDUKi5CK5AUZCQvjsH+cM/vLLb2Z+v5OZyYR5PR+P32N+53u+53s+Zx6P5D3nHpmJJElqzct2dQGSJO2ODFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQKV+EhFXRcTfVFz25Ij4ac30KyPiPyLiLX1X4UtDRLwuIjIi9tjVtWhoMUClJpWhtjgifhcRqyPi7yNiZHf9M/P0zPzbPlr9ZcBXMvP+PhpP0k4yQKUmRMSngP8BnAeMAN4KvBa4IyL27Od17wMsyswr+3M9vdQwIHt37kVqd2KASr0oA+xC4MzM/FFmbs3Mx4FjKUL0Q90sd21EfKn8PiMifh0Rn4qI30TEqog4pabvmIj4QUQ8HRH3A/t1zcvMp4GvR8Try77DIuLSiFgeEU9FxE8jYlg5760RcU9EbIyIhyNiRg/b9XhEXBARSyJiQ0T8U0TsVVfv+RGxGvinsv2jEbEsItaX9XbWjHdARNxRzlsTEZ+p/z3Ujl1Xx/kR8TNgU0TsERGzIuLRiHimrO/9Nf3bIuKSiFgbEb8E3lO3XZ1lbevLWj/a3e9A2hkGqNS76cBewPdrGzPzt8CtwMwmxxlLsfc6DvgIRSiOKud9HdgMdAAfLj/duQSYWtY1Gvg08EJEjAP+FfhS2X4u8L2IaO9hrA8Cf0YR2G8APltX72iKPxJOi4jDgS9T/OHQASwHboTiHC0wF/gR0Am8Hrizx9/G9k6gCMKRmfk88ChwKMXv60Lg+ojoKPt+FHgvMAWYBnygbqwbgF+XdXwAuDgijmihFqkpBqjUu32BteV/7PVWlfObsRX4YrkHOwf4LbB/RLQBxwCfy8xNmfkI8K1GA0TEyyjC9ZOZ+URmbsvMezLzOYo94TmZOSczX8jMO4AFwFE91PS1zPxVZq4HLqIIsi4vAJ/PzOcy81mKsP1mZi4s13cBcEhEvI4i0FZn5qWZuTkzn8nM+5r8vQD8XVnHswCZeXNmriy34ybgF0DXBVTHUpwP7qr7yzW/n9cAbwfOL+t4CPgH4K9aqEVqigEq9W4tsG835+c6yvnNWFcXwr8D9gbagT2AX9XMW97NGPtS7A0/2mDea4H/Uh6+3RgRGynCpKNB3y716+ysmX4yMzfXTHfW1lXuga+j2KN+TTc1Nau2DiLixIh4qGY73sTv/1DpbFB3bY3rM/OZuvnjdqI2qSEDVOrdvcBzwNG1jRHxB8C7ae1QZSNPAs9ThFCX8d30XUtxqHe/BvN+BVyXmSNrPn+Qmf+9h3XXr3NlzXT9q5pWUoQ08OL2jwGeKNfdqCaATcDwmumxDfq8uK6IeC1wDXAGMCYzRwKPAFF2WdWg7toaR5eHlGvnP9FNbVJlBqjUi8x8iuI83Fcj4l0R8fLysOXNFOfartvJ8bdRnF/9QkQMj4j/BJzUTd8XgG8Cl5UXy7RFxCER8QrgeuDPI+LPyva9ygt2/rCH1X8iIv4wIkYDnwFu6qHvPwOnRMRB5fouBu4rL6j6ITA2Is6OiFdEcd/qn5TLPQQcFRGjI2IscHYvv5I/oAjUJwHKi63eVDP/X4CzyrpHAbNqfj+/Au4Bvlxu/x9TnG/+Ti/rlFpmgEpNyMzZFAFzCfA0cB/FXtcR5fnAnXUGxeHc1cC1lFe9duNcYDHwALCe4vaal5Xh8Z/LOp8s6zuPnv+d/zNwO/DL8vOl7jpm5p3A3wDfo9gL3A84vpz3DMXFVH9ebsMvgMPKRa8DHgYeL9fVU0iTmUuASyn2/NcABwJ313S5BritHHMhdRd3UZzHfR3F3ugtFOdx7+hpnVIV4Qu1paEpIh4HTs3Mubu6Fml35B6oJEkVGKCSJFXgIVxJkipwD1SSpAoMUEmSKhjSbz4YM2ZMjh/f3f3qkqSh6KGHHlqbmT09QxoY4gE6fvx45s2bt6vLkCQNIqNHj+7uUZrb8RCuJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEovQWeccQZveMMbmD59esP5mcmsWbOYOnUqb3/723n44YdfnHfDDTcwbdo0pk2bxg033PBi+0MPPcTb3vY2pk6dyqxZs8jMft8OaTAzQKWXoL/8y7/k5ptv7nb+3LlzefTRR1mwYAGXX345n/rUpwDYsGEDs2fP5o477mDu3LnMnj2bjRs3AnDuuedy+eWXs2DBAh599FHmzp07INsiDVYGqPQSNH36dEaNGtXt/Dlz5nD88ccTEbz5zW/m6aefZvXq1cybN48ZM2YwatQoRo4cyYwZM7jzzjtZvXo1zzzzDG95y1uICI4//njmzJkzgFskDT4GqDQErVq1inHjxr043dnZyapVq1i5cuUO7StXrmTVqlV0dnbu0F8aygxQaQhqdP4yIlpul4YyA1Qagjo7O3niiSdenF65ciVjx45l3LhxO7R3dHS8uCda318aygxQaQh697vfzY033khm8sADD7DPPvswduxYDj/8cObPn8/GjRvZuHEj8+fP5/DDD2fs2LHsvffePPDAA2QmN954I0cdddSu3gxpl9pjVxcgqe+deuqp3H333axbt44DDjiAWbNm8fzzzwNwyimnMHPmTO644w6mTp3KsGHD+NrXvgbAqFGjOPfcczniiCMAOO+88168GOmSSy7hE5/4BJs3b+bII4/kyCOP3DUbJw0SMZTv5ZoyZUrOmzdvV5chSRpERo8e/WBmTuutn4dwJUmqwACVJKkCA1SSpAoMUEmSKjBAJUmqwACVJKkCA1SSpAoMUEmSKhjQAI2Id0TEDyLiiYjIiDi5iWUOjIgfR8Sz5XKfi7qnWEfEMRGxJCKeK3++v982QpIkBn4PdG/gEeCTwLO9dY6IfYA7gDXAm4GzgPOAc2r6HALcBHwHOKj8eXNE/ElfFy9JUpcBfRZuZs4B5gBExLVNLPJBYDhwUmY+CzwSEZOAcyLisiyeQ3g2MD8zLyqXuSgiDivbT+jrbZAkCQb/OdBDgJ+U4dnlNqATeF1Nn9vrlrsNmN7v1UmShqzB/jaWscCv69rW1Mx7rPy5pkGfhi8rjIjTgNMAOjo6WLhwIVC8H3H48OEsW7YMgBEjRjBx4kQWLVoEQFtbG5MnT2bp0qVs2rQJgEmTJrF+/XqumPumndpISdLOO/+9y1i+fDkA7e3ttLe3s2TJEgCGDRvGpEmTWLx4MVu3bgVg8uTJrFixgg0bNgAwceJEtmzZ0vT6BnuAAtS/LiYatDfq0/A1M5l5NXA1FG9jOfjgg7eb39v0/vvvv930uHHjuqtbkjSAxowZw5gxY7Zrq/8//MADD9xuesKECUyYMKHS+gb7IdzV7Lgn+ary55pe+tTvlUqS1GcGe4DeCxwaEXvVtM0EVgKP1/SZWbfcTOCefq9OkjRkDfR9oHtHxEERcVC57vHl9Phy/pcj4s6aRf4Z+B1wbUS8KSKOBmYBXVfgAlwBHB4RF0TEGyPiAuAw4CsDtmGSpCFnoPdApwGLys8w4MLy+xfL+R3Afl2dM/Mpir3JTmAB8HXgUuCymj73AMcDJwE/A04EjsvM+/p5WyRJQ9hA3wf6f/n9RUCN5p/coG0x8I5exv0u8N2dLE+SpKYN9nOgkiQNSgaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVIEBKklSBQaoJEkVGKCSJFVggEqSVEFLARoRx0bEn9ZMfy4ifh0Rt0VER9+XJ0nS4NTqHugXur5ExMHAZ4C/A14OXNp3ZUmSNLi1GqCvBZaW398P/K/MnA2cAxzRzAAR8fGIeCwiNkfEgxFxaA99r42IbPDZVNNnRjd93tjitkmS1LRWA3Qz8Mry+xHA3PL7UzXt3YqI44ArgIuBKcA9wK0RMb6bRT4JdNR9fgn8S4O+B9T1+0XvmyNJUjV7tNj/J8ClEfFTYBrwgbL9DcCvmlj+HODazLymnD4zIt4FfAy4oL5zZj5FEc4ARMTbgInAXzUY+zeZubbZDZEkaWe0GqBnAH9PEZynZ+bKsv3dwG09LRgRewJTgUvqZt0OTG9y/R8Ffp6Z9zSYtyAiXgEsAb6UmfO7qeM04DSAjo4OFi5cCEBnZyfDhw9n2bJlAIwYMYKJEyeyaNEiANra2pg8eTJLly5l06biCPKkSZNYv349MKrJ8iVJ/WXdunUsX74cgPb2dtrb21myZAkAw4YNY9KkSSxevJitW7cCMHnyZFasWMGGDRsAmDhxIlu2bGl6fZGZfbwJ3awoohN4AnhnZt5V0/454IOZuX8vy48AVgKfycwratr3Bw4DHgD2pNg7PR2YUbueRqZMmZLz5s2ruEW/9+lvGaCStKvNPmlDn4wzevToBzNzWm/9Wt0DJSL2At4L7Ad8IzM3RsR+wIbMXN/EEPWJHQ3aGvkQ0AZct91gmUv5/YVNAPdGxOuAc4EeA1SSpKpaCtCIeD3FhUN7AyOBm4GNFOcwRwKn9rD4WmAbMLau/VXAmiZW/1Hge02G9H3A8U30kySpklavwv0KxTnLVwPP1rT/gOIwarcycwvwIDCzbtZMiqtxuxURbwEmA9f01K/GQcCqJvtKktSyVg/hTgfempnbIqK2fQXQ2cTylwHXRcT9wN0U5yo7gasAIuLbAJl5Yt1yp1HclvLj+gEj4mzgceDnFOdAPwS8Dzim2Y2SJKlVLZ8DpXjqUL3x1Nxu0p3MvCkixgCfpbhX8xHgqMxcXjPOdiLilRSHY7+Yja942pPiyt5xFHvFPwfek5lzmtgWSZIqaTVAb6e4l/Mj5XRGxD7AhcC/NjNAZl4JXNnNvBkN2p6hOOfa3XizgdnNrFuSpL7SaoCeA8yPiKXAXsBNwOspLgI6to9rkyRp0GopQDNzZUQcBJwAHExxEdLVwHcy89keF5Yk6SWk5XOgZVB+s/xIkjQk9RqgEXE08H8yc2v5vVuZ+f0+q0ySpEGsmT3Q71I8/OA35ffuJMWTgiRJesnrNUAz82WNvkuSNJS1FIgR8Y6I2CF0I6ItIt7Rd2VJkjS4tbpHOR8Y3aB9ZDlPkqQhodUA7e7NKWOATTtfjiRJu4embmOJiB+UXxO4PiKeq5ndBryJXh4IL0nSS0mz94GuK38GsIHt38SyBfgpzb8pRZKk3V5TAZqZpwBExOPAJZnp4VpJ0pDW6qP8LuyvQiRJ2p008ySinwHvzMwNEbGYxhcRAZCZf9yXxUmSNFg1swf6PaDroqGenkQkSdKQ0cyTiC5s9F2SpKHMR/NJklRBM+dAezzvWctzoJKkoaLZt7FIkqQaLZ0DlSRJBc+BSpJUgfeBSpJUgfeBSpJUgfeBSpJUQUvPwu0SEfsBk8rJf8/MR/uuJEmSBr+WAjQixgD/CPwF8MLvm+OHwIczc123C0uS9BLS6lW4/wC8HjgU2Kv8vAOYgO8DlSQNIa0ewv0z4IjMvLem7e6I+K/A3L4rS5Kkwa3VPdAngUYv0/4d4OFbSdKQ0WqAfhH4SkSM62oov19azpMkaUio8jD5CcDjEfFEOT0O2Ay8iuIcqSRJL3k+TF6SpAp8mLwkSRX4MHlJkipoKUAjYs+IuDAi/iMiNkfEttpPfxUpSdJg0+oe6N8CJ1FcdfsCcB7wdYpbWD7et6VJkjR4tRqgxwKnZ+Y3gG3A/87Ms4DPAzP7ujhJkgarVgP01cCS8vtvgZHl9x8Bf9pXRUmSNNi1GqArgM7y+zKKR/sBHAI821dFSZI02LUaoLcAR5TfrwAujIjHgGvxIQqSpCGkpYfJZ+YFNd+/GxG/BqYD/5GZP+zr4iRJGqwqvVC7S2b+G/BvfVSLJEm7jZYfpBARB0fEtyNiQfm5LiIO7o/iJEkarFp9kMIHgQeADmBO+Xk1cH9EfKjvy5MkaXBq9RDuRcDfZObFtY0RcQHwJeD6vipMkqTBrNVDuO3AvzRov5nidWa9ioiPR8Rj5aMAH4yIQ3voOyMissHnjXX9jomIJRHxXPnz/S1tlSRJLWo1QOcDMxq0zwB+3NvCEXEcxe0vFwNTgHuAWyNifC+LHkBx2Ljr84uaMQ8BbgK+AxxU/rw5Iv6kt3okSaqqmRdqH10zeSvw5YiYxu+vvn0rcDTwhSbWdw5wbWZeU06fGRHvAj4GXND9YvwmM9d2M+9sYH5mXlROXxQRh5XtJzRRkyRJLav6Qu3Tyk+trwJXdjdIROwJTAUuqZt1O8W9pD1ZEBGvoHiM4Jcyc37NvEPKdde6DTijlzElSaqsmRdq99U7Q/cF2oA1de1rgCO7WWYVxd7pA8CewF8Bd0bEjMy8q+wztpsxxzYaMCJeDP+Ojg4WLlwIQGdnJ8OHD2fZsmUAjBgxgokTJ7Jo0SIA2tramDx5MkuXLmXTpk0ATJo0ifXr1wOjet96SVK/WrduHcuXLwegvb2d9vZ2liwpHt8+bNgwJk2axOLFi9m6dSsAkydPZsWKFWzYsAGAiRMnsmXLlqbXt1MPUqgo66ajQVvRMXMpsLSm6d6IeB1wLnBXbdcWxrwauBpgypQpefDB29/C2tv0/vvvv930uHHjGq1GkjTAxowZw5gxY7Zrq/8//MADD9xuesKECUyYMKHS+qo8SOE9EXFXRKyNiCcj4scRcVQTi66leAVa/Z7hq9hxD7In9wF/VDO9ug/GlCSpJa0+SOFUigfKPwqcD8wCHgNuiYgP97RsZm4BHmTH94bOpLgat1kHURza7XJvH4wpSVJLWj2Eez5wTmZ+rabtHyPiQYow/WYvy18GXBcR9wN3A6dTvB7tKoCI+DZAZp5YTp8NPA78nOIc6IeA9wHH1Ix5BXBX+TCHW4D3A4cBb29x2yRJalqrATqe4uXZ9W5lx6trd5CZN0XEGOCzFPdzPgIclZnLa8avtWc57jiK943+HHhPZs6pGfOeiDie4klIF1LsHR+Xmfe1smGSJLWi1QBdQXF4dFld+58Cy3fsvqPMvJJubnfJzBl107OB2U2M+V0a324jSVK/aDVALwG+Wr595R6KK13fTnF7yZl9XJskSYNWqy/U/kZE/Ab4FMXThwD+HTg2M/93XxcnSdJg1XSARsQeFIdq78rMW/qvJEmSBr+mb2PJzOeB7wOv7L9yJEnaPbT6IIWHgdf3RyGSJO1OWg3QLwCXRsT7IuI1ETG69tMP9UmSNCi1ehXuv5Y/v8/2z5rtevZsW18UJUnSYNdqgB7WL1VIkrSbaSpAI2I48D8pHqP3cmAucFYPL7mWJOklrdlzoBcCJ1Mcwr2B4mlEf99PNUmSNOg1ewj3aOAjmXkjQER8B7g7Itoyc1u/VSdJ0iDV7B7oa4CfdE1k5v3A8xRvUpEkachpNkDbgC11bc/T+kVIkiS9JDQbgAFcHxHP1bTtBVwTEb/rasjMv+jL4iRJGqyaDdBvNWi7vi8LkSRpd9JUgGbmKf1diCRJu5NWH+UnSZIwQCVJqsQAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqmDAAzQiPh4Rj0XE5oh4MCIO7aHv0RFxe0Q8GRHPRMR9EfEXdX1Ojohs8Nmr/7dGkjRUDWiARsRxwBXAxcAU4B7g1ogY380i7wTmAe8p+88BbmkQur8DOmo/mbm577dAkqTCHgO8vnOAazPzmnL6zIh4F/Ax4IL6zpn5ybqmCyPiPcD7gJ9s3zVX90fBkiQ1MmB7oBGxJzAVuL1u1u3A9BaGeiWwoa5tWEQsj4hfR8QPI2LKTpQqSVKvBnIPdF+gDVhT174GOLKZASLiE8AfAtfVNC8FPgw8TBGunwTujojJmfmLBmOcBpwG0NHRwcKFCwHo7Oxk+PDhLFu2DIARI0YwceJEFi1aBEBbWxuTJ09m6dKlbNq0CYBJkyaxfv16YFQz5UuS+tG6detYvnw5AO3t7bS3t7NkyRIAhg0bxqRJk1i8eDFbt24FYPLkyaxYsYING4p9sokTJ7Jly5am1xeZ2ceb0M2KIjqBJ4B3ZOZPato/D5yQmW/sZfljKILz+Mz8QQ/92oCHgPmZeVZPY06ZMiXnzZvXwlY09ulvGaCStKvNPqn+4GQ1o0ePfjAzp/XWbyAvIloLbAPG1rW/ih33SrdTE54n9hSeAJm5DVgA/FH1UiVJ6tmABWhmbgEeBGbWzZpJcTVuQxFxLHA9cHJmfre39UREAH8MrKperSRJPRvoq3AvA66LiPuBu4HTgU7gKoCI+DZAZp5YTh9Psed5LnBXRHTtvW7JzPVln88D/wb8AtgHOIsiQD82QNskSRqCBjRAM/OmiBgDfJbifs1HgKMyc3nZpf5+0NMpavxK+enyY2BG+X0kcDXFoeGngEUU51nv749tkCQJBn4PlMy8Eriym3kzepruZpm/Bv66L2qTJKlZPgtXkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKBjxAI+LjEfFYRGyOiAcj4tBe+r+z7Lc5In4ZEafv7JiSJO2sAQ3QiDgOuAK4GJgC3APcGhHju+k/AZhT9psCfBn4akQcU3VMSZL6wkDvgZ4DXJuZ12Tmv2fmmcAq4GPd9D8dWJmZZ5b9rwG+BZy7E2NKkrTTBixAI2JPYCpwe92s24Hp3Sx2SIP+twHTIuLlFceUJGmn7TGA69oXaAPW1LWvAY7sZpmxwNwG/fcox4tWx4yI04DTysnfjh49emkzxUtDwL7A2l1dhFTVP/x1nw312mY6DWSAdsm66WjQ1lv/rvbooU/DMTPzauDq3suUhpaIWJCZ03Z1HdLuYiADdC2wjWKvstar2HEPssvqbvo/D6yjCMpWx5QkaacN2DnQzNwCPAjMrJs1k+LK2UbuZcdDsTOBBZm5teKYkiTttIE+hHsZcF1E3A/cTXGVbSdwFUBEfBsgM08s+18FnBERXwG+AbwNOBk4odkxJTXNUxtSCwY0QDPzpogYA3wW6AAeAY7KzOVll/F1/R+LiKOAyyluS1kJnJWZ32thTElNKK8PkNSkyOzp+h1JktSIz8KVJKkCA1SSpAoMUEmSKjBAJUmqwACVJKkCA1SSpAoMUGkIKt9m9IaIeMWurkXaXRmg0tD0CWARcFVE/HlEjI2IttoOEbFPRLw7Il6+a0qUBjcfpCANQRFxL7CZ4mlk04EVwC3A94HFmflURJwOnJyZb911lUqDl3ug0hATEe3AVuCazDyU4t2H/wi8F7gLmBcR5wNnA/ftskKlQc49UGmIiYgO4HhgSWbeVjdvCnBqOX8U8JrMfGLgq5QGPwNUGoIiYhiQmbk5IrpeTE+W/yFExEUUL2WYsqtqlAa7gX6dmaRBIDOf7QrOrPsrOiKGA8cA/7QrapN2F+6BSkNIROwDPFMfmnV99gKOA24oX1ovqQEDVBpCIuIbwP3lZ3lmPt2gz8jM3DjgxUm7GQNUGiIi4gTgO8DTwHrgDuBHwM+AleVh3WHAjcB/y8xHdlmx0m7AAJWGiIi4BtgGzAaOBk4C9gOWAnOAO4H9gSsyc89dVae0uzBApSEgIvYAPg3sk5mzatoPAD4KfADYCxgJfCszP7JLCpV2IwaoNERExCjg1Zn5/yJiT2Br7cVEEXEccANwcGY+tKvqlHYX3sYiDRGZuQHYUH7fAhARL6P4Q3obsA+w2fCUmmOASkNYZr5QM/lK4PO7qhZpd+MhXElA8YozYFtdqErqhgEqSVIFvo1FkqQKDFBJkiowQCVJqsAAlSSpAgNUkqQKDFBJkir4/4s8euhPzvuPAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, - "execution_count": 69, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -471,7 +480,7 @@ "# Execute and get counts\n", "result = execute(qc, simulator).result()\n", "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='O indíce procurado')" + "plot_histogram(counts, title='O indíce procurado')\n" ] }, { @@ -486,7 +495,7 @@ " \n", " 3. Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. \n", " \n", - " 4. O que acontece se repetirmos o exemplo porém aplicarmos _inversão de fase_ e inversão sobre a média quatro vezes?\n", + " 4. O que acontece se repetirmos o circuito porém aplicarmos _interação de grover_ quatro vezes?\n", " \n", " 5. Fazer o exemplo para uma entrada de três qubits onde $f$ \"escolhe\" a cadeia 001\n", " 6. Crie um circuito quântico utilizando um oracle diferente. Dica:Verifique a ação de $U_f$ sobre os estados da base ( incluindo a ancila )" From 88682dfcbc4fab574b416418bab78c811890d53d Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Mon, 12 Aug 2019 23:23:17 -0300 Subject: [PATCH 28/49] Small Changes in document --- .../deutsch_jozsa-checkpoint.ipynb | 500 ++++++++++++++++++ deutsch_jozsa.ipynb | 2 +- 2 files changed, 501 insertions(+), 1 deletion(-) create mode 100644 .ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb diff --git a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb new file mode 100644 index 0000000..f2c0dd3 --- /dev/null +++ b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb @@ -0,0 +1,500 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Problema de Deutch e Deutsch-Jozsa\n", + "\n", + "## Observação dos autores\n", + "\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "\n", + "### Cronograma\n", + "- Antes de comecarmos\n", + "- Paralelismo Quântico\n", + "- Problema de Deutch\n", + "- Porta Hadamard para N qubits\n", + "- Problema de Deutch-Jozsa\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Antes de começarmos\n", + "\n", + " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", + "\n", + "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", + "\n", + "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", + "\n", + " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", + "\n", + " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Avaliando uma função\n", + "\n", + " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", + "\n", + "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", + "\n", + " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " \n", + " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", + "\n", + "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", + " \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Problema de Deutsch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", + "\n", + "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", + "\n", + "### Conceitos Iniciais:\n", + "\n", + "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", + "\n", + "### Como o algoritmo funciona:\n", + "\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", + "\n", + "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Antes de seguirmos para nosso exemplo:**\n", + "\n", + "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", + "\n", + "\n", + "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", + "\n", + "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Exemplo Teórico (1):\n", + "\n", + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 0$ e $f(1) = 1$ que claramente esse é uma função balanceada.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", + "\n", + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "\n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$\n", + "\n", + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = \n", + "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", + "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", + "\n", + "\n", + "$|\\psi_5\\rangle =$ \n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_5\\rangle =\\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$\n", + "\n", + "#### 5º Passo\n", + "\n", + "Agora nós podemos fazer a medição do nosso sistema representado por $|\\psi_5\\rangle$. \n", + "\n", + "Podemos percebe que quando medirmos o nós iremos obter ambos os estados $|10\\rangle$ e\n", + "$|11\\rangle$ com probabilidade de $\\frac{1}{2}$ cada um. Isso prova o que queriamos, que nada \n", + "mais do que, obter uma saída diferente de 00 se a nossa função for balanceada.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Porta Hadamard para N qubits\n", + "\n", + "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "\n", + "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", + "\n", + "\n", + "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", + "\n", + "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", + "\n", + "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", + "\n", + "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", + "\n", + "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", + "\n", + "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", + "\n", + "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", + "\n", + "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problema de Deutsch Jozsa\n", + "\n", + "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "\n", + "\n", + "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", + "\n", + "Desenvolvendo o último termo da igaldade ficamos com:\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo temos que se $f(x) = 0$:\n", + "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "E se $f(x) = 1$ temos:\n", + "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Portanto, podemos concluir que:\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", + "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", + "\n", + "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", + "\n", + "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "\n", + "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", + "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", + "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo na prática (1):\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "# Importing standard Qiskit libraries and configuring account\n", + "import numpy as np\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", + "from qiskit.compiler import transpile, assemble\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "# Loading your IBM Q account(s)\n", + "#provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, Aer, execute\n", + "from qiskit.tools.visualization import plot_histogram\n", + "\n", + "q = QuantumRegister(2)\n", + "c = ClassicalRegister(2)\n", + "deutsch = QuantumCircuit(q, c)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deutsch.h(q[0])\n", + "\n", + "deutsch.x(q[1])\n", + "deutsch.h(q[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deutsch.cx(q[0], q[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = \n", + "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", + "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", + "\n", + "\n", + "$|\\psi_5\\rangle =$ \n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_5\\rangle = \\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deutsch.h(q[0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deutsch.measure(q, c)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "backend = Aer.get_backend('qasm_simulator')\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Execução em uma máquina real\n", + "\n", + "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from qiskit import IBMQ \n", + "import getpass\n", + "\n", + "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Escolha um computador quântico operacional:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IBMQ.enable_account(MY_API_TOKEN)\n", + "IBMQ.backends(operational=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "backend = Aer.get_backend('ibmqx2')\n", + "\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] + } + ], + "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.6.8" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 114a873..f2c0dd3 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -492,7 +492,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.6.8" } }, "nbformat": 4, From aff8e3d24be2ef2bca37821c33f60c9fe5536452 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 08:05:42 -0300 Subject: [PATCH 29/49] ajustes --- deutsch_jozsa.ipynb | 113 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 97 insertions(+), 16 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 114a873..b645b93 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -54,7 +54,7 @@ "\n", "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", " \n", - " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", " " ] }, @@ -273,7 +273,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -291,7 +291,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -329,9 +329,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "deutsch.h(q[0])\n", "\n", @@ -356,9 +367,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "deutsch.cx(q[0], q[1])" ] @@ -392,18 +414,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "deutsch.h(q[0])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "deutsch.measure(q, c)" ] @@ -437,7 +481,6 @@ "metadata": {}, "outputs": [], "source": [ - "from qiskit import IBMQ \n", "import getpass\n", "\n", "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" @@ -452,9 +495,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\ACER\\Anaconda3\\lib\\site-packages\\qiskit\\providers\\ibmq\\ibmqfactory.py:531: DeprecationWarning: IBMQ.backends() is being deprecated. Please use IBMQ.get_provider() to retrieve a provider and AccountProvider.backends() to find its backends.\n", + " DeprecationWarning)\n" + ] + }, + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "IBMQ.enable_account(MY_API_TOKEN)\n", "IBMQ.backends(operational=True)" @@ -464,9 +529,18 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\ACER\\Anaconda3\\lib\\site-packages\\qiskit\\providers\\ibmq\\ibmqfactory.py:578: DeprecationWarning: IBMQ.get_backend() is being deprecated. Please use IBMQ.get_provider() to retrieve a provider and AccountProvider.get_backend(\"name\") to retrieve a backend.\n", + " DeprecationWarning)\n" + ] + } + ], "source": [ - "backend = Aer.get_backend('ibmqx2')\n", + "backend = IBMQ.get_backend('ibmqx4')\n", "\n", "job_sim = execute(deutsch, backend)\n", "sim_result = job_sim.result()\n", @@ -474,6 +548,13 @@ "counts = sim_result.get_counts(deutsch)\n", "plot_histogram(counts, title='Deutsch-Jozsa State')\n" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From e7be4bef69bb16631fe23ce642fa0a3dd5871550 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 08:10:51 -0300 Subject: [PATCH 30/49] =?UTF-8?q?altera=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grover.ipynb | 93 ++++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 51 deletions(-) diff --git a/grover.ipynb b/grover.ipynb index d699b05..c80ed0d 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do conjunto até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", + " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", " " ] }, @@ -62,7 +62,7 @@ " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", " $$\n", " \n", - " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancilla).\n", + " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancila).\n", " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de fase_.\n", " \n", " \n", @@ -232,6 +232,14 @@ "qc.draw()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", + " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " + ] + }, { "cell_type": "code", "execution_count": 27, @@ -259,14 +267,6 @@ "plot_histogram(counts, title='O indíce procurado')" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Considerando este resultado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", - " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -346,38 +346,36 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐     \n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├─────\n",
-       "        ├───┤       │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤┌───┐\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘└───┘└───┘└───┘└───┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────────────────────────\n",
-       "        └───┘└───┘└───┘                                   \n",
+       "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐\n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
+       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├───────────────\n",
+       "        └───┘└───┘└───┘               └───┘               \n",
        " c_0: 0 ══════════════════════════════════════════════════\n",
        "                                                          \n",
        " c_1: 0 ══════════════════════════════════════════════════\n",
        "                                                          
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 18, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "n_qubits = 2\n", - "n_ancila = 1\n", "#Inicialização dos estados\n", - "qub = QuantumRegister(n_qubits+n_ancila,'q')\n", + "qub = QuantumRegister(3,'q')\n", "cb = ClassicalRegister(2,'c')\n", "qc = QuantumCircuit(qub,cb)\n", "qc.h(qub[0])\n", @@ -387,7 +385,7 @@ "qc.h(qub[2])\n", "\n", "#Interação de grover\n", - "for i in range(int(np.floor(np.sqrt(n_qubits)))):\n", + "for i in range(int(np.ceil(np.sqrt(4)))):\n", " # Oracle\n", " qc.ccx(qub[0], qub[1], qub[2])\n", "\n", @@ -396,15 +394,8 @@ " qc.h(qub[1])\n", "\n", " #----Troca de fase\n", - " qc.x(qub[0])\n", - " qc.x(qub[1])\n", - " qc.h(qub[1])\n", - " \n", - " qc.cx(qub[0],qub[1])\n", - " \n", - " qc.h(qub[1])\n", - " qc.x(qub[0])\n", - " qc.x(qub[1])\n", + " qc.z(qub[0])\n", + " qc.z(qub[1])\n", "\n", " #--- Hadarmard\n", " qc.h(qub[0])\n", @@ -423,29 +414,29 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐┌─┐        \n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├┤M├────────\n",
-       "        ├───┤       │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤└╥┘┌───┐┌─┐\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─╫─┤ H ├┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘└───┘└───┘└───┘ ║ └───┘└╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────────────────────╫───────╫─\n",
-       "        └───┘└───┘└───┘                               ║       ║ \n",
-       " c_0: 0 ══════════════════════════════════════════════╩═══════╬═\n",
+       "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐┌─┐   \n",
+       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├┤M├───\n",
+       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤└╥┘┌─┐\n",
+       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├─╫─┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘ ║ └╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├────────────────╫──╫─\n",
+       "        └───┘└───┘└───┘               └───┘                ║  ║ \n",
+       " c_0: 0 ═══════════════════════════════════════════════════╩══╬═\n",
        "                                                              ║ \n",
        " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
        "                                                                
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 19, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } @@ -458,17 +449,17 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 69, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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f/mX7L777lx88cVrrL/sssvYa6+92HfffTnmmGN49tlnV62bN28exx57LHvuuSd77bUXzzzzDACZyXnnncd73vMe9txzT6688spe+zwaOIb2dQGS1J7m5ma+/OUvc8stt9DY2MghhxzC4Ycfzo477riqzS677MLUqVMZPnw411xzDZMnT+aaa64B4JRTTuGMM87goIMO4tVXX2W99Yo+w5QpU3juuee4//77WW+99Vi4cGGffD71b/ZAJdWtBx98kHe84x1sv/32bLDBBhx77LHcdtttq7XZb7/9GD58OAB77LEH8+fPB+BPf/oTK1eu5KCDDgLgbW9726p23//+9/nSl760KlBHjRrVWx9JA4gBKqluLViwgLe//e2rnjc2NrJgwYJ2299www28733vA+Cpp55i0003ZdKkSRxwwAF8/etfp7m5GYCnn36an/zkJxx88MF8+MMf5qmnnurZD6IByQCVVLcyc41lEdFm25tuuolp06Zx6qmnArBy5Uruu+8+zj33XH79618zZ84cpkyZAsDy5cvZcMMNmTp1KpMmTVr1GqkzDFBJdauxsZHnnntu1fP58+ezzTbbrNHuN7/5DRdddBFTpkxhww03XPXaXXbZhe23356hQ4dy5JFH8sgjj6xad/TRRwPwgQ98gD/+8Y+98Gk00BigkurWbrvtxuzZs5k7dy7Lly/nlltu4fDDD1+tzSOPPMIZZ5zBlClTVjuXudtuu/Hyyy+zaNEiAO666y7Gjx8PwBFHHMFdd90FwD333MO4ceN66RNpIPEqXEl1a+jQoVxwwQUcd9xxNDc38/GPf5wJEyZw/vnn09TUxPvf/34mT57MsmXL+NSnPgXA6NGjmTJlCkOGDOHcc8/lmGOOITPZddddmTRpEgCnn346J510Et/97ncZMWIEl1xySV9+TPVT0dY5hsGiqakpp06d2tdlSJLqyMiRIx/MzD3W1c5DuJIkVWCASpJUgQHaR7oyPdmWW27J/vvvz/7778/HPvaxNV575plnsu222/Zo/ZI02HkRUR/o6vRkw4YNW3UFYWvTpk1jyZIlvfI5JGkwswfaB7oyPdnaNDc3M3nyZM4+++yeKFuSVMMA7QNdmZ4M4I033uDggw/m0EMP5Re/+MWq5VdddRWHH354mwPNJUndy0O4faDK9GS33nrrqmWPPPIIDQ0NzJkzhw9+8IPstNNObLTRRvz0pz/l5z//eY/VLUn6XwZoH+js9GS33nrrqunJABoaGgDYfvvt2XfffXnkkUcYNmwYTz/9NLvvvjsAr732GrvvvjsPPvhgD38aSRqcPITbB7oyPdnLL7/Mm2++CcDixYu5//77GT9+PIcddhh/+tOfmD59OtOnT2f48OGGpyT1IHugfaAr05PNmjWLM844g/XWW4+33nqL0047bbWrdyVJvcOp/JzKT6U777yTr371qzQ3N/OJT3yC008/fbX1l112Gddffz1Dhw5lyy235NJLL11tvO0rr7zC3nvvzZFHHskFF1wAwFFHHcULL7zARhttBMCPf/xjb94s1bmOTuVnD1Si62NzAc4//3z22WefNbZ95ZVX0tTU1CufQ1LvMUAlVh+bC6wam1sboPvtt9+qx3vssQc33XTTqucPP/wwCxcu5JBDDuHhhx/utbr7my9ft3lfl9BtLjjxpb4uQX3Mi4gkujY296233uKss87inHPOabPt5z//efbff38uvPDCNocwSeqf7IFKdG1s7tVXX82hhx7K6NGj12h75ZVX0tjYyNKlSznxxBO58cYb+ehHP9q9xUvqEwaoRNfG5v7+97/nvvvu4+qrr2bZsmUsX76cESNGMHnyZBobGwHYeOONOe6443jooYcMUGmAMEAlVh+b29DQwC233ML3vve91dq0jM29+eabV7uStrbdlClTePjhh5k8eTIrV65kyZIlbLHFFqxYsYLbb7+dAw88sLc+kqQeZoBKdG1sbnvefPNNjjvuOFasWEFzczMHHHAAkyZN6q2PJKmHOQ7UcaBSr/Eq3IGh6pjpZ599lkmTJtHc3MyKFSs46aSTVv1BWk9jph0HKknqdl0ZM7311lvzq1/9ig033JBXX32V9773vRx++OGr5vfub2OmHcYiSeqwrtzPeIMNNlh18d3y5ct56623erf4bmaASpI6rKv3M543bx777rsvO++8M6eddtqq3if0vzHTHsLtBp7XkTRYdPV+xqNHj+buu+9mwYIFfOITn+Doo49mq6226pdjpu2BSpI6rLNjpqdMmbLa/YxbNDQ0MH78eO67775V24XVx0zXOwNUktRhXbmf8XPPPcfrr78OFPc2fuCBB9hhhx1YuXIlixcvBlg1ZnrChAm996Eq8hCuJKnDujJm+vHHH+ess84iIshMPve5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\n", "text/plain": [ "
" ] }, - "execution_count": 20, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" } @@ -480,7 +471,7 @@ "# Execute and get counts\n", "result = execute(qc, simulator).result()\n", "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='O indíce procurado')\n" + "plot_histogram(counts, title='O indíce procurado')" ] }, { @@ -495,7 +486,7 @@ " \n", " 3. Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. \n", " \n", - " 4. O que acontece se repetirmos o circuito porém aplicarmos _interação de grover_ quatro vezes?\n", + " 4. O que acontece se repetirmos o exemplo porém aplicarmos _inversão de fase_ e inversão sobre a média quatro vezes?\n", " \n", " 5. Fazer o exemplo para uma entrada de três qubits onde $f$ \"escolhe\" a cadeia 001\n", " 6. Crie um circuito quântico utilizando um oracle diferente. Dica:Verifique a ação de $U_f$ sobre os estados da base ( incluindo a ancila )" @@ -518,7 +509,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.6.8" } }, "nbformat": 4, From 639a5230113a4a7b33efbdf6dd26dd1be31f6843 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 10:08:21 -0300 Subject: [PATCH 31/49] =?UTF-8?q?-Errado=20->=20Explicar=20a=20quantidade?= =?UTF-8?q?=20de=20intera=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grover.ipynb | 179 ++++++++++++++------------------------------------- 1 file changed, 48 insertions(+), 131 deletions(-) diff --git a/grover.ipynb b/grover.ipynb index c80ed0d..0670e57 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 57, + "execution_count": 113, "metadata": {}, "outputs": [], "source": [ @@ -57,12 +57,12 @@ "metadata": {}, "source": [ "## Preparação dos estados\n", - " Considere o operador unitário $U_f$ que implementa a função(ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", + " Considere o operador unitário $U_f$ que implementa a função (ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", " $$\n", " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", " $$\n", " \n", - " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancila).\n", + " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancilla).\n", " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de fase_.\n", " \n", " \n", @@ -90,7 +90,7 @@ " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", " \n", - " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancila enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", + " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancilla enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", " \n", " Para um sistema cuja entrada tem três qubits, o estado se encontraria como a seguir:\n", " $$\n", @@ -101,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 114, "metadata": {}, "outputs": [ { @@ -120,10 +120,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 24, + "execution_count": 114, "metadata": {}, "output_type": "execute_result" } @@ -158,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 115, "metadata": {}, "outputs": [ { @@ -177,10 +177,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 25, + "execution_count": 115, "metadata": {}, "output_type": "execute_result" } @@ -199,33 +199,9 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤M├───\n",
-       "        ├───┤       │  └╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
-       "        └───┘└───┘└───┘ ║  ║ \n",
-       " c_0: 0 ════════════════╩══╬═\n",
-       "                           ║ \n",
-       " c_1: 0 ═══════════════════╩═\n",
-       "                             
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -242,21 +218,9 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAFKCAYAAACtoA4lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XmYHWWZ9/HvTRYgyNYQoWMSIIIxBAgNOER2ZoiyiERkUHBEYJAXVNAXFQdfkUVEB0FgHBiQQUCYiCA4IooCgiDLiEDYTAhLSCAkLElYMgmQhfv9oyrxpNOddFdvp9Pfz3X1lXOqnlPnrlPp8+uqeuqpyEwkSVL7rNHTBUiS1BsZoJIkVWCASpJUgQEqSVIFBqgkSRUYoJIkVWCASl0kIi6JiFMrvvbIiLin5vm6EfFURPxd51W4eoiIzSMiI6J/T9eivsUAldqoDLXHI2JBRLwUEf8RERu01j4zj8vM73TS2/8QuCAzH+ik5UnqIANUaoOI+Crwr8DXgfWBscBmwG0RMbCL33s9YGJmXtyV77OKGrpl7869SPUmBqi0CmWAnQGckJm/y8xFmTkNOJQiRP+pldddGRFnlY/3iogZEfHViHglImZFxFE1bTeKiJsi4s2IeAB4/9J5mfkmcFFEbFm2XTsizouI6RHxRkTcExFrl/PGRsR9EfF6RDwaEXutZL2mRcQpETEpIl6LiCsiYq1m9X4jIl4Criinfz4inomIuWW9Q2qWNzoibivnvRwR32z+OdQuu1kd34iIx4D5EdE/Iv4lIp6NiHllfZ+oad8vIs6NiNkRMRU4oNl6DSlrm1vW+vnWPgOpIwxQadV2AdYCbqydmJn/C9wCjGvjcjal2Ht9H/DPFKG4YTnvIuBtoBE4uvxpzbnAjmVdDcDJwLsR8T7gN8BZ5fSvATdExOCVLOszwEcpAvsDwLea1dtA8UfCsRHx98D3KP5waASmA9dCcY4WuB34HTAE2BL4w0o/jeUdRhGEG2TmYuBZYHeKz+sM4JqIaCzbfh74GNAE7AQc0mxZPwNmlHUcApwdEf/QjlqkNjFApVXbGJhdfrE3N6uc3xaLgDPLPdjfAv8LjIyIfsAngW9n5vzMfAK4qqUFRMQaFOH65cx8MTOXZOZ9mfkOxZ7wbzPzt5n5bmbeBjwI7L+Smv49M1/IzLnAdymCbKl3gdMy853MfIsibH+SmQ+X73cK8OGI2Jwi0F7KzPMy8+3MnJeZf27j5wLwb2UdbwFk5vWZObNcj58DTwNLO1AdSnE+eGnd36v5fIYBuwHfKOt4BPhP4LPtqEVqEwNUWrXZwMatnJ9rLOe3xZxmIbwAeA8wGOgPvFAzb3ory9iYYm/42RbmbQb8Y3n49vWIeJ0iTBpbaLtU8/ccUvP81cx8u+b5kNq6yj3wORR71MNaqamtausgIo6IiEdq1mMb/vaHypAW6q6tcW5mzms2/30dqE1qkQEqrdr9wDvAwbUTI2IdYD/ad6iyJa8CiylCaKnhrbSdTXGo9/0tzHsBuDozN6j5WSczv7+S927+njNrnje/VdNMipAGlq3/RsCL5Xu3VBPAfGBQzfNNW2iz7L0iYjPgMuBLwEaZuQHwBBBlk1kt1F1bY0N5SLl2/out1CZVZoBKq5CZb1Cch/tRROwbEQPKw5bXU5xru7qDy19CcX719IgYFBFbA59rpe27wE+AH5adZfpFxIcjYk3gGuDAiPhoOX2tssPO0JW8/RcjYmhENADfBH6+krYTgKMiYvvy/c4G/lx2qLoZ2DQivhIRa0Zx3erO5eseAfaPiIaI2BT4yio+knUoAvVVgLKz1TY1868DTizr3hD4l5rP5wXgPuB75fpvR3G++b9W8Z5SuxmgUhtk5jkUAXMu8CbwZ4q9rn8ozwd21JcoDue+BFxJ2eu1FV8DHgf+AsyluLxmjTI8DirrfLWs7+us/Pd8AnArMLX8Oau1hpn5B+BU4AaKvcD3A58u582j6Ex1YLkOTwN7ly+9GngUmFa+18pCmsycBJxHsef/MrAtcG9Nk8uA35fLfJhmnbsozuNuTrE3+kuK87i3rew9pSrCG2pLfVNETAOOyczbe7oWqTdyD1SSpAoMUEmSKvAQriRJFbgHKklSBQaoJEkV9Ok7H2y00UY5fHhr16tLkvqiRx55ZHZmrmwMaaCPB+jw4cO54447eroMSVIdaWhoaG0ozeV4CFeSpAoMUEmSKjBAJUmqwACVJKkCA1SSpAoMUEmSKjBAJUmqwACVJKkCA1SSpAoMUEmSKjBAJUmqwACVJKkCA1SSpAoMUEmSKjBAJUmqwACVJKkCA1SSpAoMUEmSKjBAJUmqwACVJKkCA1SSpAoMUEmSKjBApdLtt9/O3/3d37HjjjtywQUXrDD/oosuYuzYsey2226MHz+eF154Ydm8GTNmcPDBB7PzzjszduxYnn/+eQAuu+wydtxxRxoaGpgzZ063rYukrmeA9pCu+LKePn06++yzDzvttBNHH300Cxcu7Lb16e2WLFnCySefzHXXXcf999/PDTfcwJNPPrlcm+2224477riDe+65h49//OOcdtppy+Ydf/zxnHDCCfz5z3/m9ttvZ+ONNwZg55135pe//CXDhg3r1vWR1PUM0B7QVV/Wp59+OscffzwPPvggG2ywAddcc023rldv9tBDD7HFFluw+eabM3DgQA4++GBuueWW5drsvvvuDBo0CICddtqJmTNnAvDkk0+yePFi9t57bwDe8573LGu33XbbMXz48G5cE0ndxQDtAV3xZZ2Z/OlPf+Kggw4C4NOf/jS/+c1vunGterdZs2bxvve9b9nzIUOGMGvWrFbbX3PNNeyzzz4APPvss6y//vocccQR7Lnnnnz7299myZIlXV6zpJ5lgPaArviynjt3Luuvvz79+/dv0zK1vMxcYVpEtNj2uuuuY+LEiZxwwgkALF68mPvvv58zzzyTP/zhD0ybNo0JEyZ0ab2Sel7/ni6gL6ryZX3zzTcDf/uyvuuuuxg6dChHH300EyZMYL/99mvzMrWiIUOG8OKLLy57PnPmTDbddNMV2v3xj3/kvPPO4+abb2bNNddc9trtttuOzTffHIADDjiABx98sFvqltRz3APtAe39sp4wYUKLX9b9+/fngAMO4LHHHmOjjTbijTfeYPHixStdplq2ww47MHXqVKZPn87ChQu58cYb2XfffZdr89hjj3HSSScxYcIEBg8evNxrX3/9dWbPng3A3XffzciRI7u1fkndzwDtAV3xZR0R7LbbbvzqV78C4Nprr2X//ffvvpXq5fr3788555zDIYccwtixYxk/fjyjRo3i7LPPXnZ++rTTTmP+/PkcddRR7LHHHhx++OEA9OvXjzPPPJPx48ez6667AnDEEUcAcOmllzJ69GhmzpzJ7rvvzoknntgzKyip00VLhxP7iqamprzjjjt65L1vu+02vvnNb7JkyRI+85nP8NWvfpWzzz6bpqYm9ttvPz7xiU8wadIkNtlkEwCGDh267LzanXfeyamnnkpmsv3223P++eczcOBApk2bxjHHHMNrr73Gtttuy6WXXrpsz1WS1DYNDQ0PZeZOq2pngPZQgEqS6lNbA9RDuJIkVWCASpJUgQEqSWqXjgxFCvDmm28yevRoTj755GXTbrjhBnbddVd22203DjnkkF4xdrQBKklqs44ORQpw9tlns8suuyx7vnjxYk455RRuuukm7rnnHkaPHs1ll13WLevTEQaoJKnNOjIUKcAjjzzCq6++umw4UigGl8lMFixYQGYyb968XnEduwEqSWqzjgxF+u6773LqqadyxhlnLNdmwIABnHvuuey6665svfXWTJkyhc9+9rNdswKdyACVJLVZR8aNvvzyyxk3bhxDhw5drt2iRYu44ooruOuuu5g0aRKjR4/m/PPP7/ziO5lj4UqS2qwj40b/5S9/4f777+fyyy9n/vz5LFy4kHXWWYcDDzwQgC222AKA8ePHt9g5qd4YoJKkNqsdirSxsZEbb7yRH//4x8u1WToU6fXXX7/cUKS17SZMmMAjjzzCaaedxqxZs5gyZQqzZ89m44035s477+QDH/hAt61TVQaoJKnNaseNXjoU6dJxo5cORVo7bjQsPxRpSxobGzn55JM54IADGDBgAMOGDeOiiy7qrlWqzKH8HMpPklSjrUP5uQeq1dLJV23Y0yV0mnM+91pPlyCpBQZoJ/DLWpL6Hi9jkSSpAgNUkqQKDFBJkiowQCVJqsAAlVTXqt4664UXXmDvvfdmjz324MMf/jBXXHHFstecddZZbLPNNgwbNqzb1kOrHwNUUt3qyK2zNtlkE373u99x9913c9ttt3HBBRcsG/T8ox/9KLfffnu3r49WLwaopLrVkVtnDRw4cNkYrAsXLuTdd99d9poPfehDveJ2WapvBqikutWRW2cBzJgxg912241tt92WL3/5yzQ2NnZpvepbDFBJdasjt86CYgzWe+65hwcffJBrr72WV155pctqVd/jSESS6lZHbp1Vq7GxkZEjR3L//fdz0EEHdWnNvY0jqVXnHqikulV766yFCxdy4403su+++y7XZumtsyZMmLDcrbNefPFF3nrrLQBef/11HnjgAbbaaqturV+rNwNUUt2qvXXW2LFjGT9+/LJbZy3tTFR766w99tiDww8/HICnnnqKcePGsfvuu/Oxj32ML37xi2y99dbLXjN69GgWLFjA6NGj+f73v99j66jeq9tvZxYRXwC+DjQCfwW+kpl/aqXtwcBxQBOwFjAJ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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -275,7 +239,7 @@ "\n", " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", " \n", - " Agora considere que ao inves de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", + " Agora considere que ao invés de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", " \n", " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", " $$\\left[\\begin{array}{ccccc}\n", @@ -346,33 +310,9 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐\n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
-       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├───────────────\n",
-       "        └───┘└───┘└───┘               └───┘               \n",
-       " c_0: 0 ══════════════════════════════════════════════════\n",
-       "                                                          \n",
-       " c_1: 0 ══════════════════════════════════════════════════\n",
-       "                                                          
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "#Inicialização dos estados\n", "qub = QuantumRegister(3,'q')\n", @@ -384,22 +324,35 @@ "qc.x(qub[2])\n", "qc.h(qub[2])\n", "\n", - "#Interação de grover\n", - "for i in range(int(np.ceil(np.sqrt(4)))):\n", - " # Oracle\n", - " qc.ccx(qub[0], qub[1], qub[2])\n", + "#Interação de grover quantidade de interações incorreta.\n", + "#for i in range(int(np.ceil(np.sqrt(4)))):\n", "\n", - " #---Hadamard\n", - " qc.h(qub[0])\n", - " qc.h(qub[1])\n", + "# Oracle\n", "\n", - " #----Troca de fase\n", - " qc.z(qub[0])\n", - " qc.z(qub[1])\n", + "qc.cx(qub[0], qub[1])\n", + "qc.ccx(qub[0], qub[1], qub[2])\n", "\n", - " #--- Hadarmard\n", - " qc.h(qub[0])\n", - " qc.h(qub[1])\n", + "#---Hadamard\n", + "qc.h(qub[0])\n", + "qc.h(qub[1])\n", + "\n", + "#----Troca de fase\n", + "qc.x(qub[0])\n", + "qc.x(qub[1])\n", + "\n", + "qc.h(qub[1])\n", + "\n", + "qc.cx(qub[0], qub[1])\n", + "\n", + "qc.h(qub[1])\n", + "\n", + "qc.x(qub[0])\n", + "qc.x(qub[1]) \n", + "\n", + "#--- Hadarmard\n", + "qc.h(qub[0])\n", + "qc.h(qub[1])\n", + "qc.h(qub[2])\n", "\n", "qc.draw()" ] @@ -414,33 +367,9 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├┤M├───\n",
-       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤└╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├─╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├────────────────╫──╫─\n",
-       "        └───┘└───┘└───┘               └───┘                ║  ║ \n",
-       " c_0: 0 ═══════════════════════════════════════════════════╩══╬═\n",
-       "                                                              ║ \n",
-       " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
-       "                                                                
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -449,21 +378,9 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdAAAAFKCAYAAACtoA4lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XuYXWV59/HvTcIhiZwCAWYMAWNoCAphAMtBzghFEKSIKFqDtsoLKsJLVaqvGEDEFsRCKQhSEITGAopVUYRiqsihoBACmBgOIYGQgEmAEMIhyXC/f6w16c5kJplZc9oz8/1c11zZe61nr33vWZn5zbPWep4VmYkkSeqc9fq6AEmS+iMDVJKkCgxQSZIqMEAlSarAAJUkqQIDVJKkCgxQqYdExBURcVbF134yIu6ueb5xRDweEX/ZfRUODBGxfURkRAzt61o0uBigUgeVofZoRLwWEc9HxHcjYrP22mfmyZn5jW56++8AF2fmA920PUldZIBKHRARfw/8E/AlYFNgL2A74L8iYoMefu9NgGmZeXlPvs86auiV3p29SPUnBqi0DmWAnQOcmpm/yswVmTkHOJ4iRP+mndddGxHnlY8PjIh5EfH3EfHniFgQEZ+qabtFRPwsIl6JiAeAd7asy8xXgMsiYlzZdlhEXBQRcyNiSUTcHRHDynV7RcS9EfFyREyPiAPX8rnmRMRXImJGRLwUEd+PiI1a1XtmRDwPfL9c/pmIeDIiXizrbazZ3rsi4r/KdS9ExFdbfx9qt92qjjMj4hFgWUQMjYh/iIinImJpWd9f17QfEhHfjohFETEbOLLV52osa3uxrPUz7X0PpK4wQKV12wfYCLildmFmvgrcBhzawe1sQ9F7fTvwdxShuHm57jLgDaAB+Nvyqz3fBnYv6xoJfBl4KyLeDvwCOK9c/kXgxxExai3b+jjwVxSB/RfA11rVO5Lij4STIuJg4FsUfzg0AHOB/4DiHC1wJ/AroBEYB/x6rd+N1Z1AEYSbZeZK4ClgP4rv1znADRHRULb9DPABoAnYAziu1bZ+CMwr6zgOOD8iDulELVKHGKDSum0JLCp/sbe2oFzfESuAc8se7C+BV4HxETEE+BDw9cxclpmPAde1tYGIWI8iXE/LzOcyszkz783MNyl6wr/MzF9m5luZ+V/AH4Aj1lLTv2bms5n5IvBNiiBr8RYwOTPfzMzXKcL2msx8qHy/rwB7R8T2FIH2fGZelJlvZObSzLy/g98XgH8p63gdIDNvzsz55ee4EXgCaLmA6niK88EtdX+r5vuzLbAvcGZZx8PAvwGf6EQtUocYoNK6LQK2bOf8XEO5viMWtwrh14C3AaOAocCzNevmtrONLSl6w0+1sW474MPl4duXI+JlijBpaKNti9bv2VjzfGFmvlHzvLG2rrIHvpiiR71tOzV1VG0dRMSkiHi45nO8m//9Q6Wxjbpra3wxM5e2Wv/2LtQmtckAldbtPuBN4NjahRExAng/nTtU2ZaFwEqKEGoxpp22iygO9b6zjXXPAtdn5mY1XyMy8x/X8t6t33N+zfPWt2qaTxHSwKrPvwXwXPnebdUEsAwYXvN8mzbarHqviNgOuAr4PLBFZm4GPAZE2WRBG3XX1jiyPKRcu/65dmqTKjNApXXIzCUU5+EujYjDI2L98rDlzRTn2q7v4vabKc6vnh0RwyNiJ+DEdtq+BVwDfKe8WGZIROwdERsCNwBHRcRflcs3Ki/YGb2Wt/9cRIyOiJHAV4Eb19J2CvCpiNi1fL/zgfvLC6puBbaJiNMjYsMoxq3uWb7uYeCIiBgZEdsAp6/jWzKCIlAXApQXW727Zv1NwBfKujcH/qHm+/MscC/wrfLz70Jxvvnf1/GeUqcZoFIHZOYFFAHzbeAV4H6KXtch5fnArvo8xeHc54FrKa96bccXgUeB3wMvUgyvWa8Mjw+WdS4s6/sSa/85nwLcAcwuv85rr2Fm/ho4C/gxRS/wncBHy3VLKS6mOqr8DE8AB5UvvR6YDswp32ttIU1mzgAuouj5vwDsDNxT0+Qq4PZymw/R6uIuivO421P0Rn9CcR73v9b2nlIV4Q21pcEpIuYAn87MO/u6Fqk/sgcqSVIFBqgkSRV4CFeSpArsgUqSVIEBKklSBYP6zgdbbLFFjhnT3nh1SdJg9PDDDy/KzLXNIQ0M8gAdM2YMU6dO7esyJEl1ZOTIke1NpbkaD+FKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqCRJFRigkiRVYIBKklSBASpJUgUGqKS6duedd/KXf/mX7L777lx88cVrrL/sssvYa6+92HfffTnmmGN49tlnV62bN28exx57LHvuuSd77bUXzzzzDACZyXnnncd73vMe9txzT6688spe+zwaOIb2dQGS1J7m5ma+/OUvc8stt9DY2MghhxzC4Ycfzo477riqzS677MLUqVMZPnw411xzDZMnT+aaa64B4JRTTuGMM87goIMO4tVXX2W99Yo+w5QpU3juuee4//77WW+99Vi4cGGffD71b/ZAJdWtBx98kHe84x1sv/32bLDBBhx77LHcdtttq7XZb7/9GD58OAB77LEH8+fPB+BPf/oTK1eu5KCDDgLgbW9726p23//+9/nSl760KlBHjRrVWx9JA4gBKqluLViwgLe//e2rnjc2NrJgwYJ2299www28733vA+Cpp55i0003ZdKkSRxwwAF8/etfp7m5GYCnn36an/zkJxx88MF8+MMf5qmnnurZD6IByQCVVLcyc41lEdFm25tuuolp06Zx6qmnArBy5Uruu+8+zj33XH79618zZ84cpkyZAsDy5cvZcMMNmTp1KpMmTVr1GqkzDFBJdauxsZHnnntu1fP58+ezzTbbrNHuN7/5DRdddBFTpkxhww03XPXaXXbZhe23356hQ4dy5JFH8sgjj6xad/TRRwPwgQ98gD/+8Y+98Gk00BigkurWbrvtxuzZs5k7dy7Lly/nlltu4fDDD1+tzSOPPMIZZ5zBlClTVjuXudtuu/Hyyy+zaNEiAO666y7Gjx8PwBFHHMFdd90FwD333MO4ceN66RNpIPEqXEl1a+jQoVxwwQUcd9xxNDc38/GPf5wJEyZw/vnn09TUxPvf/34mT57MsmXL+NSnPgXA6NGjmTJlCkOGDOHcc8/lmGOOITPZddddmTRpEgCnn346J510Et/97ncZMWIEl1xySV9+TPVT0dY5hsGiqakpp06d2tdlSJLqyMiRIx/MzD3W1c5DuJIkVWCASpJUgQHaR7oyPdmWW27J/vvvz/7778/HPvaxNV575plnsu222/Zo/ZI02HkRUR/o6vRkw4YNW3UFYWvTpk1jyZIlvfI5JGkwswfaB7oyPdnaNDc3M3nyZM4+++yeKFuSVMMA7QNdmZ4M4I033uDggw/m0EMP5Re/+MWq5VdddRWHH354mwPNJUndy0O4faDK9GS33nrrqmWPPPIIDQ0NzJkzhw9+8IPstNNObLTRRvz0pz/l5z//eY/VLUn6XwZoH+js9GS33nrrqunJABoaGgDYfvvt2XfffXnkkUcYNmwYTz/9NLvvvjsAr732GrvvvjsPPvhgD38aSRqcPITbB7oyPdnLL7/Mm2++CcDixYu5//77GT9+PIcddhh/+tOfmD59OtOnT2f48OGGpyT1IHugfaAr05PNmjWLM844g/XWW4+33nqL0047bbWrdyVJvcOp/JzKT6U777yTr371qzQ3N/OJT3yC008/fbX1l112Gddffz1Dhw5lyy235NJLL11tvO0rr7zC3nvvzZFHHskFF1wAwFFHHcULL7zARhttBMCPf/xjb94s1bmOTuVnD1Si62NzAc4//3z22WefNbZ95ZVX0tTU1CufQ1LvMUAlVh+bC6wam1sboPvtt9+qx3vssQc33XTTqucPP/wwCxcu5JBDDuHhhx/utbr7my9ft3lfl9BtLjjxpb4uQX3Mi4gkujY296233uKss87inHPOabPt5z//efbff38uvPDCNocwSeqf7IFKdG1s7tVXX82hhx7K6NGj12h75ZVX0tjYyNKlSznxxBO58cYb+ehHP9q9xUvqEwaoRNfG5v7+97/nvvvu4+qrr2bZsmUsX76cESNGMHnyZBobGwHYeOONOe6443jooYcMUGmAMEAlVh+b29DQwC233ML3vve91dq0jM29+eabV7uStrbdlClTePjhh5k8eTIrV65kyZIlbLHFFqxYsYLbb7+dAw88sLc+kqQeZoBKdG1sbnvefPNNjjvuOFasWEFzczMHHHAAkyZN6q2PJKmHOQ7UcaBSr/Eq3IGh6pjpZ599lkmTJtHc3MyKFSs46aSTVv1BWk9jph0HKknqdl0ZM7311lvzq1/9ig033JBXX32V9773vRx++OGr5vfub2OmHcYiSeqwrtzPeIMNNlh18d3y5ct56623erf4bmaASpI6rKv3M543bx777rsvO++8M6eddtqq3if0vzHTHsLtBp7XkTRYdPV+xqNHj+buu+9mwYIFfOITn+Doo49mq6226pdjpu2BSpI6rLNjpqdMmbLa/YxbNDQ0MH78eO67775V24XVx0zXOwNUktRhXbmf8XPPPcfrr78OFPc2fuCBB9hhhx1YuXIlixcvBlg1ZnrChAm996Eq8hCuJKnDujJm+vHHH+ess84iIshMPve5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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -509,7 +426,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.7.3" } }, "nbformat": 4, From fa745742a6b92c835a5a5d67b32110683a33a288 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 10:08:52 -0300 Subject: [PATCH 32/49] =?UTF-8?q?Explicar=20a=20quantidade=20de=20itera?= =?UTF-8?q?=C3=A7=C3=B5es=20(estava=20errada=20n=C3=A3o=20=C3=A9=20\sqrt(N?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grover.ipynb | 117 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 106 insertions(+), 11 deletions(-) diff --git a/grover.ipynb b/grover.ipynb index 0670e57..dd779e2 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -199,9 +199,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 116, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐          ┌─┐   \n",
+       "q_0: |0>┤ H ├───────■──┤M├───\n",
+       "        ├───┤       │  └╥┘┌─┐\n",
+       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
+       "        └───┘└───┘└───┘ ║  ║ \n",
+       " c_0: 0 ════════════════╩══╬═\n",
+       "                           ║ \n",
+       " c_1: 0 ═══════════════════╩═\n",
+       "                             
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -218,9 +242,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 117, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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kEsvvfQ1y6+44goOOuggDj30UN7//vfz1FNPtS/baaedmDBhAhMmTOBDH/pQ+/w777yTww8/nAkTJnDMMccwd+7cXnkv/Yn9okYSmdnXNfSZlpaWnDp1al+XoQbQ2trKW97yFqZMmcKIESM48sgjufrqq9lrr73a29x9990ceOCBDBkyhEmTJnHPPfcwadIkAHbddde1vqzbvOUtb+GGG25gzJgxXHPNNTzwwANcccUVvfa+NnX2i/pCU1PTtMwc39kytzQlYNq0aeyxxx7svvvuDB48mIkTJ3Lbbbet1eawww5jyJAhAIwfP56FCxeud70RwYoVKwBYvnw5O++8c/cX34/ZL2o0m/d1AVIjWLRoEW94wxvap0eMGMG0adO6bH/DDTfwjne8o336lVde4e1vfzuDBg3irLPO4j3veQ8Al112GSeeeCJbbbUVQ4cO5fbbb++5N9EP2S9qNIamBHR2mCIiOm170003MX36dG699db2eQ8//DDNzc3MmzeP973vfey9997ssccefOMb3+DGG29k/PjxfP3rX+fzn/88X//613vsffQ39osajbtnJYotmKeffrp9euHChZ3usvvlL3/JJZdcwuTJk9lyyy3b5zc3NwOw++67c+ihh/Lwww+zZMkSZsyYwfjxxaGRiRMncv/99/fwO+lf7Bc1GkNTAg444ADmzp3L/PnzWbVqFVOmTOHoo49eq83DDz/M2WefzeTJkxk2bFj7/BdeeIFXX30VgKVLl/LrX/+aMWPGsP3227N8+XLmzJkDwC9+8Qve9KY39d6b6gfsFzUad89KwOabb85FF13E8ccfT2trKx/+8IcZO3YsF154IS0tLRxzzDGcf/75rFy5klNPPRWAXXbZhcmTJzN79mzOPvtsNttsM9asWcOZZ57ZfnbnpZdeysknn8xmm23G9ttvz+WXX96Xb3OTY7+o0XjJiZecSJJqeMmJJEndwNDsIxszygkU15bts88+nHPOOQCsWLGifeSTCRMmMHr0aM4999xeeS+SNFAYmn2gtbWVc845h5tuuon77ruPW265hd///vdrtXnzm9/M1KlTueeee3jve9/L+eefv9byCy+8kEMOOaR9eujQodx1113tP7vuuivHHntsr7wfSRooDM0+sLGjnDz44IMsXryYI444otP1P/744yxevJiDDz64596EJA1AhmYf6GyUk0WLFnXZvnaUkzVr1nDeeedxwQUXdNn+lltu4QMf+ECXF4FLkjaMl5z0gY0Z5eSaa67hqKOOYpddduly/VOmTOGqq67qnmIlSe0MzT5Q7ygnt956a/soJ7/5zW+47777uOaaa1i5ciWrVq1im222aT/mOWPGDFpbW9l///17581I0gBiaPaB2lFOmpubmTJlCt/61rfWatM2ysnNN9+81ignte0mT57Mgw8+uNZJQrfccgsTJ07s+TchSQOQodkHNmaUk/X54Q9/yI033tjTb0GSBiRHBHJEIElSDUcEkiR1mw0dnOWpp57iiCOOYMKECRx88MF8+9vfBjatwVncPStJqqxtcJYpU6YwYsQIjjzySI4++uj2wfDhT4OzDBkyhEmTJnH++eczadIkhg8fzs9+9jO23HJL/vCHP/DWt76Vo48+mubmZu6666725x9xxBENOziLoal+6ZzrdujrErrNRSc/39cldBv7ZdNXOzgL0D44S21oHnbYYe2Px48fz0033QTA4MGD2+evWrWKNWvWvGb9jT44i7tnJUmVbczgLAALFizg0EMPZb/99uPMM89sv1F4m0YfnMXQlCRVtiGDs5xxxhnt83bZZRfuuecefvvb3/K9732P5557bq3nTJkyheOOO657i+5GhqYkqbJ6B2eZPHly++AstZqbmxkzZgz33Xdf+7xNYXAWQ1OSVFnt4CyrVq1iypQpHH300Wu1aRucZfLkyWsNzvL000/z8ssvA/DCCy9w//33s+eee7Yv3xQGZ/FEIElSZRszOMujjz7KeeedR0SQmXzyk59k7733bl/3pjA4i4MbOLhBv+RZmo3JftGmwMENJEnqBoamJEkVeUyzG7jLSZIGBrc0JUmqyNCUJKmiXg/NiPhERDwREa9ExLSIOGwdbSdGxO0RsTgiVkTEryPivetof1JEZETc2jPVS5IGsl4NzYg4EbgMuBBoAe4FbouIkV085W3AVOA9ZfufAj/oLGgjYhTwVeDuHihdkqRe39I8G7g2M6/OzFmZeQawCPh4Z40z88zM/NfMvD8z52TmBcA04P217SJiC+C7wP8D5vbsW5AkDVS9dvZsRAwGDgQu7rDoduCQOlY1FOh4iueXgXmZeV1EHLGeOk4DToNi7MMHHngAKMZTHDJkCHPmzAFgu+22Y9SoUUyfPh2AQYMGMW7cOGbP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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -310,9 +346,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 118, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐     \n",
+       "q_0: |0>┤ H ├──■────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├─────\n",
+       "        ├───┤┌─┴─┐  │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤┌───┐\n",
+       "q_1: |0>┤ H ├┤ X ├──■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├\n",
+       "        ├───┤├───┤┌─┴─┐├───┤└───┘└───┘└───┘└───┘└───┘└───┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├┤ H ├──────────────────────────────\n",
+       "        └───┘└───┘└───┘└───┘                              \n",
+       " c_0: 0 ══════════════════════════════════════════════════\n",
+       "                                                          \n",
+       " c_1: 0 ══════════════════════════════════════════════════\n",
+       "                                                          
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 118, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#Inicialização dos estados\n", "qub = QuantumRegister(3,'q')\n", @@ -329,7 +389,6 @@ "\n", "# Oracle\n", "\n", - "qc.cx(qub[0], qub[1])\n", "qc.ccx(qub[0], qub[1], qub[2])\n", "\n", "#---Hadamard\n", @@ -367,9 +426,33 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 119, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐┌─┐        \n",
+       "q_0: |0>┤ H ├──■────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├┤M├────────\n",
+       "        ├───┤┌─┴─┐  │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤└╥┘┌───┐┌─┐\n",
+       "q_1: |0>┤ H ├┤ X ├──■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─╫─┤ H ├┤M├\n",
+       "        ├───┤├───┤┌─┴─┐├───┤└───┘└───┘└───┘└───┘└───┘ ║ └───┘└╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├┤ H ├──────────────────────────╫───────╫─\n",
+       "        └───┘└───┘└───┘└───┘                          ║       ║ \n",
+       " c_0: 0 ══════════════════════════════════════════════╩═══════╬═\n",
+       "                                                              ║ \n",
+       " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
+       "                                                                
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -378,9 +461,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 120, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", From f025800dbf12a16c57c1919dfa701980ed0a6841 Mon Sep 17 00:00:00 2001 From: Tiago de Lima <33109618+Tiagoblima@users.noreply.github.com> Date: Tue, 13 Aug 2019 14:02:28 -0300 Subject: [PATCH 33/49] Add files via upload --- deutsch_jozsa.ipynb | 1244 +++++++++++++++++++++++-------------------- 1 file changed, 679 insertions(+), 565 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index b645b93..7ed6e15 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -1,581 +1,695 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# Problema de Deutch e Deutsch-Jozsa\n", - "\n", - "## Observação dos autores\n", - "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", - "\n", - "### Cronograma\n", - "- Antes de comecarmos\n", - "- Paralelismo Quântico\n", - "- Problema de Deutch\n", - "- Porta Hadamard para N qubits\n", - "- Problema de Deutch-Jozsa\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Antes de começarmos\n", - "\n", - " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", - "\n", - "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", - "\n", - "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", - "\n", - " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", - "\n", - " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Avaliando uma função\n", - "\n", - " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", - "\n", - "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", - "\n", - " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", - " \n", - " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", - "\n", - "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", - " \n", - " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Problema de Deutsch\n", - "\n", - "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", - "\n", - "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", - "\n", - "### Conceitos Iniciais:\n", - "\n", - "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", - "\n", - "### Como o algoritmo funciona:\n", - "\n", - "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", - "\n", - "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", - "\n", - "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Antes de seguirmos para nosso exemplo:**\n", - "\n", - "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", - "\n", - "\n", - "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", - "\n", - "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### Exemplo Teórico (1):\n", - "\n", - "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", - "\n", - "Suponha que temos uma função $f$ em que $f(0) = 0$ e $f(1) = 1$ que claramente esse é uma função balanceada.\n", - "\n", - "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", - "\n", - "#### 1º Passo:\n", - "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", - "\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", - "\n", - "#### 2º Passo:\n", - "\n", - "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", - "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", - "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", - "\n", - "\n", - "#### 3º Passo:\n", - "\n", - "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", - "\n", - "\n", - "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", - "\n", - "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$\n", - "\n", - "#### 4º Passo:\n", - "\n", - "Agora basta aplicarmos o Hadarmad ao estado atual \n", - "\n", - "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", - "\n", - "\n", - "$|\\psi_5\\rangle = \n", - "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", - "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", - "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", - "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", - "\n", - "\n", - "$|\\psi_5\\rangle =$ \n", - "\n", - "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", - "\n", - "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", - "\n", - "$|\\psi_5\\rangle =\\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$\n", - "\n", - "#### 5º Passo\n", - "\n", - "Agora nós podemos fazer a medição do nosso sistema representado por $|\\psi_5\\rangle$. \n", - "\n", - "Podemos percebe que quando medirmos o nós iremos obter ambos os estados $|10\\rangle$ e\n", - "$|11\\rangle$ com probabilidade de $\\frac{1}{2}$ cada um. Isso prova o que queriamos, que nada \n", - "mais do que, obter uma saída diferente de 00 se a nossa função for balanceada.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Porta Hadamard para N qubits\n", - "\n", - "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", - "\n", - "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", - "\n", - "\n", - "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", - "\n", - "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", - "\n", - "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", - "\n", - "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", - "\n", - "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", - "\n", - "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", - "\n", - "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", - "\n", - "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problema de Deutsch Jozsa\n", - "\n", - "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", - "\n", - "\n", - "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", - "\n", - "Desenvolvendo o último termo da igaldade ficamos com:\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo temos que se $f(x) = 0$:\n", - "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "E se $f(x) = 1$ temos:\n", - "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Portanto, podemos concluir que:\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", - "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", - "\n", - "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", - "\n", - "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", - "\n", - "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", - "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", - "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exemplo na prática (1):\n", - "\n", - "#### 1º Passo:\n", - "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", - "\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "# Importing standard Qiskit libraries and configuring account\n", - "import numpy as np\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", - "from qiskit.compiler import transpile, assemble\n", - "from qiskit.tools.jupyter import *\n", - "from qiskit.visualization import *\n", - "# Loading your IBM Q account(s)\n", - "#provider = IBMQ.load_account()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, Aer, execute\n", - "from qiskit.tools.visualization import plot_histogram\n", - "\n", - "q = QuantumRegister(2)\n", - "c = ClassicalRegister(2)\n", - "deutsch = QuantumCircuit(q, c)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2º Passo:\n", - "\n", - "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", - "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", - "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", - "\n", - "\n" - ] + "nbformat": 4, + "nbformat_minor": 0, + "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.7.3" + }, + "colab": { + "name": "deutsch_jozsa.ipynb", + "version": "0.3.2", + "provenance": [] + } }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ + "cells": [ { - "data": { - "text/plain": [ - "" + "cell_type": "markdown", + "metadata": { + "id": "Wyq5GSe00-zz", + "colab_type": "text" + }, + "source": [ + "\n", + "# Problema de Deutch e Deutsch-Jozsa\n", + "\n", + "## Observação dos autores\n", + "\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "\n", + "### Cronograma\n", + "- Antes de comecarmos\n", + "- Paralelismo Quântico\n", + "- Problema de Deutch\n", + "- Porta Hadamard para N qubits\n", + "- Problema de Deutch-Jozsa\n" ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deutsch.h(q[0])\n", - "\n", - "deutsch.x(q[1])\n", - "deutsch.h(q[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "#### 3º Passo:\n", - "\n", - "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", - "\n", - "\n", - "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", - "\n", - "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "" + "cell_type": "markdown", + "metadata": { + "id": "qez2OAF20-z1", + "colab_type": "text" + }, + "source": [ + "# Antes de começarmos\n", + "\n", + " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", + "\n", + "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", + "\n", + "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", + "\n", + " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", + "\n", + " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", + "\n" ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deutsch.cx(q[0], q[1])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4º Passo:\n", - "\n", - "Agora basta aplicarmos o Hadarmad ao estado atual \n", - "\n", - "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", - "\n", - "\n", - "$|\\psi_5\\rangle = \n", - "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", - "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", - "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", - "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", - "\n", - "\n", - "$|\\psi_5\\rangle =$ \n", - "\n", - "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", - "\n", - "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", - "\n", - "$|\\psi_5\\rangle = \\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "" + "cell_type": "markdown", + "metadata": { + "id": "7OchLNAJ0-z2", + "colab_type": "text" + }, + "source": [ + "\n", + "## Avaliando uma função\n", + "\n", + " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", + "\n", + "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", + "\n", + " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " \n", + " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", + "\n", + "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", + " \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " " ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deutsch.h(q[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ + }, { - "data": { - "text/plain": [ - "" + "cell_type": "markdown", + "metadata": { + "id": "ZQX9PXmv0-z2", + "colab_type": "text" + }, + "source": [ + "# Problema de Deutsch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", + "\n", + "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", + "\n", + "### Conceitos Iniciais:\n", + "\n", + "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", + "\n", + "### Como o algoritmo funciona:\n", + "\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", + "\n", + "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", + "\n", + "\n", + "\n" ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deutsch.measure(q, c)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "backend = Aer.get_backend('qasm_simulator')\n", - "job_sim = execute(deutsch, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Execução em uma máquina real\n", - "\n", - "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import getpass\n", - "\n", - "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Escolha um computador quântico operacional:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WIZ35iPF0-z3", + "colab_type": "text" + }, + "source": [ + "**Antes de seguirmos para nosso exemplo:**\n", + "\n", + "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", + "\n", + "\n", + "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", + "\n", + "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" + ] + }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\ACER\\Anaconda3\\lib\\site-packages\\qiskit\\providers\\ibmq\\ibmqfactory.py:531: DeprecationWarning: IBMQ.backends() is being deprecated. Please use IBMQ.get_provider() to retrieve a provider and AccountProvider.backends() to find its backends.\n", - " DeprecationWarning)\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "6ssJ068G0-z4", + "colab_type": "text" + }, + "source": [ + "\n", + "### Exemplo Teórico (1):\n", + "\n", + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 0$ e $f(1) = 1$ que claramente esse é uma função balanceada.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", + "\n", + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "\n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$\n", + "\n", + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = \n", + "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", + "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", + "\n", + "\n", + "$|\\psi_5\\rangle =$ \n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_5\\rangle =\\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$\n", + "\n", + "#### 5º Passo\n", + "\n", + "Agora nós podemos fazer a medição do nosso sistema representado por $|\\psi_5\\rangle$. \n", + "\n", + "Podemos percebe que quando medirmos o nós iremos obter ambos os estados $|10\\rangle$ e\n", + "$|11\\rangle$ com probabilidade de $\\frac{1}{2}$ cada um. Isso prova o que queriamos, que nada \n", + "mais do que, obter uma saída diferente de 00 se a nossa função for balanceada.\n", + "\n", + "\n", + "\n" + ] }, { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ]" + "cell_type": "markdown", + "metadata": { + "id": "k0hAHaBl0-z5", + "colab_type": "text" + }, + "source": [ + "## Porta Hadamard para N qubits\n", + "\n", + "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "\n", + "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", + "\n", + "\n", + "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", + "\n", + "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", + "\n", + "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", + "\n", + "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", + "\n", + "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", + "\n", + "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", + "\n", + "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", + "\n", + "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "IBMQ.enable_account(MY_API_TOKEN)\n", - "IBMQ.backends(operational=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ + }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\ACER\\Anaconda3\\lib\\site-packages\\qiskit\\providers\\ibmq\\ibmqfactory.py:578: DeprecationWarning: IBMQ.get_backend() is being deprecated. Please use IBMQ.get_provider() to retrieve a provider and AccountProvider.get_backend(\"name\") to retrieve a backend.\n", - " DeprecationWarning)\n" - ] + "cell_type": "markdown", + "metadata": { + "id": "grdH81v50-z5", + "colab_type": "text" + }, + "source": [ + "## Problema de Deutsch Jozsa\n", + "\n", + "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "\n", + "\n", + "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", + "\n", + "Desenvolvendo o último termo da igaldade ficamos com:\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo temos que se $f(x) = 0$:\n", + "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "E se $f(x) = 1$ temos:\n", + "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Portanto, podemos concluir que:\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", + "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", + "\n", + "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", + "\n", + "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "\n", + "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", + "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", + "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8kx_S9ma0-z6", + "colab_type": "text" + }, + "source": [ + "## Exemplo na prática (1):\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "G7Qi5gpI0-z7", + "colab_type": "code", + "colab": {} + }, + "source": [ + "%matplotlib inline\n", + "# Importing standard Qiskit libraries and configuring account\n", + "import numpy as np\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", + "from qiskit.compiler import transpile, assemble\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "# Loading your IBM Q account(s)\n", + "#provider = IBMQ.load_account()" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "f_qVgKeo0-z-", + "colab_type": "code", + "colab": {} + }, + "source": [ + "\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, Aer, execute\n", + "from qiskit.tools.visualization import plot_histogram\n", + "\n", + "q = QuantumRegister(2)\n", + "c = ClassicalRegister(2)\n", + "deutsch = QuantumCircuit(q, c)\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bVJ3nNyv0-0A", + "colab_type": "text" + }, + "source": [ + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "t9uCxnjM0-0B", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "2dd6dc53-579d-421f-f5f4-8b5bbbee3ab2" + }, + "source": [ + "\n", + "\n", + "deutsch.x(q[1])\n", + "\n", + "deutsch.barrier()\n", + "\n", + "deutsch.h(q[0])\n", + "deutsch.h(q[1])" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 3 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "V2XfOWY90-0F", + "colab_type": "text" + }, + "source": [ + "\n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "AuqlLDGb0-0G", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "6ec32032-980d-41ea-afe9-97a16caa08c0" + }, + "source": [ + "deutsch.barrier()\n", + "\n", + "deutsch.cx(q[0], q[1])\n", + "\n", + "deutsch.barrier()" + ], + "execution_count": 4, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "KhBke-Ic0-0I", + "colab_type": "text" + }, + "source": [ + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = \n", + "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", + "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", + "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", + "\n", + "\n", + "$|\\psi_5\\rangle =$ \n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_5\\rangle = \\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "piMOzgtC0-0J", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "84290b41-f4a0-4458-a2ff-5099e0117610" + }, + "source": [ + "deutsch.h(q[0])\n", + "deutsch.h(q[1])" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "5nk9lPFy0-0M", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 + }, + "outputId": "0cb7c74c-afe3-4f92-b365-d042657e676a" + }, + "source": [ + "deutsch.draw()\n", + "deutsch.measure(q, c)" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 6 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xseid-Rs0-0O", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 347 + }, + "outputId": "954eabac-1797-4dd3-d3b7-6b569247d101" + }, + "source": [ + "backend = Aer.get_backend('qasm_simulator')\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ], + "execution_count": 7, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "image/png": "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\nfL2XB41LJQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 7 + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2a4gMB7p0-0Q", + "colab_type": "text" + }, + "source": [ + "### Execução em uma máquina real\n", + "\n", + "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "8NemenE90-0R", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import getpass\n", + "\n", + "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hTcp1gr60-0T", + "colab_type": "text" + }, + "source": [ + "Escolha um computador quântico operacional:" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "B2Htjxfh0-0T", + "colab_type": "code", + "colab": {} + }, + "source": [ + "IBMQ.enable_account(MY_API_TOKEN)\n", + "IBMQ.backends(operational=True)" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "KkoEN8OB0-0V", + "colab_type": "code", + "colab": {} + }, + "source": [ + "backend = IBMQ.get_backend('ibmqx4')\n", + "\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ], + "execution_count": 0, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "d849tJAr0-0X", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] } - ], - "source": [ - "backend = IBMQ.get_backend('ibmqx4')\n", - "\n", - "job_sim = execute(deutsch, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} + ] +} \ No newline at end of file From 3a0ec1156b0083c2e12c01da91804419c9a1bf5f Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 18:40:13 -0300 Subject: [PATCH 34/49] update --- deutsch_jozsa.ipynb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 90225b3..3f841a2 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -133,7 +133,7 @@ "\n", "$|\\psi_3\\rangle = \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", "\n", - "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{2}\\right)$\n", "\n", "\n", "#### 3º Passo:\n", @@ -145,6 +145,9 @@ "\n", "$|\\psi_4\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle}{\\sqrt{2}}\\right)$\n", "\n", + "$|\\psi_4\\rangle = \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "\n", "#### 4º Passo:\n", "\n", "Agora basta aplicarmos o Hadarmad ao estado atual \n", @@ -152,6 +155,7 @@ "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", "\n", "\n", + "$|\\psi_5\\rangle = |1\\rangle|1\\rangle$\n", "\n" ] }, @@ -406,7 +410,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.7.3" } }, "nbformat": 4, From 00b6edb82bf965663daa74746edf9bdc7f4a45d8 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 18:57:37 -0300 Subject: [PATCH 35/49] =?UTF-8?q?=C3=9Altimas=20atualiza=C3=A7=C3=B5es=20D?= =?UTF-8?q?eutsch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deutsch_jozsa.ipynb | 1331 +++++++++++++++++++++---------------------- 1 file changed, 656 insertions(+), 675 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 7ed6e15..5624fba 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -1,695 +1,676 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "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.7.3" - }, - "colab": { - "name": "deutsch_jozsa.ipynb", - "version": "0.3.2", - "provenance": [] - } + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "Wyq5GSe00-zz" + }, + "source": [ + "\n", + "# Problema de Deutch e Deutsch-Jozsa\n", + "\n", + "## Observação dos autores\n", + "\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "\n", + "### Cronograma\n", + "- Antes de comecarmos\n", + "- Paralelismo Quântico\n", + "- Problema de Deutch\n", + "- Porta Hadamard para N qubits\n", + "- Problema de Deutch-Jozsa\n" + ] }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "Wyq5GSe00-zz", - "colab_type": "text" - }, - "source": [ - "\n", - "# Problema de Deutch e Deutsch-Jozsa\n", - "\n", - "## Observação dos autores\n", - "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", - "\n", - "### Cronograma\n", - "- Antes de comecarmos\n", - "- Paralelismo Quântico\n", - "- Problema de Deutch\n", - "- Porta Hadamard para N qubits\n", - "- Problema de Deutch-Jozsa\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qez2OAF20-z1", - "colab_type": "text" - }, - "source": [ - "# Antes de começarmos\n", - "\n", - " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", - "\n", - "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", - "\n", - "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", - "\n", - " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", - "\n", - " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7OchLNAJ0-z2", - "colab_type": "text" - }, - "source": [ - "\n", - "## Avaliando uma função\n", - "\n", - " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", - "\n", - "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", - "\n", - " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", - " \n", - " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", - "\n", - "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", - " \n", - " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZQX9PXmv0-z2", - "colab_type": "text" - }, - "source": [ - "# Problema de Deutsch\n", - "\n", - "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", - "\n", - "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", - "\n", - "### Conceitos Iniciais:\n", - "\n", - "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", - "\n", - "### Como o algoritmo funciona:\n", - "\n", - "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", - "\n", - "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", - "\n", - "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "WIZ35iPF0-z3", - "colab_type": "text" - }, - "source": [ - "**Antes de seguirmos para nosso exemplo:**\n", - "\n", - "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", - "\n", - "\n", - "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", - "\n", - "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6ssJ068G0-z4", - "colab_type": "text" - }, - "source": [ - "\n", - "### Exemplo Teórico (1):\n", - "\n", - "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", - "\n", - "Suponha que temos uma função $f$ em que $f(0) = 0$ e $f(1) = 1$ que claramente esse é uma função balanceada.\n", - "\n", - "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", - "\n", - "#### 1º Passo:\n", - "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", - "\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", - "\n", - "#### 2º Passo:\n", - "\n", - "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", - "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", - "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", - "\n", - "\n", - "#### 3º Passo:\n", - "\n", - "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", - "\n", - "\n", - "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", - "\n", - "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$\n", - "\n", - "#### 4º Passo:\n", - "\n", - "Agora basta aplicarmos o Hadarmad ao estado atual \n", - "\n", - "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", - "\n", - "\n", - "$|\\psi_5\\rangle = \n", - "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", - "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", - "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", - "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", - "\n", - "\n", - "$|\\psi_5\\rangle =$ \n", - "\n", - "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", - "\n", - "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", - "\n", - "$|\\psi_5\\rangle =\\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$\n", - "\n", - "#### 5º Passo\n", - "\n", - "Agora nós podemos fazer a medição do nosso sistema representado por $|\\psi_5\\rangle$. \n", - "\n", - "Podemos percebe que quando medirmos o nós iremos obter ambos os estados $|10\\rangle$ e\n", - "$|11\\rangle$ com probabilidade de $\\frac{1}{2}$ cada um. Isso prova o que queriamos, que nada \n", - "mais do que, obter uma saída diferente de 00 se a nossa função for balanceada.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "k0hAHaBl0-z5", - "colab_type": "text" - }, - "source": [ - "## Porta Hadamard para N qubits\n", - "\n", - "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", - "\n", - "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", - "\n", - "\n", - "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", - "\n", - "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", - "\n", - "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", - "\n", - "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", - "\n", - "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", - "\n", - "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", - "\n", - "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", - "\n", - "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "grdH81v50-z5", - "colab_type": "text" - }, - "source": [ - "## Problema de Deutsch Jozsa\n", - "\n", - "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", - "\n", - "\n", - "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", - "\n", - "Desenvolvendo o último termo da igaldade ficamos com:\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo temos que se $f(x) = 0$:\n", - "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "E se $f(x) = 1$ temos:\n", - "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Portanto, podemos concluir que:\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", - "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", - "\n", - "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", - "\n", - "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", - "\n", - "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", - "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", - "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "8kx_S9ma0-z6", - "colab_type": "text" - }, - "source": [ - "## Exemplo na prática (1):\n", - "\n", - "#### 1º Passo:\n", - "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", - "\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "G7Qi5gpI0-z7", - "colab_type": "code", - "colab": {} - }, - "source": [ - "%matplotlib inline\n", - "# Importing standard Qiskit libraries and configuring account\n", - "import numpy as np\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", - "from qiskit.compiler import transpile, assemble\n", - "from qiskit.tools.jupyter import *\n", - "from qiskit.visualization import *\n", - "# Loading your IBM Q account(s)\n", - "#provider = IBMQ.load_account()" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "f_qVgKeo0-z-", - "colab_type": "code", - "colab": {} - }, - "source": [ - "\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, Aer, execute\n", - "from qiskit.tools.visualization import plot_histogram\n", - "\n", - "q = QuantumRegister(2)\n", - "c = ClassicalRegister(2)\n", - "deutsch = QuantumCircuit(q, c)\n" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "bVJ3nNyv0-0A", - "colab_type": "text" - }, - "source": [ - "#### 2º Passo:\n", - "\n", - "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", - "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", - "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", - "\n", - "\n" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "t9uCxnjM0-0B", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "outputId": "2dd6dc53-579d-421f-f5f4-8b5bbbee3ab2" - }, - "source": [ - "\n", - "\n", - "deutsch.x(q[1])\n", - "\n", - "deutsch.barrier()\n", - "\n", - "deutsch.h(q[0])\n", - "deutsch.h(q[1])" - ], - "execution_count": 3, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 3 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "V2XfOWY90-0F", - "colab_type": "text" - }, - "source": [ - "\n", - "#### 3º Passo:\n", - "\n", - "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", - "\n", - "\n", - "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", - "\n", - "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "AuqlLDGb0-0G", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "outputId": "6ec32032-980d-41ea-afe9-97a16caa08c0" - }, - "source": [ - "deutsch.barrier()\n", - "\n", - "deutsch.cx(q[0], q[1])\n", - "\n", - "deutsch.barrier()" - ], - "execution_count": 4, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 4 - } - ] - }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "qez2OAF20-z1" + }, + "source": [ + "# Antes de começarmos\n", + "\n", + " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", + "\n", + "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", + "\n", + "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", + "\n", + " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", + "\n", + " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7OchLNAJ0-z2" + }, + "source": [ + "\n", + "## Avaliando uma função\n", + "\n", + " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", + "\n", + "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", + "\n", + " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " \n", + " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", + "\n", + "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", + " \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ZQX9PXmv0-z2" + }, + "source": [ + "# Problema de Deutsch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", + "\n", + "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", + "\n", + "### Conceitos Iniciais:\n", + "\n", + "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", + "\n", + "### Como o algoritmo funciona:\n", + "\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", + "\n", + "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "WIZ35iPF0-z3" + }, + "source": [ + "**Antes de seguirmos para nosso exemplo:**\n", + "\n", + "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", + "\n", + "\n", + "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", + "\n", + "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "6ssJ068G0-z4" + }, + "source": [ + "\n", + "### Exemplo Teórico (1):\n", + "\n", + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 0$ e $f(1) = 1$ que claramente esse é uma função balanceada.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "\n", + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "\n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "\n", + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)H\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = |1\\rangle|1\\rangle$\n", + "\n", + "\n", + "#### 5º Passo\n", + "\n", + "Agora nós podemos fazer a medição do nosso sistema representado por $|\\psi_5\\rangle$. \n", + "\n", + "Podemos percebe que quando medirmos o nós iremos obter ambos os estados $|11\\rangle$ com probabilidade de \n", + "$100\\%$ mostrando que nossa função é balanceada. \n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "k0hAHaBl0-z5" + }, + "source": [ + "## Porta Hadamard para N qubits\n", + "\n", + "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "\n", + "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", + "\n", + "\n", + "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", + "\n", + "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", + "\n", + "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", + "\n", + "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", + "\n", + "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", + "\n", + "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", + "\n", + "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", + "\n", + "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "grdH81v50-z5" + }, + "source": [ + "## Problema de Deutsch Jozsa\n", + "\n", + "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "\n", + "\n", + "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", + "\n", + "Desenvolvendo o último termo da igaldade ficamos com:\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo temos que se $f(x) = 0$:\n", + "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "E se $f(x) = 1$ temos:\n", + "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Portanto, podemos concluir que:\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", + "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", + "\n", + "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", + "\n", + "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "\n", + "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", + "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", + "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "8kx_S9ma0-z6" + }, + "source": [ + "## Exemplo na prática Algoritmo de Deutsch:\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "G7Qi5gpI0-z7" + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "# Importing standard Qiskit libraries and configuring account\n", + "import numpy as np\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", + "from qiskit.compiler import transpile, assemble\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "# Loading your IBM Q account(s)\n", + "#provider = IBMQ.load_account()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "f_qVgKeo0-z-" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "KhBke-Ic0-0I", - "colab_type": "text" - }, - "source": [ - "#### 4º Passo:\n", - "\n", - "Agora basta aplicarmos o Hadarmad ao estado atual \n", - "\n", - "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", - "\n", - "\n", - "$|\\psi_5\\rangle = \n", - "\\frac{1}{2}\\left(\\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", - "- \\left[\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right]|1\\rangle \n", - "- \\left[\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right]|0\\rangle\n", - "+ \\left[\\frac{|0\\rangle -|1\\rangle}{\\sqrt{2}}\\right]|1\\rangle\\right)$\n", - "\n", - "\n", - "$|\\psi_5\\rangle =$ \n", - "\n", - "$\\frac{1}{2\\sqrt{2}}\\left(|00\\rangle + |10\\rangle - |01\\rangle - |11\\rangle\\right)$\n", - "\n", - "$\\frac{1}{2\\sqrt{2}}\\left(- |00\\rangle + |10\\rangle + |01\\rangle - |11\\rangle\\right)$\n", - "\n", - "$|\\psi_5\\rangle = \\frac{1}{2\\sqrt{2}}\\left( 2|10\\rangle - 2|11\\rangle\\right)$" + "data": { + "text/plain": [ + "" ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, Aer, execute\n", + "from qiskit.tools.visualization import plot_histogram\n", + "\n", + "q = QuantumRegister(2)\n", + "c = ClassicalRegister(2)\n", + "deutsch = QuantumCircuit(q, c)\n", + "deutsch.x(q[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "bVJ3nNyv0-0A" + }, + "source": [ + "#### 2º Passo:\n", + "\n", + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "\n", + "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 }, + "colab_type": "code", + "id": "t9uCxnjM0-0B", + "outputId": "2dd6dc53-579d-421f-f5f4-8b5bbbee3ab2" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "piMOzgtC0-0J", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "outputId": "84290b41-f4a0-4458-a2ff-5099e0117610" - }, - "source": [ - "deutsch.h(q[0])\n", - "deutsch.h(q[1])" - ], - "execution_count": 5, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 5 - } + "data": { + "text/plain": [ + "" ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "deutsch.barrier()\n", + "\n", + "deutsch.h(q[0])\n", + "deutsch.h(q[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "V2XfOWY90-0F" + }, + "source": [ + "\n", + "#### 3º Passo:\n", + "\n", + "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 }, + "colab_type": "code", + "id": "AuqlLDGb0-0G", + "outputId": "6ec32032-980d-41ea-afe9-97a16caa08c0" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "5nk9lPFy0-0M", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "outputId": "0cb7c74c-afe3-4f92-b365-d042657e676a" - }, - "source": [ - "deutsch.draw()\n", - "deutsch.measure(q, c)" - ], - "execution_count": 6, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 6 - } + "data": { + "text/plain": [ + "" ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "deutsch.barrier()\n", + "\n", + "deutsch.cx(q[0], q[1])\n", + "\n", + "deutsch.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "KhBke-Ic0-0I" + }, + "source": [ + "#### 4º Passo:\n", + "\n", + "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "\n", + "$|\\psi_5\\rangle = H\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)H\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = |1\\rangle|1\\rangle$\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 }, + "colab_type": "code", + "id": "piMOzgtC0-0J", + "outputId": "84290b41-f4a0-4458-a2ff-5099e0117610" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "xseid-Rs0-0O", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 347 - }, - "outputId": "954eabac-1797-4dd3-d3b7-6b569247d101" - }, - "source": [ - "backend = Aer.get_backend('qasm_simulator')\n", - "job_sim = execute(deutsch, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n" - ], - "execution_count": 7, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "image/png": "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\nfL2XB41LJQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 7 - } + "data": { + "text/plain": [ + "" ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "deutsch.h(q[0])\n", + "deutsch.h(q[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 34 }, + "colab_type": "code", + "id": "5nk9lPFy0-0M", + "outputId": "0cb7c74c-afe3-4f92-b365-d042657e676a" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "2a4gMB7p0-0Q", - "colab_type": "text" - }, - "source": [ - "### Execução em uma máquina real\n", - "\n", - "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + "data": { + "text/plain": [ + "" ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "deutsch.draw()\n", + "deutsch.measure(q, c)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 347 }, + "colab_type": "code", + "id": "xseid-Rs0-0O", + "outputId": "954eabac-1797-4dd3-d3b7-6b569247d101" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "8NemenE90-0R", - "colab_type": "code", - "colab": {} - }, - "source": [ - "import getpass\n", - "\n", - "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hTcp1gr60-0T", - "colab_type": "text" - }, - "source": [ - "Escolha um computador quântico operacional:" + "data": { + "image/png": "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\n", + "text/plain": [ + "
" ] - }, - { - "cell_type": "code", - "metadata": { - "id": "B2Htjxfh0-0T", - "colab_type": "code", - "colab": {} - }, - "source": [ - "IBMQ.enable_account(MY_API_TOKEN)\n", - "IBMQ.backends(operational=True)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "KkoEN8OB0-0V", - "colab_type": "code", - "colab": {} - }, - "source": [ - "backend = IBMQ.get_backend('ibmqx4')\n", - "\n", - "job_sim = execute(deutsch, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "d849tJAr0-0X", - "colab_type": "code", - "colab": {} - }, - "source": [ - "" - ], - "execution_count": 0, - "outputs": [] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" } - ] -} \ No newline at end of file + ], + "source": [ + "backend = Aer.get_backend('qasm_simulator')\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "2a4gMB7p0-0Q" + }, + "source": [ + "### Execução em uma máquina real\n", + "\n", + "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "8NemenE90-0R" + }, + "outputs": [], + "source": [ + "import getpass\n", + "\n", + "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hTcp1gr60-0T" + }, + "source": [ + "Escolha um computador quântico operacional:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "B2Htjxfh0-0T" + }, + "outputs": [], + "source": [ + "IBMQ.enable_account(MY_API_TOKEN)\n", + "IBMQ.backends(operational=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "KkoEN8OB0-0V" + }, + "outputs": [], + "source": [ + "backend = IBMQ.get_backend('ibmqx4')\n", + "\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "d849tJAr0-0X" + }, + "source": [ + "### Fonte e mais informações: \n", + "\n", + "[IBMQ website!](https://quantum-computing.ibm.com/support/guides/quantum-algorithms)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "name": "deutsch_jozsa.ipynb", + "provenance": [], + "version": "0.3.2" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From a9a145a37d0ed4b06c04a40dbb7d40a61ce10ef5 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 20:56:33 -0300 Subject: [PATCH 36/49] =?UTF-8?q?Atualiza=C3=A7=C3=B5es=20do=20grover?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grover.ipynb | 306 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 246 insertions(+), 60 deletions(-) diff --git a/grover.ipynb b/grover.ipynb index dd779e2..1f2f3de 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 113, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", + " Dado um conjunto desestruturado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em aproximadamente $\\sigma(\\sqrt{N/M})$ iterações, onde M é quantidade de soluções buscadas. \n", " " ] }, @@ -62,7 +62,7 @@ " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", " $$\n", " \n", - " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancilla).\n", + " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca, o segundo registrador quântico trata-se do qubit auxiliar (ou ancilla).\n", " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de fase_.\n", " \n", " \n", @@ -101,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -120,10 +120,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 114, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -158,7 +158,7 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -177,10 +177,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 115, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -199,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -218,10 +218,10 @@ "
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 116, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -242,17 +242,17 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { - "image/png": "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kEsvvfQ1y6+44goOOuggDj30UN7//vfz1FNPtS/baaedmDBhAhMmTOBDH/pQ+/w777yTww8/nAkTJnDMMccwd+7cXnkv/Yn9okYSmdnXNfSZlpaWnDp1al+XoQbQ2trKW97yFqZMmcKIESM48sgjufrqq9lrr73a29x9990ceOCBDBkyhEmTJnHPPfcwadIkAHbddde1vqzbvOUtb+GGG25gzJgxXHPNNTzwwANcccUVvfa+NnX2i/pCU1PTtMwc39kytzQlYNq0aeyxxx7svvvuDB48mIkTJ3Lbbbet1eawww5jyJAhAIwfP56FCxeud70RwYoVKwBYvnw5O++8c/cX34/ZL2o0m/d1AVIjWLRoEW94wxvap0eMGMG0adO6bH/DDTfwjne8o336lVde4e1vfzuDBg3irLPO4j3veQ8Al112GSeeeCJbbbUVQ4cO5fbbb++5N9EP2S9qNIamBHR2mCIiOm170003MX36dG699db2eQ8//DDNzc3MmzeP973vfey9997ssccefOMb3+DGG29k/PjxfP3rX+fzn/88X//613vsffQ39osajbtnJYotmKeffrp9euHChZ3usvvlL3/JJZdcwuTJk9lyyy3b5zc3NwOw++67c+ihh/Lwww+zZMkSZsyYwfjxxaGRiRMncv/99/fwO+lf7Bc1GkNTAg444ADmzp3L/PnzWbVqFVOmTOHoo49eq83DDz/M2WefzeTJkxk2bFj7/BdeeIFXX30VgKVLl/LrX/+aMWPGsP3227N8+XLmzJkDwC9+8Qve9KY39d6b6gfsFzUad89KwOabb85FF13E8ccfT2trKx/+8IcZO3YsF154IS0tLRxzzDGcf/75rFy5klNPPRWAXXbZhcmTJzN79mzOPvtsNttsM9asWcOZZ57ZfnbnpZdeysknn8xmm23G9ttvz+WXX96Xb3OTY7+o0XjJiZecSJJqeMmJJEndwNDsIxszygkU15bts88+nHPOOQCsWLGifeSTCRMmMHr0aM4999xeeS+SNFAYmn2gtbWVc845h5tuuon77ruPW265hd///vdrtXnzm9/M1KlTueeee3jve9/L+eefv9byCy+8kEMOOaR9eujQodx1113tP7vuuivHHntsr7wfSRooDM0+sLGjnDz44IMsXryYI444otP1P/744yxevJiDDz64596EJA1AhmYf6GyUk0WLFnXZvnaUkzVr1nDeeedxwQUXdNn+lltu4QMf+ECXF4FLkjaMl5z0gY0Z5eSaa67hqKOOYpddduly/VOmTOGqq67qnmIlSe0MzT5Q7ygnt956a/soJ7/5zW+47777uOaaa1i5ciWrVq1im222aT/mOWPGDFpbW9l///17581I0gBiaPaB2lFOmpubmTJlCt/61rfWatM2ysnNN9+81ignte0mT57Mgw8+uNZJQrfccgsTJ07s+TchSQOQodkHNmaUk/X54Q9/yI033tjTb0GSBiRHBHJEIElSDUcEkiR1mw0dnOWpp57iiCOOYMKECRx88MF8+9vfBjatwVncPStJqqxtcJYpU6YwYsQIjjzySI4++uj2wfDhT4OzDBkyhEmTJnH++eczadIkhg8fzs9+9jO23HJL/vCHP/DWt76Vo48+mubmZu6666725x9xxBENOziLoal+6ZzrdujrErrNRSc/39cldBv7ZdNXOzgL0D44S21oHnbYYe2Px48fz0033QTA4MGD2+evWrWKNWvWvGb9jT44i7tnJUmVbczgLAALFizg0EMPZb/99uPMM89sv1F4m0YfnMXQlCRVtiGDs5xxxhnt83bZZRfuuecefvvb3/K9732P5557bq3nTJkyheOOO657i+5GhqYkqbJ6B2eZPHly++AstZqbmxkzZgz33Xdf+7xNYXAWQ1OSVFnt4CyrVq1iypQpHH300Wu1aRucZfLkyWsNzvL000/z8ssvA/DCCy9w//33s+eee7Yv3xQGZ/FEIElSZRszOMujjz7KeeedR0SQmXzyk59k7733bl/3pjA4i4MbOLhBv+RZmo3JftGmwMENJEnqBoamJEkVeUyzG7jLSZIGBrc0JUmqyNCUJKmiXg/NiPhERDwREa9ExLSIOGwdbSdGxO0RsTgiVkTEryPivetof1JEZETc2jPVS5IGsl4NzYg4EbgMuBBoAe4FbouIkV085W3AVOA9ZfufAj/oLGgjYhTwVeDuHihdkqRe39I8G7g2M6/OzFmZeQawCPh4Z40z88zM/NfMvD8z52TmBcA04P217SJiC+C7wP8D5vbsW5AkDVS9dvZsRAwGDgQu7rDoduCQOlY1FOh4iueXgXmZeV1EHLGeOk4DToNi7MMHHngAKMZTHDJkCHPmzAFgu+22Y9SoUUyfPh2AQYMGMW7cOGbP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\n", + "image/png": "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\n", "text/plain": [ "
" ] }, - "execution_count": 117, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -334,7 +334,9 @@ " 3. Reaplicar transformações de Hadamard $H^{\\otimes n}$\n", " \n", " A aplicação do operador $U_f$(ou oracle)junto com os três passos $1,2$ e $3$ compõe a interação de Grover ou _Grover's interation_.\n", - " O algoritmo tem que ser executado até $\\sqrt{N}$ vezes, mais especificamente a aplicação da interação de Grover no sistema. " + " O algoritmo tem que ser executado aproximadamente $\\sigma\\left(\\sqrt{N/M}\\right)$ vezes, mais especificamente a aplicação da interação de Grover no sistema. \n", + " \n", + " \n" ] }, { @@ -344,31 +346,31 @@ "# Circuito Quântico" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nós iremos realizar nossa busca em um vetor com 4 elementos 00, 01, 10, 11.
\n", + "O elemento escolhido para busca é o 11.
\n", + "\n", + "**Antes de Comerçarmos:**
\n", + "Para implementarmos o circuito que irá encontra-lo nós incializamos os nossos qubits,
\n", + "os dois primeiros em $|00\\rangle$ e o último o anclilla qubits em $|1\\rangle$. Após isso
\n", + "aplicaremos a transformação de hadamard a todos os estados." + ] + }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { - "text/html": [ - "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐     \n",
-       "q_0: |0>┤ H ├──■────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├─────\n",
-       "        ├───┤┌─┴─┐  │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤┌───┐\n",
-       "q_1: |0>┤ H ├┤ X ├──■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├\n",
-       "        ├───┤├───┤┌─┴─┐├───┤└───┘└───┘└───┘└───┘└───┘└───┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├┤ H ├──────────────────────────────\n",
-       "        └───┘└───┘└───┘└───┘                              \n",
-       " c_0: 0 ══════════════════════════════════════════════════\n",
-       "                                                          \n",
-       " c_1: 0 ══════════════════════════════════════════════════\n",
-       "                                                          
" - ], "text/plain": [ - "" + "" ] }, - "execution_count": 118, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -378,23 +380,132 @@ "qub = QuantumRegister(3,'q')\n", "cb = ClassicalRegister(2,'c')\n", "qc = QuantumCircuit(qub,cb)\n", - "qc.h(qub[0])\n", - "qc.h(qub[1])\n", + "\n", "#Preparando a ancila\n", "qc.x(qub[2])\n", - "qc.h(qub[2])\n", "\n", - "#Interação de grover quantidade de interações incorreta.\n", - "#for i in range(int(np.ceil(np.sqrt(4)))):\n", + "#Hadarmad \n", "\n", - "# Oracle\n", + "qc.barrier()\n", "\n", - "qc.ccx(qub[0], qub[1], qub[2])\n", + "qc.h(qub)\n", + "qc.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Antes de irmos em frente:**\n", + "\n", + "Agora faremos a iteração de grover apenas uma vez. Isso acontece porque de forma precisa a
\n", + "quantidade vezes que iremos rodar o procedimento de Grover é cálculada pela seguinte equação:
\n", + "\n", + "$$\n", + "R = CI\\left(\\frac{arccos\\sqrt(M/N)}{\\theta}\\right)\n", + "$$\n", + "\n", + "Onde CI(x) é o valor inteiro mais próximo de x (se o valor for por exemplo 1.5 arredondamos para baixo ficando com 1)
\n", + "e $\\theta$ é dado pela equação:\n", + "\n", + "$$\n", + "sin\\theta = \\frac{2\\sqrt(M(N -M))}{N}\n", + "$$\n", + "\n", + "\n", + "Nós podemos resumir tudo isso na seguinte expressão: $ R \\leq \\lceil \\pi/2\\theta \\rceil$.
\n", + "No nosso caso valor the $\\theta$ será de $\\pi/3$ o que nós daria um valor proximado de 0.5
\n", + "e arredondado de 1.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Seguindo em frente**\n", "\n", + "1. Aplicar a função Oracle que irá marcar o índice buscado $O$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Oracle\n", + "qc.ccx(qub[0], qub[1], qub[2])\n", + "qc.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. Aplicaremos agora a transformação de Hadamard aos dois primeiros qubits" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ "#---Hadamard\n", "qc.h(qub[0])\n", "qc.h(qub[1])\n", "\n", + "qc.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", + "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ "#----Troca de fase\n", "qc.x(qub[0])\n", "qc.x(qub[1])\n", @@ -403,17 +514,36 @@ "\n", "qc.cx(qub[0], qub[1])\n", "\n", + "\n", "qc.h(qub[1])\n", "\n", "qc.x(qub[0])\n", "qc.x(qub[1]) \n", - "\n", + "qc.barrier()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ "#--- Hadarmard\n", - "qc.h(qub[0])\n", - "qc.h(qub[1])\n", - "qc.h(qub[2])\n", + "qc.h(qub)\n", "\n", - "qc.draw()" + "qc.draw(output='mpl')" ] }, { @@ -426,29 +556,29 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
        ┌───┐          ┌───┐┌───┐          ┌───┐┌───┐┌─┐        \n",
-       "q_0: |0>┤ H ├──■────■──┤ H ├┤ X ├───────■──┤ X ├┤ H ├┤M├────────\n",
-       "        ├───┤┌─┴─┐  │  ├───┤├───┤┌───┐┌─┴─┐├───┤├───┤└╥┘┌───┐┌─┐\n",
-       "q_1: |0>┤ H ├┤ X ├──■──┤ H ├┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─╫─┤ H ├┤M├\n",
-       "        ├───┤├───┤┌─┴─┐├───┤└───┘└───┘└───┘└───┘└───┘ ║ └───┘└╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├┤ H ├──────────────────────────╫───────╫─\n",
-       "        └───┘└───┘└───┘└───┘                          ║       ║ \n",
-       " c_0: 0 ══════════════════════════════════════════════╩═══════╬═\n",
-       "                                                              ║ \n",
-       " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
-       "                                                                
" + "
              ░ ┌───┐ ░       ░ ┌───┐ ░ ┌───┐          ┌───┐      ░ ┌───┐┌─┐   \n",
+       "q_0: |0>──────░─┤ H ├─░───■───░─┤ H ├─░─┤ X ├───────■──┤ X ├──────░─┤ H ├┤M├───\n",
+       "              ░ ├───┤ ░   │   ░ ├───┤ ░ ├───┤┌───┐┌─┴─┐├───┤┌───┐ ░ ├───┤└╥┘┌─┐\n",
+       "q_1: |0>──────░─┤ H ├─░───■───░─┤ H ├─░─┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─░─┤ H ├─╫─┤M├\n",
+       "        ┌───┐ ░ ├───┤ ░ ┌─┴─┐ ░ └───┘ ░ └───┘└───┘└───┘└───┘└───┘ ░ ├───┤ ║ └╥┘\n",
+       "q_2: |0>┤ X ├─░─┤ H ├─░─┤ X ├─░───────░───────────────────────────░─┤ H ├─╫──╫─\n",
+       "        └───┘ ░ └───┘ ░ └───┘ ░       ░                           ░ └───┘ ║  ║ \n",
+       " c_0: 0 ══════════════════════════════════════════════════════════════════╩══╬═\n",
+       "                                                                             ║ \n",
+       " c_1: 0 ═════════════════════════════════════════════════════════════════════╩═\n",
+       "                                                                               
" ], "text/plain": [ - "" + "" ] }, - "execution_count": 119, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -456,12 +586,13 @@ "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", + "\n", "qc.draw()" ] }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -471,7 +602,7 @@ "
" ] }, - "execution_count": 120, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -486,6 +617,61 @@ "plot_histogram(counts, title='O indíce procurado')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Execução em uma máquina real\n", + "\n", + "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "\n", + "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IBMQ.enable_account(MY_API_TOKEN)\n", + "IBMQ.backends(operational=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "backend = IBMQ.get_backend('ibmqx4')\n", + "\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fonte e mais informações: \n", + "\n", + "[IBMQ website](https://quantum-computing.ibm.com/support/guides/quantum-algorithms)
\n", + "[Quantum Computation and Quantum Information](https://books.google.com.br/books/about/Quantum_Computation_and_Quantum_Informat.html?id=-s4DEy7o-a0C&printsec=frontcover&source=kp_read_button&redir_esc=y#v=onepage&q&f=false)" + ] + }, { "cell_type": "markdown", "metadata": {}, From 862136b1a0c717064c5ada74853973dc75f25a26 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 21:07:38 -0300 Subject: [PATCH 37/49] update chekpoint --- .ipynb_checkpoints/grover-checkpoint.ipynb | 406 +++++++++++---------- 1 file changed, 214 insertions(+), 192 deletions(-) diff --git a/.ipynb_checkpoints/grover-checkpoint.ipynb b/.ipynb_checkpoints/grover-checkpoint.ipynb index c80ed0d..0966731 100755 --- a/.ipynb_checkpoints/grover-checkpoint.ipynb +++ b/.ipynb_checkpoints/grover-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 57, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um conjunto desordenado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em $\\sqrt{N}$ vezes. \n", + " Dado um conjunto desestruturado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em aproximadamente $\\sigma(\\sqrt{N/M})$ iterações, onde M é quantidade de soluções buscadas. \n", " " ] }, @@ -57,12 +57,12 @@ "metadata": {}, "source": [ "## Preparação dos estados\n", - " Considere o operador unitário $U_f$ que implementa a função(ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", + " Considere o operador unitário $U_f$ que implementa a função (ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", " $$\n", " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", " $$\n", " \n", - " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca o segundo registrador quântico trata-se do qubit auxiliar (ou ancila).\n", + " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca, o segundo registrador quântico trata-se do qubit auxiliar (ou ancilla).\n", " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de fase_.\n", " \n", " \n", @@ -90,7 +90,7 @@ " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", " $$\n", " \n", - " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancila enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", + " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancilla enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", " \n", " Para um sistema cuja entrada tem três qubits, o estado se encontraria como a seguir:\n", " $$\n", @@ -101,33 +101,9 @@ }, { "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐     \n",
-       "q_0: |0>┤ H ├─────\n",
-       "        ├───┤     \n",
-       "q_1: |0>┤ H ├─────\n",
-       "        ├───┤┌───┐\n",
-       "q_2: |0>┤ X ├┤ H ├\n",
-       "        └───┘└───┘\n",
-       " c_0: 0 ══════════\n",
-       "                  \n",
-       " c_1: 0 ══════════\n",
-       "                  
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "qub = QuantumRegister(3,'q')\n", "cb = ClassicalRegister(2,'c')\n", @@ -158,33 +134,9 @@ }, { "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          \n",
-       "q_0: |0>┤ H ├───────■──\n",
-       "        ├───┤       │  \n",
-       "q_1: |0>┤ H ├───────■──\n",
-       "        ├───┤┌───┐┌─┴─┐\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├\n",
-       "        └───┘└───┘└───┘\n",
-       " c_0: 0 ═══════════════\n",
-       "                       \n",
-       " c_1: 0 ═══════════════\n",
-       "                       
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "qc.ccx(qub[0], qub[1], qub[2])\n", "qc.draw()" @@ -199,33 +151,9 @@ }, { "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤M├───\n",
-       "        ├───┤       │  └╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
-       "        └───┘└───┘└───┘ ║  ║ \n",
-       " c_0: 0 ════════════════╩══╬═\n",
-       "                           ║ \n",
-       " c_1: 0 ═══════════════════╩═\n",
-       "                             
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -242,21 +170,9 @@ }, { "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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jjtywQUXrDD/oosuYuzYsey2226MHz+eF154Ydm8GTNmcPDBB7PzzjszduxYnn/+eQAuu+wydtxxRxoaGpgzZ063rYukrmeA9pCu+LKePn06++yzDzvttBNHH300Cxcu7Lb16e2WLFnCySefzHXXXcf999/PDTfcwJNPPrlcm+2224477riDe+65h49//OOcdtppy+Ydf/zxnHDCCfz5z3/m9ttvZ+ONNwZg55135pe//CXDhg3r1vWR1PUM0B7QVV/Wp59+OscffzwPPvggG2ywAddcc023rldv9tBDD7HFFluw+eabM3DgQA4++GBuueWW5drsvvvuDBo0CICddtqJmTNnAvDkk0+yePFi9t57bwDe8573LGu33XbbMXz48G5cE0ndxQDtAV3xZZ2Z/OlPf+Kggw4C4NOf/jS/+c1vunGterdZs2bxvve9b9nzIUOGMGvWrFbbX3PNNeyzzz4APPvss6y//vocccQR7Lnnnnz7299myZIlXV6zpJ5lgPaArviynjt3Luuvvz79+/dv0zK1vMxcYVpEtNj2uuuuY+LEiZxwwgkALF68mPvvv58zzzyTP/zhD0ybNo0JEyZ0ab2Sel7/ni6gL6ryZX3zzTcDf/uyvuuuuxg6dChHH300EyZMYL/99mvzMrWiIUOG8OKLLy57PnPmTDbddNMV2v3xj3/kvPPO4+abb2bNNddc9trtttuOzTffHIADDjiABx98sFvqltRz3APtAe39sp4wYUKLX9b9+/fngAMO4LHHHmOjjTbijTfeYPHixStdplq2ww47MHXqVKZPn87ChQu58cYb2XfffZdr89hjj3HSSScxYcIEBg8evNxrX3/9dWbPng3A3XffzciRI7u1fkndzwDtAV3xZR0R7LbbbvzqV78C4Nprr2X//ffvvpXq5fr3788555zDIYccwtixYxk/fjyjRo3i7LPPXnZ++rTTTmP+/PkcddRR7LHHHhx++OEA9OvXjzPPPJPx48ez6667AnDEEUcAcOmllzJ69GhmzpzJ7rvvzoknntgzKyip00VLhxP7iqamprzjjjt65L1vu+02vvnNb7JkyRI+85nP8NWvfpWzzz6bpqYm9ttvPz7xiU8wadIkNtlkEwCGDh267LzanXfeyamnnkpmsv3223P++eczcOBApk2bxjHHHMNrr73Gtttuy6WXXrpsz1WS1DYNDQ0PZeZOq2pngPZQgEqS6lNbA9RDuJIkVWCASpJUgQEqSWqXjgxFCvDmm28yevRoTj755GXTbrjhBnbddVd22203DjnkkF4xdrQBKklqs44ORQpw9tlns8suuyx7vnjxYk455RRuuukm7rnnHkaPHs1ll13WLevTEQaoJKnNOjIUKcAjjzzCq6++umw4UigGl8lMFixYQGYyb968XnEduwEqSWqzjgxF+u6773LqqadyxhlnLNdmwIABnHvuuey6665svfXWTJkyhc9+9rNdswKdyACVJLVZR8aNvvzyyxk3bhxDhw5drt2iRYu44ooruOuuu5g0aRKjR4/m/PPP7/ziO5lj4UqS2qwj40b/5S9/4f777+fyyy9n/vz5LFy4kHXWWYcDDzwQgC222AKA8ePHt9g5qd4YoJKkNqsdirSxsZEbb7yRH//4x8u1WToU6fXXX7/cUKS17SZMmMAjjzzCaaedxqxZs5gyZQqzZ89m44035s477+QDH/hAt61TVQaoJKnNaseNXjoU6dJxo5cORVo7bjQsPxRpSxobGzn55JM54IADGDBgAMOGDeOiiy7qrlWqzKH8HMpPklSjrUP5uQeq1dLJV23Y0yV0mnM+91pPlyCpBQZoJ/DLWpL6Hi9jkSSpAgNUkqQKDFBJkiowQCVJqsAAlVTXqt4664UXXmDvvfdmjz324MMf/jBXXHHFstecddZZbLPNNgwbNqzb1kOrHwNUUt3qyK2zNtlkE373u99x9913c9ttt3HBBRcsG/T8ox/9KLfffnu3r49WLwaopLrVkVtnDRw4cNkYrAsXLuTdd99d9poPfehDveJ2WapvBqikutWRW2cBzJgxg912241tt92WL3/5yzQ2NnZpvepbDFBJdasjt86CYgzWe+65hwcffJBrr72WV155pctqVd/jSESS6lZHbp1Vq7GxkZEjR3L//fdz0EEHdWnNvY0jqVXnHqikulV766yFCxdy4403su+++y7XZumtsyZMmLDcrbNefPFF3nrrLQBef/11HnjgAbbaaqturV+rNwNUUt2qvXXW2LFjGT9+/LJbZy3tTFR766w99tiDww8/HICnnnqKcePGsfvuu/Oxj32ML37xi2y99dbLXjN69GgWLFjA6NGj+f73v99j66jeq9tvZxYRXwC+DjQCfwW+kpl/aqXtwcBxQBOwFjAJ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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -275,7 +191,7 @@ "\n", " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", " \n", - " Agora considere que ao inves de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", + " Agora considere que ao invés de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", " \n", " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", " $$\\left[\\begin{array}{ccccc}\n", @@ -334,7 +250,9 @@ " 3. Reaplicar transformações de Hadamard $H^{\\otimes n}$\n", " \n", " A aplicação do operador $U_f$(ou oracle)junto com os três passos $1,2$ e $3$ compõe a interação de Grover ou _Grover's interation_.\n", - " O algoritmo tem que ser executado até $\\sqrt{N}$ vezes, mais especificamente a aplicação da interação de Grover no sistema. " + " O algoritmo tem que ser executado aproximadamente $\\sigma\\left(\\sqrt{N/M}\\right)$ vezes, mais especificamente a aplicação da interação de Grover no sistema. \n", + " \n", + " \n" ] }, { @@ -344,64 +262,148 @@ "# Circuito Quântico" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Nós iremos realizar nossa busca em um vetor com 4 elementos 00, 01, 10, 11.
\n", + "O elemento escolhido para busca é o 11.
\n", + "\n", + "**Antes de Comerçarmos:**
\n", + "Para implementarmos o circuito que irá encontra-lo nós incializamos os nossos qubits,
\n", + "os dois primeiros em $|00\\rangle$ e o último o anclilla qubits em $|1\\rangle$. Após isso
\n", + "aplicaremos a transformação de hadamard a todos os estados." + ] + }, { "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐\n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
-       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├───────────────\n",
-       "        └───┘└───┘└───┘               └───┘               \n",
-       " c_0: 0 ══════════════════════════════════════════════════\n",
-       "                                                          \n",
-       " c_1: 0 ══════════════════════════════════════════════════\n",
-       "                                                          
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 61, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "#Inicialização dos estados\n", "qub = QuantumRegister(3,'q')\n", "cb = ClassicalRegister(2,'c')\n", "qc = QuantumCircuit(qub,cb)\n", - "qc.h(qub[0])\n", - "qc.h(qub[1])\n", + "\n", "#Preparando a ancila\n", "qc.x(qub[2])\n", - "qc.h(qub[2])\n", "\n", - "#Interação de grover\n", - "for i in range(int(np.ceil(np.sqrt(4)))):\n", - " # Oracle\n", - " qc.ccx(qub[0], qub[1], qub[2])\n", + "#Hadarmad \n", "\n", - " #---Hadamard\n", - " qc.h(qub[0])\n", - " qc.h(qub[1])\n", + "qc.barrier()\n", "\n", - " #----Troca de fase\n", - " qc.z(qub[0])\n", - " qc.z(qub[1])\n", + "qc.h(qub)\n", + "qc.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Antes de irmos em frente:**\n", "\n", - " #--- Hadarmard\n", - " qc.h(qub[0])\n", - " qc.h(qub[1])\n", + "Agora faremos a iteração de grover apenas uma vez. Isso acontece porque de forma precisa a
\n", + "quantidade vezes que iremos rodar o procedimento de Grover é cálculada pela seguinte equação:
\n", "\n", - "qc.draw()" + "$$\n", + "R = CI\\left(\\frac{arccos\\sqrt(M/N)}{\\theta}\\right)\n", + "$$\n", + "\n", + "Onde CI(x) é o valor inteiro mais próximo de x (se o valor for por exemplo 1.5 arredondamos para baixo ficando com 1)
\n", + "e $\\theta$ é dado pela equação:\n", + "\n", + "$$\n", + "sin\\theta = \\frac{2\\sqrt(M(N -M))}{N}\n", + "$$\n", + "\n", + "\n", + "Nós podemos resumir tudo isso na seguinte expressão: $ R \\leq \\lceil \\pi/2\\theta \\rceil$.
\n", + "No nosso caso valor the $\\theta$ será de $\\pi/3$ o que nós daria um valor proximado de 0.5
\n", + "e arredondado de 1.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Seguindo em frente**\n", + "\n", + "1. Aplicar a função Oracle que irá marcar o índice buscado $O$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Oracle\n", + "qc.ccx(qub[0], qub[1], qub[2])\n", + "qc.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2. Aplicaremos agora a transformação de Hadamard aos dois primeiros qubits" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#---Hadamard\n", + "qc.h(qub[0])\n", + "qc.h(qub[1])\n", + "\n", + "qc.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", + "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#----Troca de fase\n", + "qc.x(qub[0])\n", + "qc.x(qub[1])\n", + "\n", + "qc.h(qub[1])\n", + "\n", + "qc.cx(qub[0], qub[1])\n", + "\n", + "\n", + "qc.h(qub[1])\n", + "\n", + "qc.x(qub[0])\n", + "qc.x(qub[1]) \n", + "qc.barrier()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#--- Hadarmard\n", + "qc.h(qub)\n", + "\n", + "qc.draw(output='mpl')" ] }, { @@ -414,56 +416,21 @@ }, { "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌───┐┌───┐┌───┐     ┌───┐┌───┐┌───┐┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├┤M├───\n",
-       "        ├───┤       │  ├───┤├───┤├───┤  │  ├───┤├───┤├───┤└╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■──┤ H ├┤ Z ├┤ H ├──■──┤ H ├┤ Z ├┤ H ├─╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐└───┘└───┘└───┘┌─┴─┐└───┘└───┘└───┘ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├───────────────┤ X ├────────────────╫──╫─\n",
-       "        └───┘└───┘└───┘               └───┘                ║  ║ \n",
-       " c_0: 0 ═══════════════════════════════════════════════════╩══╬═\n",
-       "                                                              ║ \n",
-       " c_1: 0 ══════════════════════════════════════════════════════╩═\n",
-       "                                                                
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 62, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", - "qc.draw()" + "\n", + "qc.draw(output='mpl')" ] }, { "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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f/mX7L777lx88cVrrL/sssvYa6+92HfffTnmmGN49tlnV62bN28exx57LHvuuSd77bUXzzzzDACZyXnnncd73vMe9txzT6688spe+zwaOIb2dQGS1J7m5ma+/OUvc8stt9DY2MghhxzC4Ycfzo477riqzS677MLUqVMZPnw411xzDZMnT+aaa64B4JRTTuGMM87goIMO4tVXX2W99Yo+w5QpU3juuee4//77WW+99Vi4cGGffD71b/ZAJdWtBx98kHe84x1sv/32bLDBBhx77LHcdtttq7XZb7/9GD58OAB77LEH8+fPB+BPf/oTK1eu5KCDDgLgbW9726p23//+9/nSl760KlBHjRrVWx9JA4gBKqluLViwgLe//e2rnjc2NrJgwYJ2299www28733vA+Cpp55i0003ZdKkSRxwwAF8/etfp7m5GYCnn36an/zkJxx88MF8+MMf5qmnnurZD6IByQCVVLcyc41lEdFm25tuuolp06Zx6qmnArBy5Uruu+8+zj33XH79618zZ84cpkyZAsDy5cvZcMMNmTp1KpMmTVr1GqkzDFBJdauxsZHnnntu1fP58+ezzTbbrNHuN7/5DRdddBFTpkxhww03XPXaXXbZhe23356hQ4dy5JFH8sgjj6xad/TRRwPwgQ98gD/+8Y+98Gk00BigkurWbrvtxuzZs5k7dy7Lly/nlltu4fDDD1+tzSOPPMIZZ5zBlClTVjuXudtuu/Hyyy+zaNEiAO666y7Gjx8PwBFHHMFdd90FwD333MO4ceN66RNpIPEqXEl1a+jQoVxwwQUcd9xxNDc38/GPf5wJEyZw/vnn09TUxPvf/34mT57MsmXL+NSnPgXA6NGjmTJlCkOGDOHcc8/lmGOOITPZddddmTRpEgCnn346J510Et/97ncZMWIEl1xySV9+TPVT0dY5hsGiqakpp06d2tdlSJLqyMiRIx/MzD3W1c5DuJIkVWCASpJUgQHaR7oyPdmWW27J/vvvz/7778/HPvaxNV575plnsu222/Zo/ZI02HkRUR/o6vRkw4YNW3UFYWvTpk1jyZIlvfI5JGkwswfaB7oyPdnaNDc3M3nyZM4+++yeKFuSVMMA7QNdmZ4M4I033uDggw/m0EMP5Re/+MWq5VdddRWHH354mwPNJUndy0O4faDK9GS33nrrqmWPPPIIDQ0NzJkzhw9+8IPstNNObLTRRvz0pz/l5z//eY/VLUn6XwZoH+js9GS33nrrqunJABoaGgDYfvvt2XfffXnkkUcYNmwYTz/9NLvvvjsAr732GrvvvjsPPvhgD38aSRqcPITbB7oyPdnLL7/Mm2++CcDixYu5//77GT9+PIcddhh/+tOfmD59OtOnT2f48OGGpyT1IHugfaAr05PNmjWLM844g/XWW4+33nqL0047bbWrdyVJvcOp/JzKT6U777yTr371qzQ3N/OJT3yC008/fbX1l112Gddffz1Dhw5lyy235NJLL11tvO0rr7zC3nvvzZFHHskFF1wAwFFHHcULL7zARhttBMCPf/xjb94s1bmOTuVnD1Si62NzAc4//3z22WefNbZ95ZVX0tTU1CufQ1LvMUAlVh+bC6wam1sboPvtt9+qx3vssQc33XTTqucPP/wwCxcu5JBDDuHhhx/utbr7my9ft3lfl9BtLjjxpb4uQX3Mi4gkujY296233uKss87inHPOabPt5z//efbff38uvPDCNocwSeqf7IFKdG1s7tVXX82hhx7K6NGj12h75ZVX0tjYyNKlSznxxBO58cYb+ehHP9q9xUvqEwaoRNfG5v7+97/nvvvu4+qrr2bZsmUsX76cESNGMHnyZBobGwHYeOONOe6443jooYcMUGmAMEAlVh+b29DQwC233ML3vve91dq0jM29+eabV7uStrbdlClTePjhh5k8eTIrV65kyZIlbLHFFqxYsYLbb7+dAw88sLc+kqQeZoBKdG1sbnvefPNNjjvuOFasWEFzczMHHHAAkyZN6q2PJKmHOQ7UcaBSr/Eq3IGh6pjpZ599lkmTJtHc3MyKFSs46aSTVv1BWk9jph0HKknqdl0ZM7311lvzq1/9ig033JBXX32V9773vRx++OGr5vfub2OmHcYiSeqwrtzPeIMNNlh18d3y5ct56623erf4bmaASpI6rKv3M543bx777rsvO++8M6eddtqq3if0vzHTHsLtBp7XkTRYdPV+xqNHj+buu+9mwYIFfOITn+Doo49mq6226pdjpu2BSpI6rLNjpqdMmbLa/YxbNDQ0MH78eO67775V24XVx0zXOwNUktRhXbmf8XPPPcfrr78OFPc2fuCBB9hhhx1YuXIlixcvBlg1ZnrChAm996Eq8hCuJKnDujJm+vHHH+ess84iIshMPve5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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 69, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -471,7 +438,62 @@ "# Execute and get counts\n", "result = execute(qc, simulator).result()\n", "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='O indíce procurado')" + "plot_histogram(counts, title='Índice Buscado')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Execução em uma máquina real\n", + "\n", + "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "\n", + "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "IBMQ.enable_account(MY_API_TOKEN)\n", + "IBMQ.backends(operational=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "backend = IBMQ.get_backend('ibmqx4')\n", + "\n", + "job_sim = execute(deutsch, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Índice Buscado')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fonte e mais informações: \n", + "\n", + "[IBMQ website](https://quantum-computing.ibm.com/support/guides/quantum-algorithms)
\n", + "[Quantum Computation and Quantum Information](https://books.google.com.br/books/about/Quantum_Computation_and_Quantum_Informat.html?id=-s4DEy7o-a0C&printsec=frontcover&source=kp_read_button&redir_esc=y#v=onepage&q&f=false)" ] }, { @@ -509,7 +531,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.7.3" } }, "nbformat": 4, From 6ef0e38fbec29414fbdbe9a7a4122ab250643c74 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Tue, 13 Aug 2019 21:09:06 -0300 Subject: [PATCH 38/49] update --- grover.ipynb | 250 ++++++++------------------------------------------- 1 file changed, 37 insertions(+), 213 deletions(-) diff --git a/grover.ipynb b/grover.ipynb index 1f2f3de..0966731 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -101,33 +101,9 @@ }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐     \n",
-       "q_0: |0>┤ H ├─────\n",
-       "        ├───┤     \n",
-       "q_1: |0>┤ H ├─────\n",
-       "        ├───┤┌───┐\n",
-       "q_2: |0>┤ X ├┤ H ├\n",
-       "        └───┘└───┘\n",
-       " c_0: 0 ══════════\n",
-       "                  \n",
-       " c_1: 0 ══════════\n",
-       "                  
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "qub = QuantumRegister(3,'q')\n", "cb = ClassicalRegister(2,'c')\n", @@ -158,33 +134,9 @@ }, { "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          \n",
-       "q_0: |0>┤ H ├───────■──\n",
-       "        ├───┤       │  \n",
-       "q_1: |0>┤ H ├───────■──\n",
-       "        ├───┤┌───┐┌─┴─┐\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├\n",
-       "        └───┘└───┘└───┘\n",
-       " c_0: 0 ═══════════════\n",
-       "                       \n",
-       " c_1: 0 ═══════════════\n",
-       "                       
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "qc.ccx(qub[0], qub[1], qub[2])\n", "qc.draw()" @@ -199,33 +151,9 @@ }, { "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤M├───\n",
-       "        ├───┤       │  └╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
-       "        └───┘└───┘└───┘ ║  ║ \n",
-       " c_0: 0 ════════════════╩══╬═\n",
-       "                           ║ \n",
-       " c_1: 0 ═══════════════════╩═\n",
-       "                             
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -242,21 +170,9 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFKCAYAAAB/8AR9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de7xVdZ3/8ddH1BTvRwkhISUMSROPWqF5HaPMsszMsibTphxtsouZZr+MNLM0TR1HxyTvjk2a1JhlmWHeR01RaVC8oCCCJuCFgRQ4fn5/rHWYzeGcw9pwLptzXs/H4zw4e63vXvuz9uLs915rfdd3RWYiSZJWbq3eLkCSpDWFoSlJUkWGpiRJFRmakiRVZGhKklSRoSlJUkWGptRNIuKiiDh5FZ97RETcWfN4o4h4PCLe3XUV9g0RsXVEZESs3du1qO8zNKWKyiCbEhGLIuL5iPj3iNi0o/aZeXRmfr+LXv4nwLmZeV8XLU/SKjA0pQoi4hvAGcA3gU2AscBbgT9GxLrd/NobA5Mz88LufJ2V1NAje3HuLarRGZrSSpShdQpwbGb+PjOXZOYzwKEUwfmPHTzv8og4rfx9n4iYFRHfiIi/RcSciDiypu3mEXFDRLwaEfcBb2udl5mvAhdExMiy7foRcXZEzIiIVyLizohYv5w3NiLujoiXI+LhiNink/V6JiJOioipEfFSRFwWEeu1qffEiHgeuKyc/sWIeDIi5pf1Dq1Z3vYR8cdy3gsR8e2270PtstvUcWJEPAIsjIi1I+JbEfFURCwo6/tYTfsBEXFWRMyNiOnAh9qs19CytvllrV/s6D2Q6mVoSiu3O7AeMLF2Ymb+L3ATMK7icrak2Et9C/BPFEG4WTnvAuA1YAjw+fKnI2cBu5R1NQEnAG9ExFuA3wKnldOPB66PiEGdLOszwAcoQvrtwHfa1NtE8cXgqIj4B+CHFF8WhgAzgP+E4pwrcAvwe2AoMBL4U6fvxvIOowi/TTNzKfAUsCfF+3UKcHVEDCnbfhH4MNAM7Aoc0mZZPwdmlXUcApweEfvVUYvUIUNTWrktgLnlh3lbc8r5VSwBTi33VH8H/C8wKiIGAB8HvpuZCzPzr8AV7S0gItaiCNSvZuZzmdmSmXdn5usUe7y/y8zfZeYbmflH4C/AAZ3U9G+Z+Wxmzgd+QBFerd4Axmfm65n5d4qAvTQzHyxf7yRgt4jYmiLEns/MszPztcxckJn3VnxfAP61rOPvAJl5XWbOLtfjF8ATQGsnqEMpzu+21v3DmvdnGLAHcGJZx0PAz4DP1lGL1CFDU1q5ucAWHZxvG1LOr2Jem+BdBGwIDALWBp6tmTejg2VsQbHX+1Q7894KfKI8NPtyRLxMESBD2mnbqu1rDq15/GJmvlbzeGhtXeWe9jyKPedhHdRUVW0dRMThEfFQzXrswP99ORnaTt21Nc7PzAVt5r9lNWqTljE0pZW7B3gdOLh2YkRsAHyQ+g5DtudFYClF8LQa3kHbuRSHcd/Wzrxngasyc9Oanw0y80edvHbb15xd87jtLZBmUwQzsGz9NweeK1+7vZoAFgIDax5v2U6bZa8VEW8FJgBfBjbPzE2BvwJRNpnTTt21NTaVh4tr5z/XQW1SXQxNaSUy8xWK82rnR8T+EbFOeUjyOopzZ1et5vJbKM6Xfi8iBkbEO4DPddD2DeBS4Cdlh5cBEbFbRLwJuBo4MCI+UE5fr+x0s1UnL/8vEbFVRDQB3wZ+0Unba4AjI2Kn8vVOB+4tO0XdCGwZEV+LiDdFcV3pe8rnPQQcEBFNEbEl8LWVvCUbUIToiwBlh6kdauZfC3ylrHsz4Fs178+zwN3AD8v135Hi/PF/rOQ1pUoMTamCzDyTIlTOAl4F7qXYu9qvPL+3ur5Mcaj2eeByyt6qHTgemALcD8ynuBRmrTIwPlrW+WJZ3zfp/O/8GuBmYHr5c1pHDTPzT8DJwPUUe3tvAz5VzltA0SHqwHIdngD2LZ96FfAw8Ez5Wp0FM5k5FTibYg//BeCdwF01TSYAfyiX+SBtOmhRnJfdmmKv81cU52X/2NlrSlWFN6GW+qeIeAb4Qmbe0tu1SGsK9zQlSarI0JQkqSIPz0qSVJF7mpIkVWRoSpJUUb++o8Dmm2+ew4d3dA25JKk/euihh+ZmZrtjNvfr0Bw+fDiTJk3q7TIkSQ2kqampo2EsPTwrSVJVhqYkSRUZmpIkVWRoSpJUkaEpSVJFhqYkSRUZmpIkVWRoSpJUkaEpSVJFhqYkSRUZmpIkVWRoSpJUkaEpSVJFhqYkSRUZmpIkVWRoSpJUkaEpSVJFhqYkSRUZmpIkVWRoSpJUkaEpSVJFhqYkSRUZmlLplltu4d3vfje77LIL55577grzL7jgAsaOHcsee+zBQQcdxLPPPrts3qxZszj44IN5z3vew9ixY5k5cyYARx11FO9+97vZfffd+fKXv8ySJUt6bH0kdT1DUwJaWlo44YQTuPbaa7nnnnu4/vrreeyxx5Zrs+OOOzJp0iTuvPNOPvKRjzB+/Phl84455hiOPfZY7r33Xm655Ra22GILAD7xiU9w7733ctddd/Haa69x1VVX9eh6SepahqYEPPDAA2yzzTZsvfXWrLvuuhx88MHcdNNNy7XZc889GThwIAC77rors2fPBuCxxx5j6dKl7LvvvgBsuOGGy9qNGzeOiCAi2HnnnZc9R9KaydCUgDlz5vCWt7xl2eOhQ4cyZ86cDttfffXVvO997wPgqaeeYpNNNuHwww9n77335rvf/S4tLS3LtV+yZAnXXnst++23X/esgKQeYWhKQGauMC0i2m177bXXMnnyZI499lgAli5dyj333MOpp57Kn/70J5555hmuueaa5Z5z/PHHs9tuu7Hbbrt1ffGSeszavV2A1AiGDh3Kc889t+zx7Nmz2XLLLVdo9+c//5mzzz6bG2+8kTe96U3Lnrvjjjuy9dZbA/ChD32Iv/zlL8uec8YZZzBv3jzOOeec7l0JSd3OPU0J2HnnnZk+fTozZsxg8eLFTJw4kf3333+5No888gjHHXcc11xzDYMGDVruuS+//DJz584F4Pbbb2fUqFEAXHnllUyaNIkJEyaw1lr+uUlrumjvsFR/0dzcnJMmTertMtQg/vjHP/Ltb3+blpYWPvOZz/CNb3yD008/nebmZj74wQ/ysY99jKlTpzJ48GAAttpqq2WHYW+99VZOPvlkMpOddtqJc845h3XXXZdBgwYxbNgwNtxwQwA+/OEPc8IJJ/TaOkpauaampgcyc9f25hmahqYkqUZnoenxIkmSKjI0JUmqyNCUJKkiQ1OSVJfVGacZ4NVXX2X77bdfrlPcxIkT2WOPPdhtt92WG6Ky0RiavaQ7/tNdf/31vPe972WPPfbgkEMOYd68ed2+HpL6l9Udpxng9NNPZ/fdd1/2eP78+YwfP55f//rX3HPPPbz44ovcdtttPbI+9TI0e0F3/KdbunQpJ510EjfccAN33nkn22+/PRMmTOiR9ZHUf6zOOM0ADz30EC+++OKysZoBnnnmGUaOHLnsRgd77703v/nNb3pgbepnaPaC7vhPl5lkJosWLSIzWbBgQbsj2kjS6lidcZrfeOMNTj75ZE455ZTl2owYMYLHH3+cmTNnsnTpUn77298uN0JXIzE0e0F3/KdbZ511OOuss3jve9/LO97xDqZNm8ZnP/vZ7lkBSf3W6ozTfMkllzBu3Di22mqr5dptuummnH322Xz+85/ngAMOYPjw4ay9dmOO8tqYVfVxq/Kf7sYbbwQ6/k+3ZMkSLrvsMm677Ta23nprTjzxRM455xyOP/74rl8BSf3W6ozTfP/993PPPfdwySWXsHDhQhYvXswGG2zA+PHj2X///ZcNXXn55ZczYMCAnlmhOhmavaA7/tMdeOCBAGyzzTYAHHTQQe12MJKk1VE7TvOQIUOYOHEiF1988XJtWsdpvu6665Ybp7m23TXXXMNDDz20rL/Giy++yKBBg3j55Ze59NJLufTSS3tmherk4dlesDqDg1988cVMmTKFhx9+mFNPPZVPfepTjB8/niFDhjBt2rRlg4bfeuutvP3tb+/R9ZK6Q3f0ND/ttNPYYYcdGDZsWLfX39esvfbanHnmmRxyyCGMHTuWgw46iNGjR3P66acv65sxfvx4Fi5cyJFHHslee+3Fpz/96ZUu96STTmLs2LHsv//+fPWrX2XkyJHdvSqrxLFne2ns2dUZHLxV6ze1M888E4DLLruMiy66iHXWWYdhw4ZxwQUX0NTU1OPrJnWVlpYW3vWudzFx4kSGDh3Kfvvtx4QJE9huu+2WtbnjjjvYZZddGDhwIJdeeil33nnncnsp3/rWt5g3bx6bbbbZsr+V+++/n2HDhvGud71rhZCVHLC9Aw7Y3nedcMVmvV1Clznzcy/1dgm95r777uOMM87g+uuvB1h2T9Kvf/3r7bZ/5JFHOOGEE/j9738PFD3Nzz//fPbbb7/lvmC2GjZsmKGpFThgu6Q1Unf0NJdWhx2BJDWs7uhpLq0OQ1NSw+quyxukVWVoSmpY3XV5g7SqPKcpqWF11+UN48ePZ/vtt2fRokVsv/32/OhHP+ruVVEfYe9Ze8/2SfaelbSq7D0rSVIXMDQlSarI0JQkqSJDU5KkirzkRJL6MTvN1cfQ7AL+p5Ok/sHDs5IkVWRoSpJUUY+HZkR8KSKejojXIuKBiNizk7YHR8TNEfFiRCyIiHsj4iOdtD8sIjIibuye6iVJ/VmPhmZEfBI4DzgdaAbuBm6KiOEdPGVvYBLwobL974BftRe0ETEC+DFwRzeULklSj+9pHgdcnpkTMvPRzDwWmAMc017jzPxqZv4oM+/LzCcz8xTgAeCg2nYRsQ7wc+D/AdO7dxUkSf1Vj/WejYh1gV2As9rMuhnYvY5FbQS07eL5A+CZzLwiIvZd9SoldSd7mmtN15OXnGwBDABeaDP9BeB9VRYQEf8CbAVcVTPt/cAngZ0qLuMo4CiAIUOG8OCDDwLFffsGDhzIk08+CcAmm2zCiBEjmDx5MgADBgxgzJgxTJs2jYULFwIwevRo5s+fD/SdD4LW92PEiBEsXryYWbNmATB48GCampp49NFHAdhggw0YNWoUDz/8MC0tLQA0Nzczffp0XnnlFQBGjhzJokWLmD17NlC83xtvvDHTpk0DYKONNmLbbbdl8uTJZCYRQXNzM0888QQLFiwAYNSoUbz66qvMmTMHqL6d+pIpU6awZMkSAMaMGcPMmTN56aXiA3tN2059Sevfyvrrr8/o0aPX2O3Ulz6/5s2bx4wZMwAYNGgQgwYNYurUqUB926kzPXaXk4gYCjwH7JWZd9RMHw8clpnbreT5H6cIy09l5g3ltC2AR4BPZ+afy2mXA1tk5odXVlNX3eXEb8+Nx23SmNwujcdtsqLO7nLSk3uac4EWoO1t19/Minufy6kJzMNbA7O0AzAEuCUiWqetVT5nKbB9Zk5b/dIlSerBjkCZuZiiE8+4NrPGUfSibVdEHApcDRyRmb9sM/t+4J0Uh2Zbf26g6EG7E/B0lxQvSRI9P4zeT4CrIuI+4C7gaGAocBFARFwJkJmHl48/RbGHeTxwe0S07qUuzsz5mbkQ+GvtC0TEy8DambncdEmSVlePhmZm/iIiNge+Q3FY9a/AAZk5o2zS9nrNoylqPLf8aXUbsE/3VitJ0vJ6fMD2zLwQuLCDeft09rji8o9YlbokSVoZx56VJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKmiukIzIg6NiPfXPP5uRMyKiD9ExJCuL0+SpMZR757m91p/iYidgW8D/wqsA5zddWVJktR41q6z/VuBaeXvHwN+nZlnRsTNwB+6tDJJkhpMvXuarwEblb/vB9xS/v5KzXRJkvqkevc07wDOjog7gV2BQ8rpbwee7crCJElqNPXuaX4ZWEwRlkdn5uxy+gfx8KwkqY+ra08zM2cBB7Yz/WtdVpEkSQ2q7us0I2K9iDgkIk6MiE3LaW+LiKauL0+SpMZR155mRIyk6PyzIbApcB3wMnBM+fgLXV2gJEmNot49zXOBm4HBwN9rpt8A7NtVRUmS1Ijq7T27OzA2M1sionb6TGBol1UlSVIDWpWxZ9dpZ9pwims1JUnqs+oNzZuB42oeZ0RsDJwC/LbLqpIkqQHVe3j2OODWiJgGrAf8AhgJvAAc2sW1SZLUUOq9TnN2ROwEHAbsTLGnejHwH5n5906fLEnSGq7ePU3KcLy0/JEkqd9YaWhGxMHAbzJzSfl7hzJzYpdVJklSg6myp/lLYEvgb+XvHUlgQFcUJUlSI1ppaGbmWu39LklSf1NXCEbEXhGxQtBGxICI2KvrypIkqfHUu+d4K9DewOyblvMkSeqz6g3NoDh32dbmwMLVL0eSpMZV6ZKTiLih/DWBqyPi9ZrZA4AdgLu7uDZJkhpK1es055X/BvASy9/hZDFwJzChC+uSJKnhVArNzDwSICKeAc7KTA/FSpL6nXqH0TuluwqRJKnRVRkR6BFg78x8KSKm0H5HIAAyc8euLE6SpEZSZU/zeqC1409nIwJJktSnVRkR6JT2fpckqb9xWDxJkiqqck6z0/OYtTynKUnqy6re5USSpH6vrnOakiT1Zz1+TjMivhQRT0fEaxHxQETs2UnbIRFxTUQ8FhEtEXF5B+02joh/jYjZEfF6RDwZEYd220pIkvqlHr1OMyI+CZwHfIli6L0vATdFxDsyc2Y7T3kTMBf4EXBUB8tcB7iZYni/Q4FZwFb832UykiR1iZ6+TvM44PLMbB2n9tiI2B84BjipbePMfAb4CkBEHNLBMo8E3gzslZmLy2nPrGadkiStoMeu04yIdYFdgLPazLoZ2H1VlwscBNwFnB8RHwXmA9cCP8jMJauxXEmSllPX2LOtIuJtwOjy4aOZ+VSFp21BcRuxF9pMfwF436rUURoB/ANwDfAhYGvgAmBD4Pi2jSPiKMpDvUOGDOHBBx8EYOjQoQwcOJAnn3wSgE022YQRI0YwefJkAAYMGMCYMWOYNm0aCxcW49WPHj2a+fPnA5utRvmNpfX9GDFiBIsXL2bWrFkADB48mKamJh599FEANthgA0aNGsXDDz9MS0sLAM3NzUyfPp1XXnkFgJEjR7Jo0SJmz54NFO/3xhtvzLRp0wDYaKON2HbbbZk8eTKZSUTQ3NzME088wYIFCwAYNWoUr776KnPmzAGqb6e+ZMqUKSxZUnz/GzNmDDNnzuSll14C1rzt1Je0/q2sv/76jB49eo3dTn3p82vevHnMmDEDgEGDBjFo0CCmTp0K1LedOhOZlS7BLBpHbA5cAnwEeKN1MnAj8PnMnNfJc4cCz1EcRr2jZvp44LDM3G4lr30jMDczj2gz/XFgPWCbzGwppx0FnANsmJ2sYHNzc06aNKmzl63khCv6zn+6Mz/3Um+X0CXcJo3J7dJ43CYrampqeiAzd21vXr29Z38GjAT2pAiq9YC9gG1Y+f005wItwJZtpr+ZFfc+6zEHeLw1MEuPAgMp9m4lSeoS9YbmB4AvZuZdmbm0/LkL+OdyXofKTjoPAOPazBoH3F1nHbXuAkZGRO26vB1YRBHUkiR1iXpD80WgvRtQLwI6PDRb4yfAERHxhYgYHRHnAUOBiwAi4sqIuLL2CRGxU0TsBGwMNJWP31HT5N+BJuC8iBgVER8ATgEu7OzQrCRJ9aq3I9CpwLkR8dnMfA4gIt4CnF3O61Rm/qI8L/odYAjwV+CAzJxRNhneztMmt3l8IDCDosMPmflsRLyfIpAfAp4HLgVOq2/VJEnq3KoM2L4N8ExEPFc+fgvwGsW5yZ+tbHmZeSFwYQfz9mlnWlRY5n+zepetSJK0Ug7YLklSRQ7YLklSRd6EWpKkiuoKzYhYNyJOiYjHy7uUtNT+dFeRkiQ1gnr3NL8PfI6it+wbwDcphqybR3HHEkmS+qx6Q/NQ4OjM/CnF6D7/lZlfAcaz4qAFkiT1KfWG5mBgavn7/wKblr//Hnh/VxUlSVIjqjc0Z1KM4APwJP83dN5uwN+7qihJkhpRvaH5K2C/8vfzgFMi4mngcioMbCBJ0pqsrmH0MvOkmt9/GRGzKEbieTwzb+zq4iRJaiSrdBPqVuXwdf/dRbVIktTQ6h7cICJ2Lu9G8pfy56qI2Lk7ipMkqZHUO7jBZ4D7Ke5Q8rvyZzBwX0T8Y9eXJ0lS46j38OwPgJMz8/TaiRFxEsWtuK7uqsIkSWo09R6eHQRc28706yhuDSZJUp9Vb2jeCuzTzvR9gNtWtxhJkhpZlZtQH1zz8CbghxGxK//Xa3YscDDwvS6vTpKkBrKqN6E+qvypdT5w4WpXJElSg6pyE2rvuSlJEt6EWpKkylZlcIMPRcTtETE3Il6MiNsi4oDuKE6SpEZS7+AGX6AYtP0p4ETgW8DTwK8i4vNdX54kSY2j3sENTgSOy8x/q5l2SUQ8QBGgl3ZZZZIkNZh6D88Op7jhdFs3AW9d/XIkSWpcq3IT6nHtTH8/MGP1y5EkqXHVe3j2LOD88q4mdwMJ7AF8Fji2i2uTJKmh1HsT6p9GxN+Ab1CMAgTwKHBoZv5XVxcnSVIjqRyaEbE2xWHY2zPzV91XkiRJjanyOc3MXApMBDbqvnIkSWpc9XYEehgY2R2FSJLU6OoNze8BZ0fEQRExLCKaan+6oT5JkhpGvb1nf1v+O5Gi52yrKB8P6IqiJElqRPWG5r7dUoUkSWuASqEZEQOBHwMHAesAtwBfycy53VibJEkNpeo5zVOAIygOz/6cYlSgf++mmiRJakhVD88eDPxTZv4nQET8B3BXRAzIzJZuq06SpAZSdU9zGHBH64PMvA9YCgztjqIkSWpEVUNzALC4zbSl1N+RSJKkNVbV0Avg6oh4vWbaesCEiFjUOiEzP9KVxUmS1EiqhuYV7Uy7uisLkSSp0VUKzcw8srsLkSSp0dU7jJ4kSf2WoSlJUkWGpiRJFRmakiRVZGhKklSRoSlJUkWGpiRJFRmakiRVZGhKklSRoSlJUkWGpiRJFRmakiRVZGhKklSRoSlJUkWGpiRJFRmakiRVZGhKklRRj4dmRHwpIp6OiNci4oGI2HMl7fcu270WEdMj4ug28wdExPdrlvl0RJwWEWt375pIkvqbHg3NiPgkcB5wOtAM3A3cFBHDO2i/DfC7sl0z8EPg/Ij4eE2zE4F/Ab4CbAd8tXx8UjethiSpn+rpvbHjgMszc0L5+NiI2B84hvZD7mhgdmYeWz5+NCLeAxwPXF9O2x34TWb+pnz8TETcALynW9ZAktRv9dieZkSsC+wC3Nxm1s0Uwdee3dpp/wdg14hYp3x8J7BvRGxXvs47gH+g2EOVJKnL9OSe5hbAAOCFNtNfAN7XwXO2BG5pp/3a5fLmAGcAGwFTI6KlnPeDzLywvQVGxFHAUQBDhgzhwQcfBGDo0KEMHDiQJ598EoBNNtmEESNGMHnyZAAGDBjAmDFjmDZtGgsXLgRg9OjRzJ8/H9is0huwJmh9P0aMGMHixYuZNWsWAIMHD6apqYlHH30UgA022IBRo0bx8MMP09LSAkBzczPTp0/nlVdeAWDkyJEsWrSI2bNnA8X7vfHGGzNt2jQANtpoI7bddlsmT55MZhIRNDc388QTT7BgwQIARo0axauvvsqcOXOA6tupL5kyZQpLliwBYMyYMcycOZOXXnoJWPO2U1/S+rey/vrrM3r06DV2O/Wlz6958+YxY8YMAAYNGsSgQYOYOnUqUN926kxkZjeuQs0LRQwFngP2ysw7aqaPBw7LzO3aec7jwFWZ+f2aaXsDfwaGZObzEfEp4MfAN4H/AXaiOG/6zcy8pLOampubc9KkSau9bidc0Xf+0535uZd6u4Qu4TZpTG6XxuM2WVFTU9MDmblre/N6ck9zLtBCsfdY682suPfZ6vkO2i8F5pWPfwyclZn/WT6eEhFvpThH2mloSpJUjx47p5mZi4EHgHFtZo2j6B3bnntY8dDtOOAvmbmkfDyQIoxrteA1qJKkLtbTvWd/AlwVEfcBd1H0jh0KXAQQEVcCZObhZfuLgC9HxLnAT4H3AkcAh9Us8zfAtyLiaYrDs80UvXSv7O6VkST1Lz0ampn5i4jYHPgOMAT4K3BAZs4omwxv0/7piDgAOIfispTZwFcy8/qaZscC3wcupDh0OweYAJzanesiSep/enzUnLJXa7s9WzNzn3am3Qbs3MnyFgBfK38kSeo2nveTJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIoMTUmSKjI0JUmqyNCUJKkiQ1OSpIp6PDQj4ksR8XREvBYRD0TEnitpv3fZ7rWImB4RR6/uMiVJWhU9GpoR8UngPOB0oBm4G7gpIoZ30H4b4Hdlu2bgh8D5EfHxVV2mJEmrqqf3NI8DLs/MCZn5aGYeC8wBjumg/dHA7Mw8tmw/AbgCOH41lilJ0irpsdCMiHWBXYCb28y6Gdi9g6ft1k77PwC7RsQ6q7hMSZJWydo9+FpbAAOAF9pMfwF4XwfP2RK4pZ32a5fLi3qXGRFHAUeVD/+3qalpWpXiG8AWwNzufpGffb27X6HP6fbt4japm38rjWlN+lt5a0czejI0W2Wbx0ns5WEAAAazSURBVNHOtJW1b50enbRpd5mZeTFw8crLbCwR8ZfM3LW369Dy3C6Nx23SmPrKdunJ0JwLtFDsPdZ6MyvuKbZ6voP2S4F5FOFY7zIlSVolPXZOMzMXAw8A49rMGkfR47U997DiYdZxwF8yc8kqLlOSpFXS04dnfwJcFRH3AXdR9I4dClwEEBFXAmTm4WX7i4AvR8S5wE+B9wJHAIdVXWYfssYdUu4n3C6Nx23SmPrEdonMzk4ndsMLRnwJOAEYAvwV+Hpm3l7O+zNAZu5T035v4Bxge2A2cEZmXlR1mZIkdZUeD01JktZUjj0rSVJFhqYkSRUZmpIkVWRoSuozIiJq/5W6mh2BGlhEbAWMpBjE4Q1gWmY+37tVSWuO1vBMP+jURQzNBhURxwCfB8YAC4EngVkUAz78V2ZOi4i1MvONXiyzX4mI9TPz771dh1YUEWsBHwUGAQOB54DbMvNvvVqY+hxDswFFxOYUIXk28O8UHwTvA/YFtqP4QPhaZk6NiPBbdPeLiM2Ah4HfAlcDd7e+77XbICK2o7id3au9Vmw/ExEbAZdQ/H28QfHlMoG/A7cBV2fmY/6t9JyIWAfYBpiRma/3dj1dyXOajenTwOOZeVpmzsvMxzLz3zLz48A/A+sDN0bEFn4I9Jh/BAZT3IruduDJiDg1IkbVBOYw4OcUd3NQz/kKMAo4IDMHA58BzgX+B/gAcGZEDPJvpUf9CzAZuCgiDoyILSNiQG2DiNg4Ij5YBuwaw9BsTIuBjSJiB4CIeFN571Ay806KD4XXgPf3Xon9zo7AZcCHgWbgWorhHKdGxH+Xt5z7R2DbzJzee2X2S/sDV2Tm/QDll8yrKT64vwGMBq7qxfr6o08C91H0yfg1xWmlH0fEHhGxSdnm08D4zFzSSzWuEkOzMf2S4jDT1yJio8x8PTMXl+dtyMyZwMvAVr1ZZH8REW8CpgLPZubfMvORzDwJ2JViT2Yq8D3gB8AZvVZoPxQRa1MMnfnxiBhUThsQEQMys6UcTvNoYKuIGNObtfYX5XZYAkzIzD0p7k15CcUXztuBSRFxIvA14N5eK3QVeU6zwdR0lf8ocB7QRLFXcyHF4Y6tgL0oznW+MzOf6YUy+50yODfLzOfLw0xZ2wkrIvYBJgHDM3NWL5XZL0XEWOA/KL5s/iQzX2gzfxjwKDAqM5/rhRL7lYgYAnwKmJqZf2gzrxn4Qjl/M2DYmrZNDM0GFRGbAsOB3YGPUdzhBYp7jK4FXJmZ3+ud6vqX1g4kETECWFj7oVwz77vAEZk5ovcq7X/Koy9rAUcCp1PcuemXwC+AZykOqx8IjM7Md/VWnf1NRKxP8cXytdprZmvO//+A4hx0c2/VuKoMzQYSEW8GPktxHmYuRe+/l4E7KA5jrAO8DfgD8IQdG7pfzTY5DvgbxQ3Q5wDXARMzc2H5ofBFil6zN/Zasf1c+UXzCIpzZTsBC4DXKc6t/TAz17hDgWuyjnorR8RA4EHgssxc405nGJoNJCIup7gF2m+A+RSHZt8JvJ3iA/s7/uH3rA62STPFpT+zgB9n5s29VmA/FhEbAwtqP5jLPc/1gA2BHSiODPg300Pa2ybttFmPoqPQzzNzcY8V10UMzQZR7q0soDhkcXvNtOHAWOCfgBHAoZn5YK8V2o90sk2GAe+h2Lt8K3CY26TnRcRPKfYi76O4HnCFa2MjYrPMfMlrNHtGxW2yaWa+3OPFdRF7zzaOdwBPU1xuAhTH/zNzRmb+guK8zMvAJ3qpvv6oo20yMzOvo+gNuAC3SY+LiMMovrScDfwXxeUMB0fEyPJ8GhGxIXBZRLzTwOx+HWyTj0XE22q2yfrAFa2X062J3NNsEOV/phsphgA7HHiq7RB5EXEs8E+ZuVMvlNjvuE0aV0RMAFqAM4GDgc9RnO+fBvwO+BPFgAfnZea6vVVnf9Jftol7mg2iHNP0/1GM9nMlcHhEDIuIDWDZyfO9Ka5JUw9wmzSm8trMp4GXM3N6Zp6Vme8E3kUxbN7nKC7TOh8HNegR/WmbuKfZYMrDFicDH6EYqP0e4EWKsWfnAF/IzCm9V2H/4zZpPOVYwIPLMWXXBZa06RD0SYohDXfOzId6q87+pL9sE0OzQZWXOnwIOIhiyLy/Atdl5mO9Wlg/5jZpbGXP2cjMloj4IsVhwIG9XVd/1he3iaG5BghvAdZw3CaNLSKOAwZk5o97uxYV+so2MTQl9TnlnTNa/GLTOPrKNjE0JUmqyN6zkiRVZGhKklSRoSlJUkWGpiRJFRmakiRVZGhKklTR/wdz3wdvNZO+FQAAAABJRU5ErkJggg==\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -361,20 +277,9 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "#Inicialização dos estados\n", "qub = QuantumRegister(3,'q')\n", @@ -430,20 +335,9 @@ }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Oracle\n", "qc.ccx(qub[0], qub[1], qub[2])\n", @@ -459,20 +353,9 @@ }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "#---Hadamard\n", "qc.h(qub[0])\n", @@ -491,20 +374,9 @@ }, { "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "#----Troca de fase\n", "qc.x(qub[0])\n", @@ -524,21 +396,9 @@ }, { "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "#--- Hadarmard\n", "qc.h(qub)\n", @@ -556,57 +416,21 @@ }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
              ░ ┌───┐ ░       ░ ┌───┐ ░ ┌───┐          ┌───┐      ░ ┌───┐┌─┐   \n",
-       "q_0: |0>──────░─┤ H ├─░───■───░─┤ H ├─░─┤ X ├───────■──┤ X ├──────░─┤ H ├┤M├───\n",
-       "              ░ ├───┤ ░   │   ░ ├───┤ ░ ├───┤┌───┐┌─┴─┐├───┤┌───┐ ░ ├───┤└╥┘┌─┐\n",
-       "q_1: |0>──────░─┤ H ├─░───■───░─┤ H ├─░─┤ X ├┤ H ├┤ X ├┤ H ├┤ X ├─░─┤ H ├─╫─┤M├\n",
-       "        ┌───┐ ░ ├───┤ ░ ┌─┴─┐ ░ └───┘ ░ └───┘└───┘└───┘└───┘└───┘ ░ ├───┤ ║ └╥┘\n",
-       "q_2: |0>┤ X ├─░─┤ H ├─░─┤ X ├─░───────░───────────────────────────░─┤ H ├─╫──╫─\n",
-       "        └───┘ ░ └───┘ ░ └───┘ ░       ░                           ░ └───┘ ║  ║ \n",
-       " c_0: 0 ══════════════════════════════════════════════════════════════════╩══╬═\n",
-       "                                                                             ║ \n",
-       " c_1: 0 ═════════════════════════════════════════════════════════════════════╩═\n",
-       "                                                                               
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", "\n", - "qc.draw()" + "qc.draw(output='mpl')" ] }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -614,7 +438,7 @@ "# Execute and get counts\n", "result = execute(qc, simulator).result()\n", "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='O indíce procurado')" + "plot_histogram(counts, title='Índice Buscado')" ] }, { @@ -659,7 +483,7 @@ "sim_result = job_sim.result()\n", "\n", "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')" + "plot_histogram(counts, title='Índice Buscado')" ] }, { From 4e94d7eb03bee2c49f0f461bc52247d5cca51711 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Wed, 14 Aug 2019 21:53:54 -0300 Subject: [PATCH 39/49] =?UTF-8?q?=C3=9Alitmos=20ajustes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deutsch_jozsa.ipynb | 208 ++++++++++++++++++++++++++++---------------- 1 file changed, 133 insertions(+), 75 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 3f841a2..8a7a35b 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -52,7 +52,7 @@ " \n", " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", "\n", - "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", + "$$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", " \n", " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", " " @@ -74,9 +74,9 @@ "\n", "### Como o algoritmo funciona:\n", "\n", - "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é um valor e metade a outra outro. Nesse caso, isso se resumiria no fato de para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", "\n", - "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", + "Para isso iremos utilizar o conceito apresentado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", "\n", "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", "\n", @@ -106,70 +106,36 @@ "metadata": {}, "source": [ "\n", - "### Exemplo:\n", - "\n", - "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", - "\n", - "Suponha que temos uma função $f$ em que $f(0) = 1$ e $f(1) = 1$ que claramente esse é uma função constante.\n", - "\n", - "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "### Passos do Algoritmo:\n", "\n", "#### 1º Passo:\n", "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", - "\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", - "\n", + "Incializar os registradores \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "#### 2º Passo:\n", "\n", - "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", - "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", - "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", - "\n", - "$|\\psi_3\\rangle = \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{2}\\right)$\n", - "\n", - "\n", - "#### 3º Passo:\n", - "\n", - "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", - "\n", - "\n", - "$|\\psi_4\\rangle = U_f\\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "$|\\psi_4\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "$|\\psi_4\\rangle = \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "\n", - "#### 4º Passo:\n", + "Considerando que o registrador de entrada deve se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancilla encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Esses estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", "\n", - "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", "\n", - "$|\\psi_5\\rangle = |1\\rangle|1\\rangle$\n", - "\n" + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Esses estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", - "\n", - "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", + "#### 3º Passo:\n", "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", "\n", "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", "\n", @@ -191,6 +157,16 @@ "\n", "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4º Passo:\n", + "\n", + "\n", "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", "\n", "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", @@ -206,8 +182,10 @@ "\n", "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", "\n", - "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", - "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" + "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|00\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", + "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n", + "\n", + "\n" ] }, { @@ -244,10 +222,10 @@ "source": [ "## Problema de Deutch Jozsa\n", "\n", - "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Para o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", "\n", "\n", - "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "Porém, antes de seguirmos com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancilla nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim, a evolução do sistema ficaria da seguinte forma:\n", "\n", "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", "\n", @@ -280,7 +258,7 @@ "\n", "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se as células de cada linha da matriz $H^{\\otimes N}$ e realizassem um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", "\n", "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", @@ -293,11 +271,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Exemplo prático\n", - "\n", - "Agora nós vamos fazer um exemplo prático do algoritmo considerando a seguinte função, onde:\n", - "\n", - "f(0) = 0; f(1)=1;\n" + "## Exemplo prático :\n" ] }, { @@ -306,12 +280,17 @@ "source": [ "### Incializando os nossos qubits\n", "\n", - "Inicializaremos o qubit de entrada da função e o auxiliar (ancilla):\n" + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. \n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 1$ e $f(1) = 0$ que claramente esse é uma função balanceada.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 81, "metadata": {}, "outputs": [], "source": [ @@ -329,50 +308,129 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Depois disso iniciaremos a construção do circuito com um Hadamard no primeiro\n", - "e segundo qubits e depois o portão c-not que é uma representação para a nossa função." + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle \\rightarrow |0\\rangle|1\\rangle$\n", + "\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle \\rightarrow \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "\n", + "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{2}\\right)$\n" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "qc.h(q[0])\n", - "qc.h(q[1])\n", + "#preparando o ancilla\n", + "qc.x(q[1])\n", "\n", - "qc.cx(q[0], q[1])\n", + "qc.barrier()\n", "\n", + "qc.h(q[1])\n", "qc.h(q[0])\n", "\n", - "qc.measure(q[0], c[0])" + "qc.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Então, aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador **X**\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\left(\\frac{-|00\\rangle + |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "$|\\psi_4\\rangle = -\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc.x(q[0])\n", + "qc.barrier()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Agora basta aplicarmos o Hadarmad ao estado atual e medirmos\n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = -|1\\rangle|0\\rangle$" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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+HCFhoZqxYoV2rZtmw4dOiRJGjdunPr166cPP/zQtJp8wWOPPaYTJ07o3XffVWZmpvMG4YCAAKtLc8v+/futLsEtVVVV8vf3V0xMjMv4nj17FBUVpSFDhlhUmft8pdd9ga/0ui+c1+i9vvrqK82bN09RUVHavn27Bg0a5NZ+l+5JfP/99/WDH/xAn3/+uZ5++mkvV+sbrigo/u53v9PPf/5zvfrqq2psbNTMmTP18ssva/z48V3u29zcrF27djnDYWRkpFJSUrR79+4e1VJQUKCxY8e6vX1jY6OOHDmiuLg459iIESPkcDi0d+9e59isWbO4/Pwd1157rZYuXaoFCxaovLxc27Ztk8PhsLost5l5e8OVqKqq0siRIxUUFOQyvmfPHp+ZdfGVXvcFvtLrvnBeo/cqLCzUv/71L7355psaMGCAW/tcComXLjevX7/eeTV0z549Xq649zO+cdANX331lZ544gmtW7dOSUlJkqSMjAw9/vjjbgXF+vp6tbW16bXXXlNZWZlGjRqllStXavr06fr0008VFhamqVOnqrq6WkuWLOky2efm5io3N9ft+puamiRJoaGhLuNhYWHO1yRpxowZysvLU35+vtvv3RNdTYt7U3Jyco/2a25uVm5urqKiorq9b0VFhVe+55/97GdubVdaWnrZ11988UVPlNNBd3pdVVWlgwcPKjIy0mX87NmzysvLc/t97NrrvqQ397q7Pz96+3ltpcLcnxh+jc59+/w7d+6cfvvb3+ree+9VamqqW/t/NyReuifxhRde0OrVq/XKK6/otddec9mnL5570sX7hI30OChWVFSora1N06ZNc45d+qxRd4JiSEiIJGnhwoXOmcC8vDwVFRVpx44dmj59utasWaPt27c77x/0pEvHb2xsdBlvaGhwmR07fPiwhg4d6vHjf1dnf0He1t0nwSVp3bp1+tWvfqVFixbppZdeUkZGRrf/0SQnJ6u8vLzbx+7KgQMHutzmxRdfVGZm5mW3KS4u9lRJTt3t9e7du7Vs2TLNnz/fZXzMmDHdmnmxY6/7mt7a6578/Ojt57VVcgtLVZCT2eFrdO6759+2bdt08uRJt2fXOwuJ0sVJo7lz52rDhg1atWqVrrnmGudrfe3c60qPLz2fPHlS1113ncvYhg0bNHDgQA0cOLDL/UNDQxUdHW0YMC6NDR48uKfldSks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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc.h(q)\n", + "qc.measure(q, c)\n", + "qc.draw(output='mpl')" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 85, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] }, - "execution_count": 4, + "execution_count": 85, "metadata": {}, "output_type": "execute_result" } From 7b826881ef26d13fb7a66554073ccc71eba10f58 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Wed, 14 Aug 2019 21:55:49 -0300 Subject: [PATCH 40/49] =?UTF-8?q?=C3=9Altimos=20ajustes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deutsch_jozsa.ipynb | 462 +++++++++++++------------------------------- 1 file changed, 131 insertions(+), 331 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 5624fba..8a7a35b 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -2,13 +2,10 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "Wyq5GSe00-zz" - }, + "metadata": {}, "source": [ "\n", - "# Problema de Deutch e Deutsch-Jozsa\n", + "# Problema de Deutch e Deutch-Jozsa\n", "\n", "## Observação dos autores\n", "\n", @@ -24,10 +21,7 @@ }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "qez2OAF20-z1" - }, + "metadata": {}, "source": [ "# Antes de começarmos\n", "\n", @@ -45,10 +39,7 @@ }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "7OchLNAJ0-z2" - }, + "metadata": {}, "source": [ "\n", "## Avaliando uma função\n", @@ -61,20 +52,17 @@ " \n", " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", "\n", - "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", + "$$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", " \n", - " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", " " ] }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "ZQX9PXmv0-z2" - }, + "metadata": {}, "source": [ - "# Problema de Deutsch\n", + "# Problema de Deutch\n", "\n", "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", "\n", @@ -86,9 +74,9 @@ "\n", "### Como o algoritmo funciona:\n", "\n", - "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é um valor e metade a outra outro. Nesse caso, isso se resumiria no fato de para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", "\n", - "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", + "Para isso iremos utilizar o conceito apresentado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", "\n", "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", "\n", @@ -98,10 +86,7 @@ }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "WIZ35iPF0-z3" - }, + "metadata": {}, "source": [ "**Antes de seguirmos para nosso exemplo:**\n", "\n", @@ -118,76 +103,94 @@ }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "6ssJ068G0-z4" - }, + "metadata": {}, "source": [ "\n", - "### Exemplo Teórico (1):\n", - "\n", - "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", - "\n", - "Suponha que temos uma função $f$ em que $f(0) = 0$ e $f(1) = 1$ que claramente esse é uma função balanceada.\n", - "\n", - "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "### Passos do Algoritmo:\n", "\n", "#### 1º Passo:\n", "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", + "Incializar os registradores \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2º Passo:\n", "\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", + "Considerando que o registrador de entrada deve se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancilla encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Esses estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", + "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", + "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", "\n", - "#### 2º Passo:\n", + "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", "\n", - "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", - "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3º Passo:\n", "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "$$\\begin{eqnarray}\n", + "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", + "\\end{eqnarray}$$\n", "\n", + "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", "\n", - "#### 3º Passo:\n", + "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", "\n", - "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", + "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", "\n", + "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", "\n", - "$|\\psi_4\\rangle = \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", + "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "#### 4º Passo:\n", "\n", - "Agora basta aplicarmos o Hadarmad ao estado atual \n", "\n", - "$|\\psi_5\\rangle = H\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)H\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", + "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", "\n", + "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", "\n", - "$|\\psi_5\\rangle = |1\\rangle|1\\rangle$\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", + "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", "\n", - "#### 5º Passo\n", + "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", "\n", - "Agora nós podemos fazer a medição do nosso sistema representado por $|\\psi_5\\rangle$. \n", + "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|00\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", + "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n", "\n", - "Podemos percebe que quando medirmos o nós iremos obter ambos os estados $|11\\rangle$ com probabilidade de \n", - "$100\\%$ mostrando que nossa função é balanceada. \n" + "\n" ] }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "k0hAHaBl0-z5" - }, + "metadata": {}, "source": [ "## Porta Hadamard para N qubits\n", "\n", @@ -215,17 +218,14 @@ }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "grdH81v50-z5" - }, + "metadata": {}, "source": [ - "## Problema de Deutsch Jozsa\n", + "## Problema de Deutch Jozsa\n", "\n", - "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Para o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", "\n", "\n", - "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", + "Porém, antes de seguirmos com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancilla nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim, a evolução do sistema ficaria da seguinte forma:\n", "\n", "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", "\n", @@ -258,7 +258,7 @@ "\n", "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se as células de cada linha da matriz $H^{\\otimes N}$ e realizassem um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", "\n", "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", @@ -269,66 +269,30 @@ }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "8kx_S9ma0-z6" - }, + "metadata": {}, "source": [ - "## Exemplo na prática Algoritmo de Deutsch:\n", - "\n", - "#### 1º Passo:\n", - "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", - "\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n" + "## Exemplo prático :\n" ] }, { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "G7Qi5gpI0-z7" - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "%matplotlib inline\n", - "# Importing standard Qiskit libraries and configuring account\n", - "import numpy as np\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", - "from qiskit.compiler import transpile, assemble\n", - "from qiskit.tools.jupyter import *\n", - "from qiskit.visualization import *\n", - "# Loading your IBM Q account(s)\n", - "#provider = IBMQ.load_account()" + "### Incializando os nossos qubits\n", + "\n", + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. \n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 1$ e $f(1) = 0$ que claramente esse é uma função balanceada.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$" ] }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "f_qVgKeo0-z-" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": 81, + "metadata": {}, + "outputs": [], "source": [ "\n", "from qiskit import QuantumRegister, ClassicalRegister\n", @@ -337,308 +301,149 @@ "\n", "q = QuantumRegister(2)\n", "c = ClassicalRegister(2)\n", - "deutsch = QuantumCircuit(q, c)\n", - "deutsch.x(q[1])" + "qc = QuantumCircuit(q, c)\n" ] }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "bVJ3nNyv0-0A" - }, + "metadata": {}, "source": [ - "#### 2º Passo:\n", - "\n", "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle \\rightarrow |0\\rangle|1\\rangle$\n", "\n", "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", - "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|0\\rangle + |1\\rangle\\right)\\left(|0\\rangle - |1\\rangle\\right)$\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle \\rightarrow \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", "\n", - "$|\\psi_3\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", "\n", - "\n" + "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{2}\\right)$\n" ] }, { "cell_type": "code", - "execution_count": 3, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "t9uCxnjM0-0B", - "outputId": "2dd6dc53-579d-421f-f5f4-8b5bbbee3ab2" - }, + "execution_count": 82, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "#preparando o ancilla\n", + "qc.x(q[1])\n", + "\n", + "qc.barrier()\n", "\n", - "deutsch.barrier()\n", + "qc.h(q[1])\n", + "qc.h(q[0])\n", "\n", - "deutsch.h(q[0])\n", - "deutsch.h(q[1])" + "qc.barrier()" ] }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "V2XfOWY90-0F" - }, + "metadata": {}, "source": [ + "Então, aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador **X**\n", "\n", - "#### 3º Passo:\n", - "\n", - "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", "\n", + "$|\\psi_4\\rangle = U_f\\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", "\n", - "$|\\psi_4\\rangle = U_f\\frac{1}{2}\\left(|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle\\right)$\n", + "$|\\psi_4\\rangle = \\left(\\frac{-|00\\rangle + |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", "\n", - "$|\\psi_4\\rangle = \\frac{1}{2}\\left(|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle\\right)$" + "$|\\psi_4\\rangle = -\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)$\n" ] }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "AuqlLDGb0-0G", - "outputId": "6ec32032-980d-41ea-afe9-97a16caa08c0" - }, + "execution_count": 83, + "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 4, + "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "deutsch.barrier()\n", - "\n", - "deutsch.cx(q[0], q[1])\n", - "\n", - "deutsch.barrier()" + "qc.x(q[0])\n", + "qc.barrier()\n" ] }, { "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "KhBke-Ic0-0I" - }, + "metadata": {}, "source": [ - "#### 4º Passo:\n", - "\n", - "Agora basta aplicarmos o Hadarmad ao estado atual \n", + "Agora basta aplicarmos o Hadarmad ao estado atual e medirmos\n", "\n", - "$|\\psi_5\\rangle = H\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)H\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", "\n", "\n", - "$|\\psi_5\\rangle = |1\\rangle|1\\rangle$\n", - "\n" + "$|\\psi_5\\rangle = -|1\\rangle|0\\rangle$" ] }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "piMOzgtC0-0J", - "outputId": "84290b41-f4a0-4458-a2ff-5099e0117610" - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "deutsch.h(q[0])\n", - "deutsch.h(q[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 34 - }, - "colab_type": "code", - "id": "5nk9lPFy0-0M", - "outputId": "0cb7c74c-afe3-4f92-b365-d042657e676a" - }, + "execution_count": 84, + "metadata": {}, "outputs": [ { "data": { + "image/png": "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+HCFhoZqxYoV2rZtmw4dOiRJGjdunPr166cPP/zQtJp8wWOPPaYTJ07o3XffVWZmpvMG4YCAAKtLc8v+/futLsEtVVVV8vf3V0xMjMv4nj17FBUVpSFDhlhUmft8pdd9ga/0ui+c1+i9vvrqK82bN09RUVHavn27Bg0a5NZ+l+5JfP/99/WDH/xAn3/+uZ5++mkvV+sbrigo/u53v9PPf/5zvfrqq2psbNTMmTP18ssva/z48V3u29zcrF27djnDYWRkpFJSUrR79+4e1VJQUKCxY8e6vX1jY6OOHDmiuLg459iIESPkcDi0d+9e59isWbO4/Pwd1157rZYuXaoFCxaovLxc27Ztk8PhsLost5l5e8OVqKqq0siRIxUUFOQyvmfPHp+ZdfGVXvcFvtLrvnBeo/cqLCzUv/71L7355psaMGCAW/tcComXLjevX7/eeTV0z549Xq649zO+cdANX331lZ544gmtW7dOSUlJkqSMjAw9/vjjbgXF+vp6tbW16bXXXlNZWZlGjRqllStXavr06fr0008VFhamqVOnqrq6WkuWLOky2efm5io3N9ft+puamiRJoaGhLuNhYWHO1yRpxowZysvLU35+vtvv3RNdTYt7U3Jyco/2a25uVm5urqKiorq9b0VFhVe+55/97GdubVdaWnrZ11988UVPlNNBd3pdVVWlgwcPKjIy0mX87NmzysvLc/t97NrrvqQ397q7Pz96+3ltpcLcnxh+jc59+/w7d+6cfvvb3+ree+9VamqqW/t/NyReuifxhRde0OrVq/XKK6/otddec9mnL5570sX7hI30OChWVFSora1N06ZNc45d+qxRd4JiSEiIJGnhwoXOmcC8vDwVFRVpx44dmj59utasWaPt27c77x/0pEvHb2xsdBlvaGhwmR07fPiwhg4d6vHjf1dnf0He1t0nwSVp3bp1+tWvfqVFixbppZdeUkZGRrf/0SQnJ6u8vLzbx+7KgQMHutzmxRdfVGZm5mW3KS4u9lRJTt3t9e7du7Vs2TLNnz/fZXzMmDHdmnmxY6/7mt7a6578/Ojt57VVcgtLVZCT2eFrdO6759+2bdt08uRJt2fXOwuJ0sVJo7lz52rDhg1atWqVrrnmGudrfe3c60qPLz2fPHlS1113ncvYhg0bNHDgQA0cOLDL/UNDQxUdHW0YMC6NDR48uKfldSks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\n", "text/plain": [ - "" + "
" ] }, - "execution_count": 6, + "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "deutsch.draw()\n", - "deutsch.measure(q, c)" + "qc.h(q)\n", + "qc.measure(q, c)\n", + "qc.draw(output='mpl')" ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 347 - }, - "colab_type": "code", - "id": "xseid-Rs0-0O", - "outputId": "954eabac-1797-4dd3-d3b7-6b569247d101" - }, + "execution_count": 85, + "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] }, - "execution_count": 7, + "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "backend = Aer.get_backend('qasm_simulator')\n", - "job_sim = execute(deutsch, backend)\n", + "job_sim = execute(qc, backend)\n", "sim_result = job_sim.result()\n", "\n", - "counts = sim_result.get_counts(deutsch)\n", + "counts = sim_result.get_counts(qc)\n", "plot_histogram(counts, title='Deutsch-Jozsa State')\n" ] }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "2a4gMB7p0-0Q" - }, - "source": [ - "### Execução em uma máquina real\n", - "\n", - "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "8NemenE90-0R" - }, - "outputs": [], - "source": [ - "import getpass\n", - "\n", - "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab_type": "text", - "id": "hTcp1gr60-0T" - }, - "source": [ - "Escolha um computador quântico operacional:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "B2Htjxfh0-0T" - }, - "outputs": [], - "source": [ - "IBMQ.enable_account(MY_API_TOKEN)\n", - "IBMQ.backends(operational=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "KkoEN8OB0-0V" - }, - "outputs": [], - "source": [ - "backend = IBMQ.get_backend('ibmqx4')\n", - "\n", - "job_sim = execute(deutsch, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "colab": {}, - "colab_type": "code", - "id": "d849tJAr0-0X" - }, - "source": [ - "### Fonte e mais informações: \n", - "\n", - "[IBMQ website!](https://quantum-computing.ibm.com/support/guides/quantum-algorithms)" - ] - }, { "cell_type": "code", "execution_count": null, @@ -648,11 +453,6 @@ } ], "metadata": { - "colab": { - "name": "deutsch_jozsa.ipynb", - "provenance": [], - "version": "0.3.2" - }, "kernelspec": { "display_name": "Python 3", "language": "python", @@ -672,5 +472,5 @@ } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 2 } From 4876a2d2ee9d0a834a8e5ae17e97f3cadc1f9254 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Wed, 14 Aug 2019 22:48:06 -0300 Subject: [PATCH 41/49] =?UTF-8?q?=C3=BAltimas=20altera=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- grover.ipynb | 292 ++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 244 insertions(+), 48 deletions(-) diff --git a/grover.ipynb b/grover.ipynb index 0966731..f4bec0a 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um conjunto desestruturado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em aproximadamente $\\sigma(\\sqrt{N/M})$ iterações, onde M é quantidade de soluções buscadas. \n", + " Dado um conjunto desestruturado de elementos de tamanho $N$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $N$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em aproximadamente $\\sigma(\\sqrt{N/M})$ iterações, onde M é quantidade de soluções buscadas. \n", " " ] }, @@ -101,9 +101,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐     \n",
+       "q_0: |0>┤ H ├─────\n",
+       "        ├───┤     \n",
+       "q_1: |0>┤ H ├─────\n",
+       "        ├───┤┌───┐\n",
+       "q_2: |0>┤ X ├┤ H ├\n",
+       "        └───┘└───┘\n",
+       " c_0: 0 ══════════\n",
+       "                  \n",
+       " c_1: 0 ══════════\n",
+       "                  
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qub = QuantumRegister(3,'q')\n", "cb = ClassicalRegister(2,'c')\n", @@ -134,9 +158,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐          \n",
+       "q_0: |0>┤ H ├───────■──\n",
+       "        ├───┤       │  \n",
+       "q_1: |0>┤ H ├───────■──\n",
+       "        ├───┤┌───┐┌─┴─┐\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├\n",
+       "        └───┘└───┘└───┘\n",
+       " c_0: 0 ═══════════════\n",
+       "                       \n",
+       " c_1: 0 ═══════════════\n",
+       "                       
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qc.ccx(qub[0], qub[1], qub[2])\n", "qc.draw()" @@ -151,9 +199,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐          ┌─┐   \n",
+       "q_0: |0>┤ H ├───────■──┤M├───\n",
+       "        ├───┤       │  └╥┘┌─┐\n",
+       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
+       "        └───┘└───┘└───┘ ║  ║ \n",
+       " c_0: 0 ════════════════╩══╬═\n",
+       "                           ║ \n",
+       " c_1: 0 ═══════════════════╩═\n",
+       "                             
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -170,9 +242,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFKCAYAAAB/8AR9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de5xVdb3/8deb4SIgoiOEICgihmMpjlKpP0U9ink/Rh5MzWtlXqLMTMsyxJROlqXHUNMsb9ERUis1y4gSUY4moqIgitxEwOSiEIgDw+f3x1ozbYY9w9ows2fPzPv5eMyDvdb6rrU/ay9mf+b7Xd/1/SoiMDMzsy1r19wBmJmZtRROmmZmZhk5aZqZmWXkpGlmZpaRk6aZmVlGTppmZmYZOWmaNRFJt0u6eiv3PVfSlJzlbpJel/TJxouwdZDUX1JIat/csVjr56RpllGayGZIWitpqaTbJO1YX/mIuDAivt9Ib/8T4KaIeK6RjmdmW8FJ0ywDSd8Afgh8E+gOHATsDvxFUscmfu8dgOkRcWtTvs8WYihKLc61RSt1TppmW5AmrdHAyIj4U0Ssj4j5wAiSxPn5eva7W9J16esjJC2S9A1J/5S0RNJ5OWV3lvQHSaskPQfsWbMtIlYBYyUNTMt2lnSjpAWS3pc0RVLndNtBkp6R9J6klyQd0cB5zZf0bUkzJa2U9CtJ29WJ90pJS4Ffpeu/JGmOpBVpvH1yjvcxSX9Jt70j6aq6n0PusevEcaWkl4E1ktpL+pakNyWtTuP7TE75Mkk/lrRM0lzghDrn1SeNbUUa65fq+wzMCuWkabZlhwDbAQ/lroyIfwGPA8MyHmcXklrqrsAXSBLhTum2scA6oDdwfvpTnx8DB6ZxlQNXABsl7Qo8BlyXrr8ceFBSzwaOdSbwaZIk/VHgu3XiLSf5w+ACSf8B/IDkj4XewALgfyG55wpMBP4E9AEGAn9t8NPY1OkkyW/HiNgAvAkcRvJ5jQbul9Q7Lfsl4ESgEhgCnFrnWL8BFqVxnAqMkXRUAbGY1ctJ02zLegDL0i/zupak27NYD1yb1lT/CPwLGCSpDPgs8L2IWBMRrwD35DuApHYkCfVrEfF2RFRHxDMR8SFJjfePEfHHiNgYEX8BngeObyCmn0XEWxGxArieJHnV2AiMiogPI+IDkgT7y4h4IX2/bwMHS+pPksSWRsSNEbEuIlZHxLMZPxeA/0nj+AAgIiZExOL0PB4A3gBqOkGNILm/WxP3D3I+n37AocCVaRwvAr8AziogFrN6OWmabdkyoEc999t6p9uzWF4n8a4Ftgd6Au2Bt3K2LajnGD1Iar1v5tm2O/BfadPse5LeI0kgvfOUrVH3PfvkLL8bEetylvvkxpXWtJeT1Jz71RNTVrlxIOlsSS/mnMfH+fcfJ33yxJ0b44qIWF1n+67bEJtZLSdNsy2bCnwIDM9dKakrcByFNUPm8y6wgSTx1NitnrLLSJpx98yz7S3gvojYMeena0T8dwPvXfc9F+cs150CaTFJYgZqz39n4O30vfPFBLAG6JKzvEueMrXvJWl34E7gK8DOEbEj8AqgtMiSPHHnxlieNhfnbn+7ntjMCuKkabYFEfE+yX21WyQdK6lD2iQ5geTe2X3bePxqkvul10jqImkf4Jx6ym4Efgn8JO3wUibpYEmdgPuBkyR9Ol2/Xdrppm8Db3+JpL6SyoGrgAcaKDsOOE/S/un7jQGeTTtFPQrsIulSSZ2UPFf6qXS/F4HjJZVL2gW4dAsfSVeSJPouQNph6uM528cDX03j3gn4Vs7n8xbwDPCD9Pz3I7l//OstvKdZJk6aZhlExA0kSeXHwCrgWZLa1VHp/b1t9RWSptqlwN2kvVXrcTkwA/gHsILkUZh2acL4zzTOd9P4vknDv+fjgCeAuenPdfUVjIi/AlcDD5LU9vYEPpduW03SIeqk9BzeAI5Md70PeAmYn75XQ4mZiJgJ3EhSw38H2Bd4OqfIncCf02O+QJ0OWiT3ZfuT1DofJrkv+5eG3tMsK3kSarO2SdJ84IsRMbG5YzFrKVzTNDMzy8hJ08zMLKOiJ01JF0uaJ2mdpGmSDmug7OHp6CbLJX0g6TVJl9cp8yVJT6Wjf7wn6W+SDm36MzFr2SKiv5tmzQpT1KQp6TTgZpJed5Ukvdwel1Rf9/p/Af8DDAX2IemkMFrSxTlljiDpWHAU8ClgNvBnSXs1xTmYmVnbVdSOQJKeBV6OiC/lrHsD+G1EfDvjMR4CPoyI0+vZLpKefddHxC2NELaZmRmQjEJSFEpmgjiQpMt+ridIxtDMcozKtOw1DRTrSDJiysp6jnEBcAFA586dD+zXL3lGukOHDrRr144PP0yeHigrK6Njx4588MEHtft26dKFdevWsXHjRgC22247NmzYwIYNG2qPIYmqqqq8x5BE586d+eCDD6j5Y6XuMTp2TCbMyD1Ghw4dWLduXYPHWL9+PdXV1XmP0b59e9q3b9/gMTp37kxVVdUmx4gI1q9fn/cY7dq1Y7vttmPt2rW1n0/dY3Tq1ImNGzfWHqPuZ5zvGHU/4y0dw9fJ18nXydepsa/Tq6++uiwi8o7ZXMxpeHoAZSTPXeV6Bzi6oR3TGRFqhhobHRG3N1D8OpJm3T/k2xgRdwB3AFRWVsakSZMyBW9mZm1DeXl5fcNYFjVp1qjbHqw86+o6jOTB74OAH0qaFxGbjcIi6WvAl4Gj0+mUzMzMGk0xk+YyoJrNx538CJvXPjcREfPSlzMk9SJpnt0kaaYJ8zrgOM9ub2ZmTaFovWcjogqYxuZzDw4j6UWbVTugU+4KSZeRTGt0QkRM2ZY4zczM6lPs5tmfAPcpmZn+aeBCkql8bgeQdC9ARJydLo8E5pE8RgLJoyeXA7fWHFDSN0kS5ueB19MBoQE+SAfaNjMzaxRFTZoR8YCknUlmh+9NMt3P8RFRc9O17vOaZSSDUfcnmTrpTZIZDXI7Al0CdGDzQaDvAc5txPDNzKyNa9MDtrv3rJmZ1VVeXj4tIobk2+axZ83MzDJy0jQzM8vISdPMzCwjJ00zM7OMnDTNzMwyctI0MzPLyEnTzMwsIydNMzOzjJw0zczMMnLSNDMzy8hJ08zMLCMnTTMzs4ycNM3MzDJy0jQzM8vISdPMzCwjJ00zM7OMnDTNzKwgEydO5JOf/CQHHnggN91002bbx44dy0EHHcShhx7KKaecwltvvVW7bdGiRQwfPpxPfepTHHTQQSxcuBCAJ598kiOOOIKhQ4dy3HHHMXfu3KKdTyGcNM3MLLPq6mquuOIKxo8fz9SpU3nwwQd57bXXNimz3377MWnSJKZMmcLJJ5/MqFGjardddNFFjBw5kmeffZaJEyfSo0cPAC6//HJ+/vOfM3nyZE499VRuvPHGop5XVk6aZmaW2bRp09hjjz3o378/HTt2ZPjw4Tz++OOblDnssMPo0qULAEOGDGHx4sUAvPbaa2zYsIEjjzwSgO233762nCRWr14NwKpVq9hll12KdUoFcdI0s5LWFE2Bl1xyCfvvvz9Dhw5l6NChzJgxo2jn09ItWbKEXXfdtXa5T58+LFmypN7y999/P0cffTQAb775Jt27d+fss8/m8MMP53vf+x7V1dUA3HzzzZx22ml87GMf44EHHuBrX/ta057IVnLSNLOS1VRNgQCjR49m8uTJTJ48mX333bdo59TSRcRm6yTlLTt+/HimT5/OyJEjAdiwYQNTp07l2muv5a9//Svz589n3LhxANx222088MADvPrqq5xxxhl897vfbbqT2AZOmmZWspqqKdC2Xp8+fXj77bdrlxcvXpy3KfXvf/87N954I+PGjaNTp061++63337079+f9u3bc8IJJ/Dyyy+zbNkyXnnlFYYMGQLA8OHDee6554pzQgVy0jSzktVUTYEA119/PYceeihXXXUVH374YdOdRCtzwAEHMHfuXBYsWEBVVRUPPfQQxx577CZlXn75ZS677DLGjRtHz549N9n3vffeY9myZQBMnjyZQYMGseOOO7Jq1SrmzJkDwN/+9jc++tGPFu+kCtC+uQMwM6vP1jQFPvroo8C/mwKffPJJ+vbty/nnn8+4ceM466yzuPrqq+nVqxdVVVV8/etf5+abb+aKK65o0nNpLdq3b88NN9zAqaeeSnV1NWeeeSYVFRWMGTOGyspKjjvuOEaNGsWaNWs477zzAOjbty/jxo2jrKyMa6+9llNOOYWIYP/99+fss8+mffv23HTTTZxzzjm0a9eOHXfckVtuuaWZzzQ/J00zK1mFNgU++uijeZsCAU444QSef/55gNpjdOrUiTPOOIOf/exnTXwmrcuwYcMYNmzYJuuuuuqq2tcPP/xwvfseeeSRTJkyZbP1J554IieeeGLjBdlE3DxrZiWrKZoCAZYuXQokNdnHHnuMioqKIp2RtXSuaZpZyWqKpkCAL3/5yyxbtoyIYN999y3ZB+mt9CjfPYO2orKyMiZNmtTcYZiZWQkpLy+fFhFD8m1z86yZmVlGTppmZmYZOWmamZll5KRpZmaWkZOmmZlZRk6aZmZmGTlpmpmZZeSkaWZmlpGTppmZWUYeRq+ZTJw4kauuuorq6mrOOussLr300k22jx07lvvuu4/27dvTo0cPbrnlFvr161e7fdWqVRx88MGccMIJ3HDDDZvse8YZZzB//nyeeeaZopyLmbVcV9yzU3OH0GhuOGdlk7+Ha5rNYFtnowcYM2YMhxxyyGbHfuSRR+jatWuTxm9m1la5ptkMcmejB2pno997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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -243,6 +327,7 @@ " 2|\\psi\\rangle\\langle\\psi | - I\n", " $$\n", " \n", + "\n", " Do ponto de vista de implementação o passo a passo para aplicar a inversão sobre a média no sistema seria da seguinte forma: \n", " 1. Aplicar transformações de Hadamard $H^{\\otimes n}$\n", " 2. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", @@ -266,8 +351,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nós iremos realizar nossa busca em um vetor com 4 elementos 00, 01, 10, 11.
\n", - "O elemento escolhido para busca é o 11.
\n", + "Nós iremos realizar nossa busca em um vetor com 4 elementos com índices 00, 01, 10, 11.
\n", + "O elemento escolhido para busca é o úlitmo cujo o índice é 11.
\n", "\n", "**Antes de Comerçarmos:**
\n", "Para implementarmos o circuito que irá encontra-lo nós incializamos os nossos qubits,
\n", @@ -277,9 +362,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#Inicialização dos estados\n", "qub = QuantumRegister(3,'q')\n", @@ -335,9 +431,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Oracle\n", "qc.ccx(qub[0], qub[1], qub[2])\n", @@ -353,9 +460,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#---Hadamard\n", "qc.h(qub[0])\n", @@ -374,9 +492,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#----Troca de fase\n", "qc.x(qub[0])\n", @@ -396,9 +525,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0AAAAD/CAYAAADYF7Z/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3df3RU9Z3/8dcQllQgPzgGw88YxaIYfiSGNMIWglbIqiBqgAVbRLMhVmB7EKGJiIpZiwHZ4E+0WWVRA9sFQRMVg+KRdCtpDGhAELpN+dUgq6CEEXRhm8z3Dw/zZQSSmcnk3jvzeT7O8Ry9c3M/b15++OS+59654/J4PB4BAAAAgAE62F0AAAAAAFiFBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMTraXQAQSnv27Gl1n2effVazZs1qcZ+rrroqVCVFLLK2Dllbh6wBtEVrawjrhzNwBQjGee655+wuwRhkbR2ytg5ZAwgW64cz0AABAAAAMAYNEAAAAABj0ADBOK+99prdJRiDrK1D1tYhawDBYv1wBhogAAAAAMbgKXAwzoQJE7R7927Lx509e7bq6uosHzc1NVVPPvmk5eNK9mVtIjuytmtOS+bNa1Ozhv9M/B0Tjkw7B5GcOUe4AgRYpK6uzvLFx44xYQ675peJ85qs0Rp+x6AlrCG+uAIEWCg1NVWbN2+2bLxRo0ZZNhbMZPWclsyd12SN1vA7Bi1hDfn/uAIE48ycOdPuEoxB1tYha+uQNYBgsX44Aw0QjNPaNzAjdMjaOmRtHbIGECzWD2egAYJxRo4caXcJxiBr65C1dcgaQLBYP5yBBgjGOXLkiN0lGIOsrUPW1iFrAMFi/XAGGiAAAAAAxqABgnGuvvpqu0swBllbh6ytQ9YAgsX64Qw0QDDOunXr7C7BGGRtHbK2DlkDCBbrhzMY1QCtXLkyoOeRp6en6913322/gmCLhx9+2O4SjEHW1iFr65A1gGCxfjiDUQ3QDzU1NWnevHnq3r27YmJilJOTo6NHj3pfHz9+vMrLy22sEO1h7dq1dpfgt169eumll17y2ebxeBQbG6vXX3/dpqr8Fy5ZHzp0SA899JB+/OMfKzExUZmZmXrxxRf17bff2l2a38Ila4l5bYUTJ06oe/fuPu82f/fddxo+fLgmTJig5uZmG6uLPDU1NbrzzjvVp08f9erVS7fddpvee+89eTweu0u7IOaIPcJh/Tgj3NfqlhjdABUXF6u8vFw1NTVqaGiQJE2dOtX7+vjx41VRUWFXeTDcoUOHdPjwYQ0ZMsRn+969e/XNN99o6NChNlUWWf7whz9owIABeuyxx1RfX68vv/xSW7du1fTp0zV8+HCfN0XQdsxra3Tt2lVz585VUVGRPB6PmpqaNGnSJEVHR2vVqlXq0MHoX/8hVVxcrGuvvVarVq3yzu+KigqNGTNGM2fOdGwTxBxBSyJ9rXbE7F6zZo0GDRqkrl27asyYMZozZ44mTpzY7uOWlpaqoKBAl19+ueLi4rRkyRJVVlZq//79kqQhQ4aoY8eO2rZtW7vXAvxQbW2toqKilJKS4rN9+/btSkxMVN++fW2qLHIcPXpUN998s06ePOmz/cw7n59++qmmTJliR2kRi3ltnVmzZunw4cNav3698vPz1dDQoPLyckVHR9tdWsSoqKjQAw88IEk+V0zO/Pvzzz+vZ555xpba/MEcwYVE+lptewP08ssv6/7779fy5ct1/PhxjR07Vk8//bTS0tICOk5xcbEGDx7s9/7Hjx/XwYMHlZ6e7t3Wr18/xcbGaseOHd5tt9xyC7fBRZiqqiq7S/BLbW2t+vfvr4suushn+/bt28PmnRenZ71ixQq53e4L3urR3NysTZs2aefOnRZXFjinZ30G89o6Xbp00bx58zRt2jRt3rxZlZWVio2NtbusiLJ06dIWr5S4XC7967/+q5qamiysyn/MEeuFy/oRCWt1S2xtgL799lvNmTNHpaWlGjFihKKiopSXl6empiZvA1RWVqZhw4Zp2LBhev/99y94rMLCQp/GpTVut1uSFBcX57M9Pj7e+5ok3XzzzXr77bcD+WPB4Xbt2mV3CX6pra1VfX29EhISfP5ZvHixMjIy7C7PL07P+o033pDL5Wp1v3B4E8TpWZ/BvLbeyZMnVVhYqMTERLtLiSjHjh3Tf/3Xf7X4WRmPx6ODBw/q008/tbCywDFHrBMu60ckrNUt6Wjn4FVVVWpubtaNN97o3XbmG3LT0tLU2NiokpISVVdX68SJE7ruuuv0ySefKCoqqs1jx8TESPr+StDZGhsbfd79OHDggJKSkto8Xmv8OQlD6+67775W91m2bFmr+y1btixUJfnIysrye9+tW7dq4cKFuvPOO322Dxo0KKB3X6qqqtplfjk961BasGCBFixYYNv4Ts46kDktMa/bItCsy8rK9Pjjjys3N1dPPfWU8vLygsqsvbI2SaB3tQTLjjnC/PDlz9pg0jmIZN8caenzd7Y2QF9++aUuueQSn22rV69Wjx491KNHD23cuFEjRoxQdHS0oqOjlZycrL/85S/q379/m8eOj49XUlKSPv74Y6Wmpkr6/oNdbrfb51a6iooK5eTktHm81jj1Q5LhZs+ePa3us2zZMuXn57e4T0lJSahK8grkEez19fU6duyYsrOz1adPH5/tjY2NAS0+WVlZ2rx5cwCV+sfJWftr4sSJWr9+fatPO1qxYoXuvvtui6o6l1OzDmROS8zrtgg06w0bNmjGjBl66623lJ6erssuu0xr167VpEmTAh67vbIOd6dPn1ZCQoK++eabFvfr0KGDGhoa1LNnz3atx645wvzw1doaYto5iOTMOWLrLXApKSmqr69XVVWVTp8+rdWrV6u4uNjbkHz11Vfq1q2bd/9u3brpq6++Ctn4+fn5Wrx4sfbt2ye3262CggJlZ2crOTlZ0ve36H3wwQcaO3ZsyMYE/FFbW6vOnTuf8/SVLVu2qG/fvtymECL5+fmtNj9du3YN6qQR52JeW2PLli2aPHmyXnnlFY0cOdL7OY+ioiIebRxCnTp1Um5ubovvbHfo0EHjxo1r9+YnUMwRtMSEtdrWBmjo0KF68MEHdfvtt6tPnz6qqalRZmam91LxxRdfrGPHjnn3P3bsmC6++OLzHmvRokXnPKmiNYWFhRo3bpwyMjLUu3dvNTU1qayszPv6xo0blZaWpoSEhCD+dHCqRx991O4SWlVbW6uMjAx17Oh7kba6ujqsPnzo9Kx/9rOf6dZbb21xn6VLl6pLly4WVRQ8p2ctMa+tsHPnTo0dO1YlJSU+c3vmzJk6cuRIWH0HSTgoKChQz549z/sghA4dOqhLly76zW9+Y0NlF8YcsZeT148zImWtbomtt8BJUlFRkYqKirz/nZycrOnTp0uSMjMz9cADD+jUqVM6efKk9u3bp379+p33OPPnz9f8+fMDGjsqKkpLly7V0qVLz/t6RUWFxo8fH9Ax4Xzh8G7+hS5/P//88xZX0jZOz7pDhw763e9+pzlz5ujf/u3f9H//93/e1y6++GItWbJEubm5NlboP6dnLTGvrTBw4EB9/fXX52zv3LmzvvjiCxsqimw9e/bUhx9+qGnTpun3v/+9z2sDBw7Uyy+/HPCbs+2NOWIvJ68fZ0TKWt0S2x+DfTa3260DBw54rwDFx8dr9uzZGjVqlG6++WaVlJSE5AEI/rr00kst+T4iWGvAgAF2l2CMcMg6Ojpazz33nA4dOqQVK1ZIktavX6/PP/88bJofKTyyjhRkjbMlJyerqqpKn376qZ577jlJ398qVFdX572lHziD9cMZHNUA7dy5UzExMT5Xee68805VV1erurpao0ePbtPxU1NTddddd/m9/8KFC3XppZe2aUwA4aF79+7eBx3cdttt6tSpk80VAQgnAwcO1IwZMyRJw4YN48logIPZfgvc2YYPH+7zHTyhlpqayrsxAAAAgMEcdQUIsEKgjwpF8MjaOmRtHbIGECzWD2egAYJxIulDfE5H1tYha+uQNYBgsX44Aw0QjHPvvffaXYIxyNo6ZG0dsgYQLNYPZ6ABgnGc9m3EkYysrUPW1iFrAMFi/XAGGiAAAAAAxqABAgAAAGAMRz0GG7DC7t27bRu7rq7O0ifA2P1FfHZmbRq7srZ6Tp8Z08R5bWLWCIxpv2PCkUnnIGfGdOIc4QoQjLNmzRpbxrXje6js/u4ru7I2kR1Z2zW/TJzXpmYN/5n4OyYcmXQOYue4rXF5PB6P3UUAobJnz55W9xkwYECr78BcddVVoSopYkVq1i6XS05bFiM1aycia7SVE9cQWKe1NYT1wxm4AgQAAADAGDRAAAAAAIxBAwTjLF++3O4SjEHW1iFr65A1gGCxfjgDDRCMk5KSYncJxiBr65C1dcgaQLBYP5yBBgjGycrKsrsEY5C1dcjaOmQNIFisH85AAwQAAADAGDRAME5GRobdJRiDrK1D1tYhawDBYv1wBhogGKe2ttbuEoxB1tYha+uQNYBgsX44Aw0QAAAAAGPQAAEAAAAwBg0QjPPaa6/ZXYIxyNo6ZG0dsgYQLNYPZ6ABAgAAAGAMGiAYZ8KECXaXYAyytg5ZW4esAQSL9cMZOtpdAGCK2bNnq66uzvJxU1NT9eSTT1o+LiKfXXNaMm9eh2vWrHvWCcesw3VehyOy9sUVIMAidXV1li8+dowJc9g1v0yc1+GaNeuedcIx63Cd1+GIrH1xBQjGmTlzpm1jp6amavPmzZaNN2rUKMvGOh87szaNXVlbPaclc+d1uGZt2rpnp3DMOlzndbBMOgeRnPv3kStAMM6sWbPsLsEYZG0dsrYOWQMIFuuHM9AAwTgjR460uwRjkLV1yNo6ZI0fcrvdqqqq0urVqyVJmzZt0ldffWVzVXAi1g9n4BY4GOfIkSN2l2AMsrYOWVuHrCFJp06d0tq1a7V8+XJVV1f7vDZ69GhJ0uDBg/XLX/5SU6dOVdeuXe0oEw7D+uEMXAECAAAIwEcffaRrrrlGU6dO1dGjR7Vw4UK9/fbb2rNnjyTpvffe0+OPP66oqCjNmDFDAwYM0MaNG22uGsAZNEAwztVXX213CcYga+uQtXXI2mwvvfSShg0bJrfbrfLycu3Zs0ePPPKIbrrpJl155ZWSpBtuuEGFhYXatm2bfv/73ys2Nlb/8A//oIULF8rj8dj8J4CdWD+cgVvgYJx169bZXYIxyNo6ZG0dsjbXqlWrlJeXp+zsbP3nf/6n4uLiWtzf5XJpxIgR2rZtm+699149+uijio6O1gMPPGBRxXAa1g9n4AoQjPPwww/bXYIxyNo6ZG0dsjbTvn37dM899ygrK0vl5eWtNj9n+9GPfqSXXnpJU6ZM0YIFC/THP/6xHSuFk7F+OINRDdDKlSsDeh55enq63n333fYrCLZYu3at3SUYI5yy/vLLL/Xiiy9K+v4dulOnTtlcUWDCKetwR9ZmmjFjhjp06KBXX31V0dHRAf98hw4d9MILL6h37976p3/6JzU3N7dDlXA61g9nMKoB+qGmpibNmzdP3bt3V0xMjHJycnT06FHv6+PHj1d5ebmNFcJ0vXr10ksvveSzzePxKDY2Vq+//rpNVUWWU6dO6Ze//KV69+6t6dOnS5ImTJigXr16eRsihBbzuv2dOHFC3bt397nd5rvvvtPw4cM1YcIER598O3F+fPbZZ6qsrNQDDzygvn37Bn2c2NhYLV68WJ999pkj3mB1YtYtCed5HY7CbX4EwugGqLi4WOXl5aqpqVFDQ4MkaerUqd7Xx48fr4qKCrvKg+EOHTqkw4cPa8iQIT7b9+7dq2+++UZDhw61qbLI0dzcrEmTJum3v/2t/va3v/m89vXXX2v69Ol6/vnnbaouMjGvrdG1a1fNnTtXRUVF8ng8ampq0qRJkxQdHa1Vq1apQwdn/vp36vxYsWKFOnXqpLy8vDYfKycnR5dccsk5J5ZWc2rWLQnXeR2OwnF+BMIRM2XNmjUaNGiQunbtqjFjxmjOnDmaOHFiu49bWlqqgoICXX755YqLi9OSJUtUWVmp/fv3S5KGDBmijh07atu2be1eC6xTVVVldwl+qa2tVVRUlFJSUny2b9++XYmJiW16F9IqTs9606ZNrb7J8etf/1onTpywqKLgOT3rM5jX1pk1a5YOHz6s9evXKz8/Xw0NDSovLw/q9i2rOHV+bNmyRT/5yU/UvXv3Nh+rU6dOGj16tLZs2RKCyoLn1KxbE47z+mzhsn6E6/zwl+0N0Msvv6z7779fy5cv1/HjxzV27Fg9/fTTSktLC+g4xcXFGjx4sN/7Hz9+XAcPHlR6erp3W79+/RQbG6sdO3Z4t91yyy3cBhdhdu3aZXcJfqmtrVX//v110UUX+Wzfvn172Lzz4vSsS0tLW33H8MSJE2Fxz7bTsz6DeW2dLl26aN68eZo2bZo2b96syspKxcbG2l1Wi5w4Pzwej+rq6nTNNdeE7Jjp6en6/PPPbf1STCdm7Y9wnNdnC5f1I1znh79sbYC+/fZbzZkzR6WlpRoxYoSioqKUl5enpqYmbwN0ww03KCEhQY899liLxyosLPRpXFrjdrsl6ZynuMTHx3tfk6Sbb75Zb7/9tt/HhfPNmDHD7hL8Ultbq/r6eiUkJPj8s3jxYmVkZNhdnl+cnvV///d/+3XPeH19vQXVtI3Tsz6DeW29kydPqrCwUImJiXaX0ionzo+//e1v+u6770Jy9eeMM8dqbGwM2TED5cSsAxFO8/ps4bJ+hPv8aI2t3wNUVVWl5uZm3Xjjjd5tZ94NOdMArVy5Ups2bfJ+RidUYmJiJH1/JehsjY2NPu8kHDhwQElJSSEd+3xcLle7j2GC++67z6/9SktLW3x92bJloSjnHFlZWX7vu3XrVi1cuFB33nmnz/ZBgwYF9O5LVVVVu8wvp2cdSosWLdKiRYtsG9/JWQcypyXmdVsEmnVZWZkef/xx5ebm6qmnnlJeXl5QmbU160hZ9x566CE99NBDfu3r79j9+/dvS0nnCMesw3VeX4g/a4hJ5yBS+2Xdmpa+dNjWBujLL7/UJZdc4rNt9erV6tGjh3r06CFJ6tOnT7uMHR8fr6SkJH388cdKTU2V9P0Hu9xut8+tdBUVFcrJyWmXGs7GN0OHxp49e1rdZ9myZcrPz29xn5KSklCV5BXII9jr6+t17NgxZWdn+/wdqK+vV2NjY0CLT1ZWljZv3hxApf5xctb+euKJJ/TrX/+61f127tx5zn3QVnJq1oHMaYl53RaBZr1hwwbNmDFDb731ltLT03XZZZdp7dq1mjRpUsBjtyXrSFn3rrjiCqWmpuq1115rdV+Xy9Xq7/Qzt/673W793d/9XUhqDMesw3Vet6S1NcS0cxCp/bJuC1tvgUtJSVF9fb2qqqp0+vRprV69WsXFxd6GpL3l5+dr8eLF2rdvn9xutwoKCpSdna3k5GRJ39+i98EHH2js2LGW1ANrPProo3aX0Kra2lp17tz5nKevbNmyRX379g2bS/5Oz/ruu+9WXFzcBT8H5HK5NGbMGFubH385PWuJeW2VLVu2aPLkyXrllVc0cuRI72cmioqKHP2YYCfPj/T0dP3xj38MWX7V1dUaMmRIyJqfQDk56wsJ13n9Q05fP6TwnB+BsrUBGjp0qB588EHdfvvt6tOnj2pqapSZmRnwAxCk729RCfQkpbCwUOPGjVNGRoZ69+6tpqYmlZWVeV/fuHGj0tLSlJCQEHA9cK5g3imyWm1trTIyMtSxo+9F2urq6rD68KHTs05ISNCGDRvUtWtXn+1nGqIhQ4Zo1apVdpQWMKdnLTGvrbBz506NHTtWJSUluvXWW73bZ86cqSNHjjj6gR5Onh+33XabDh06FJLv7vnss89UXV2t2267LQSVBcfJWZ9POM/rH3Ly+nFGuM2PYNh6C5wkFRUVqaioyPvfycnJ3i8jDMT8+fM1f/78gH4mKipKS5cu1dKlS8/7ekVFhcaPHx9wLXC2AQMGaPfu3XaX0aILXf4Ot++kCYeshw8frt27d6u0tFS/+93v9Kc//Uk/+clPlJ+fr8mTJ5/zBBynCoesmdftb+DAgfr666/P2d65c2d98cUXNlTkPyfPj9tvv12JiYl67LHHNGbMmDZ938xjjz2mTp06KTc3N4QVBsbJWZ9POM/rH3Ly+nFGuM2PYNj+GOyzud1uHThwwOcKUG5urp544gmtXLlS48aNs7SeSy+91JLvIwJgr169emnhwoXee7erq6t19913h03zA6B9derUScXFxfrwww/1zDPPBH2cN954Q//xH/+h+fPnh/SpcgACY/sVoLPt3LlTMTEx6tevn3fbihUrQnb81NRU3XXXXX7vv3DhwpCNDQAAwte0adO0bt063X///UpKSgr4Frbq6mpNnTpVaWlpeuCBB9qpSgD+cNQVoOHDh8vtdrfbo/ICbYAQmQJ96gyCR9bWIWvrkLWZXC6XVq9erYyMDE2cOFGPPPKITp8+3erPNTc367nnntPPfvYz9ejRQ2+99ZY6depkQcVwItYPZ3BUAwRYIZLuYXU6srYOWVuHrM0VExOj9957T1OmTFFRUZEGDx6s5cuXn/cLTb/99luVlZUpMzNTs2bN0siRI/WHP/xBvXr1sqFyOAXrhzPQAME49957r90lGIOsrUPW1iFrs3Xt2lWvvvqqKioq1KVLF82cOVPdunXTlVdeqZtuukmSNHjwYMXGxmrq1Klyu93693//d73zzjsR8fhgtA3rhzM46jNAgBWc9mVckYysrUPW1iFrSNK4ceM0duxYffTRR3rvvfe0bds2NTQ0SJL69u2rW2+9VaNGjdJ1113Xbrf2I/ywfjgDDRAAAEAQXC6XMjMzlZmZaXcpAALALXAAAAAAjMEVIBjHzi8gq6urs/QJMHV1dUpNTbVsvB9y+pe9RRK7srZ6Tp8Z08R5Ha5Zm7bu2Skcsw7XeR0sk85BzozpxL+PXAGCcdasWWPLuKmpqZYvAnaMeTa7sjaRHVnbNb9MnNfhmrWJ655dwjHrcJ3XbWHSOYid47bG5fF4PHYXAYTKnj17Wt1nwIABrb4Dc9VVV4WqpIgVqVm7XC45bVmM1KydiKwBtEVrawjrhzNwBQgAAACAMWiAAAAAABiDBgjGWb58ud0lGIOsrUPW1iFrAMFi/XAGGiAYJyUlxe4SjEHW1iFr65A1gGCxfjgDDRCMk5WVZXcJxiBr65C1dcgaQLBYP5yBBggAAACAMWiAYJyMjAy7SzAGWVuHrK1D1gCCxfrhDDRAME5tba3dJRiDrK1D1tYhawDBYv1wBhogAAAAAMagAQIAAABgDBogGOe1116zuwRjkLV1yNo6ZA0gWKwfzkADBAAAAMAYNEAwzoQJE+wuwRhkbR2ytg5ZAwgW64czdLS7ANhr9uzZqqurs3zc1NRUPfnkk5aPayeyBgAAdrDrHERy5nkIV4AMV1dXZ/lfCDvGdAKyBgAAdrDrfMCp5yFcAYJSU1O1efNmy8YbNWqUZWOdz8yZM20bm6zRXsjaOmQNIFgmnYNI9p+HXAhXgGCcWbNm2V2CMcjaOmRtHbIGECzWD2egAYJxRo4caXcJxiBr65C1dcgaQLBYP5yBW+BgnCNHjthdgjHCIett27Zp7dq12rp1q/bs2aOoqChdccUVGjx4sK699lr94he/UK9evewus1XhkHWkIGsAwWL9cAauAAEw0pYtW5SZmamhQ4eqpKREjY2NuuGGG9TU1KRrrrlGn376qQoKCpSUlKQ77rhDhw8ftrtkAAAQAjRAMM7VV19tdwnGcGLWTU1NKigo0E9/+lP9z//8j5555hkdOXJEW7du1cqVKyVJa9as0Z///Gf9+c9/1uzZs/X6668rJSVFr7/+ur3Ft8CJWUcqsgYQLNYPZ6ABgnHWrVtndwnGcFrWzc3Nuvvuu7VkyRLl5eVp586dmjVrluLi4s67/xVXXKGlS5eqrq5OP/7xj5WTk6NXX33V4qr947SsIxlZAwgW64cz0ADBOA8//LDdJRjDaVkvWrRIr776qv7lX/5FpaWliomJ8evnrrzySn3wwQe6/vrrdffdd+ujjz5q50oD57SsIxlZAwgW64czGNUArVy5MqDnkaenp+vdd99tv4Jgi7Vr19pdgjGclPWOHTtUVFSkf/zHf9SDDz4Y8M937txZ69atU8+ePXXXXXfpf//3f9uhyuA5KetIR9YAgsX64QxGNUA/1NTUpHnz5ql79+6KiYlRTk6Ojh496n19/PjxKi8vt7FC5zlx4oS6d+/ucwn3u+++0/DhwzVhwgQ1NzfbWF3k6dWrl1566SWfbR6PR7GxsY7+PIoTLVy4UDExMXr22WflcrmCOkZcXJxeeOEF7d69W2VlZSGuEAAA54jkcxCjG6Di4mKVl5erpqZGDQ0NkqSpU6d6Xx8/frwqKirsKs+Runbtqrlz56qoqEgej0dNTU2aNGmSoqOjtWrVKnXoYPSUCqlDhw7p8OHDGjJkiM/2vXv36ptvvtHQoUNtqiz8NDQ0qLy8XNOnT1dCQkKbjnXTTTdp4MCBWr58eYiqAwDAWSL9HMQRZ6tr1qzRoEGD1LVrV40ZM0Zz5szRxIkT233c0tJSFRQU6PLLL1dcXJyWLFmiyspK7d+/X5I0ZMgQdezYUdu2bWv3WsLJrFmzdPjwYa1fv175+fnek8vo6Gi7S/NLVVWV3SX4pba2VlFRUUpJSfHZvn37diUmJqpv3742VeY/p2S9ceNGNTc3a9q0aW0+lsvl0rRp0/TJJ5846tHYTsnaBGQNIFjhsn5EwjlIS2xvgF5++WXdf//9Wr58uY4fP66xY8fq6aefVlpaWkDHKS4u1uDBg/3e//jx4zp48KDS09O92/r166fY2Fjt2LHDu+2WW27hNrgf6NKli+bNm6dp06Zp8+bNqqysVGxsrN1l+W3XruqgXgMAAA7sSURBVF12l+CX2tpa9e/fXxdddJHP9u3bt4fNOy9OyXrbtm2KjY3VlVdeGZLjXXvttd7jOoVTsjYBWQMIVrisH5FwDtISWxugb7/9VnPmzFFpaalGjBihqKgo5eXlqampSWlpadq2bZv+/u//XiNHjtT111+vvXv3XvBYhYWFPo1La9xutySd8/jb+Ph472uSdPPNN+vtt98O8E9mhpMnT6qwsFCJiYl2lxKQGTNm2F2CX2pra1VfX6+EhASffxYvXqyMjAy7y/OLU7Let2+f+vfvH7JbNPv37+89rlM4JWsTkDWAYIXL+hEJ5yAt6Wjn4FVVVWpubtaNN97o3XbkyBFJUlpamjwejyorKxUTE6MNGzbokUceCdl3cJx5/O3x48d9tjc2NvpczThw4ICSkpJCMmZLgv1QdihkZWUFtH9ZWZkef/xx5ebm6qmnnlJeXl7A9VdVVbXLn/m+++7za7/S0tIWX1+2bFkoyjlHIFlv3bpVCxcu1J133umzfdCgQQG9+2Jq1ufjbw7+7verX/1Kv/rVr9pSkl/CMetwRdYA2sKfNcSkcxCp/c5DWuPxeC74mq0N0JdffqlLLrnEZ9vq1avVo0cP9ejRw2d7p06d1LFj6MqNj49XUlKSPv74Y6Wmpkr6/oNdbrfb51a6iooK5eTkhGzcC2npf1J7CuSx4JK0YcMGzZgxQ2+99ZbS09N12WWXae3atZo0aVJAx8nKytLmzZsD+hl/7Nmzp9V9li1bpvz8/Bb3KSkpCVVJXoFkXV9fr2PHjik7O1t9+vTx2d7Y2BjQ4mNi1j90xx13aMuWLd7P97XE5XK1+vdx165dGjhwoF555RWfB6e0l3DKOtyRNYC2aG0NMe0cRGq/85C2sPUWuJSUFNXX16uqqkqnT5/W6tWrVVxc7G1Izjhzq9XcuXNDOn5+fr4WL16sffv2ye12q6CgQNnZ2UpOTpb0/S16H3zwgcaOHRvSccPVli1bNHnyZL3yyisaOXKk97NARUVFYfX460cffdTuElpVW1urzp07n/P0lS1btqhv375hc9uhU7JOS0vTgQMHfB5z3xZnPvtzzTXXhOR4oeCUrE1A1gCCFQ7rR6Scg7TE1gZo6NChevDBB3X77berT58+qqmpUWZmps8DEE6fPq2JEydqwYIF5zyJ4myLFi1q8fXzKSws1Lhx45SRkaHevXurqanJ57s9Nm7cqLS0tDY/NjcS7Ny5U2PHjlVJSYluvfVW7/aZM2fqyJEjYfXFXoFerbJDbW2tMjIyzrnqWV1dHVYfPnRK1iNGjJAkvfHGGyE53htvvKGEhARdddVVITleKDglaxOQNYBghcP6ESnnIC2x9RY4SSoqKlJRUZH3v5OTkzV9+nRJ339R6R133KHbb7/d56T7fObPn6/58+cHNHZUVJSWLl2qpUuXnvf1iooKjR8/PqBjRqqBAwfq66+/Pmd7586d9cUXX9hQUfAGDBig3bt3211Giy50+fv555+3uJK2cUrWmZmZGjRokJ599lnl5ua26WEIBw4cUHl5uebNm6eoqKgQVtk2TsnaBGQNIFjhsH5EyjlIS2x/DPbZ3G63Dhw44L0CtHbtWlVWVqqsrEyjRo3SP//zP1taz6WXXmrJ9xEBaF8ul0vz5s3T9u3b2/QFph6PR/fee69+9KMfhc2TfAAAgC/brwCdbefOnYqJiVG/fv0kSZMnT9bkyZNDdvzU1FTdddddfu+/cOHCkI0NwF6/+MUvtHr1ahUUFCgzMzOox3iWlJTonXfe0dNPP23J0yEBAEDoOeoK0PDhw+V2u9vtUXmBNkCITIE++Q7Bc1LWLpdLK1asUGJiokaPHq3333/f759tamrSb37zG82dO1cTJkzQzJkz27HS4Dgp60hH1gCCxfrhDI5qgAArRNI9rE7ntKx79uypzZs3q2fPnrrhhhs0Y8YMff755y3+zNatW5WVlaUFCxZoypQpWrVqVci+UDWUnJZ1JCNrAMFi/XAG5/0WB9rZvffea3cJxnBi1klJSdq2bZvuu+8+vfDCC0pKStL48eP1xBNP6J133pEkrV+/XgsWLFBGRoYyMjK0a9cuvfLKK1q1apU6depk85/g/JyYdaQiawDBYv1wBkd9BgiwgtO+jCuSOTXrzp07q6SkRDNnztRvf/tbrVmzRhUVFd7Xc3JyFBUVpSFDhuiZZ57R1KlTFRcXZ2PFrXNq1pGIrAEEi/XDGWiAABirX79+WrJkiZYsWaKjR4/qT3/6k37605+qtrZWKSkpuuiii+wuEQAAhBgNEABISkhIUEJCgjwej92lAACAdsRngGAcp38BWSQha+uQtXXIGkCwWD+cgStAUF1dnaWPZayrq1Nqaqpl4/3QmjVrNGnSJFvGJmu0F7K2DlkDCJZJ5yBnxrTzPORCuAJkuNTUVMsnph1jnu2RRx6xZVyyRnsia+uQNYBgmXQOYue4reEKkOGefPJJu0swBlkDAAA7cA7iiytAAAAAAIxBAwTjLF++3O4SjEHW1iFr65A1gGCxfjgDDRCMk5KSYncJxiBr65C1dcgaQLBYP5yBBgjGycrKsrsEY5C1dcjaOmQNIFisH85AAwQAAADAGDRAAAAAAIzBY7ARUa666qpW93nkkUf82g8tI2vrkLV1yBpAW7S2NrB+OIPL4/F47C4CAAAAAKzALXAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEBnaWpq0rx589S9e3fFxMQoJydHR48etbssAAAAACFCA3SW4uJilZeXq6amRg0NDZKkqVOn2lwVAAAAgFBxbAP04YcfKjs7W4mJiYqPj9fEiRPbfczS0lIVFBTo8ssvV1xcnJYsWaLKykrt37+/3ccGAAAA0P4c2QCtW7dOt9xyi/Lz83Xw4EH99a9/VV5eXkDHKC4u1uDBg/3e//jx4zp48KDS09O92/r166fY2Fjt2LEjoLEBAAAAOJPjGqCTJ0/qnnvu0VNPPaWcnBxFR0crJiZG2dnZkqSysjINGzZMw4YN0/vvv3/B4xQWFgbUuLjdbklSXFycz/b4+HjvawAAAADCW0e7C/ihqqoquVwu/fznPz/ntcbGRpWUlKi6ulonTpzQddddp08++URRUVFtHjcmJkbS91eCfjhmbGxsm4/fmsLFpe0+BgAAAGCC4oL8C77muAbo6NGj6tatm1wu1zmv1dTUaMSIEYqOjlZ0dLSSk5P1l7/8Rf3792/zuPHx8UpKStLHH3+s1NRUSdLevXvldrsDupUuWC39TwIAAAAQGo67BS49PV379u3Tm2++qebmZjU2Nmrjxo2SpK+++krdunXz7tutWzd99dVXIRs7Pz9fixcv1r59++R2u1VQUKDs7GwlJyeHbAwAAAAA9nHcFaCUlBS9+OKLmjt3rqZMmaKYmBjl5uYqOztbF198sY4dO+bd99ixY7r44ovPe5xFixZp1apV2rVrl99jFxYW6tixY8rIyNCpU6c0evRolZWVtfnP5NfY3AIHAAAAhERLd1e5PB6Px8Ja2qSxsVHXX3+9qqurdfLkSWVlZamuri4knwECAAAAEPkcdwWoJfHx8Zo9e7ZGjRolSSopKaH5AQAAAOC3sLoCBAAAAABt4biHIAAAAABAe6EBAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGqCzNDU1ad68eerevbtiYmKUk5Ojo0eP2l0WAAAAgBChATpLcXGxysvLVVNTo4aGBknS1KlTba4KAAAAQKg4tgH68MMPlZ2drcTERMXHx2vixIntPmZpaakKCgp0+eWXKy4uTkuWLFFlZaX279/f7mMDAAAAaH+ObIDWrVunW265Rfn5+Tp48KD++te/Ki8vL6BjFBcXa/DgwX7vf/z4cR08eFDp6enebf369VNsbKx27NgR0NgAAAAAnMlxDdDJkyd1zz336KmnnlJOTo6io6MVExOj7OxsSdINN9yghIQEPfbYYy0ep7CwMKDGxe12S5Li4uJ8tsfHx3tfAwAAABDeOtpdwA9VVVXJ5XLp5z//+XlfX7lypTZt2uT9jE6oxMTESPr+StDZGhsbFRsbG9KxzqdwcWm7jwEAAACYoLgg/4KvOa4BOnr0qLp16yaXy3Xe1/v06dMu48bHxyspKUkff/yxUlNTJUl79+6V2+0O6Fa6YLX0PwkAAABAaDjuFrj09HTt27dPb775ppqbm9XY2KiNGzdaMnZ+fr4WL16sffv2ye12q6CgQNnZ2UpOTrZkfAAAAADty3FXgFJSUvTiiy9q7ty5mjJlimJiYpSbm+v9DJC/Fi1apFWrVmnXrl1+/0xhYaGOHTumjIwMnTp1SqNHj1ZZWVmgf4SgcAscAAAAEBot3V3l8ng8HgtrCYmVK1eqoaFBCxYssLsUAAAAAGEk7Bqg3Nxc1dTU6NSpUxowYIDefPNNu0sCAAAAECbCrgECAAAAgGA57iEIAAAAANBeaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGOP/AXdUnExbYu0WAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#--- Hadarmard\n", "qc.h(qub)\n", @@ -416,9 +557,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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tXHI2jhkjbO53W4VFxdr5cqVkqT3339fP/zwg8lVwYpYPwAEC5fiw3EOHjxodgmOQdbGIWvjkDUk6eTJk1q9erUWLVqkDRs2eL02bNgwSVLv3r11xx13aMKECWrZsqUZZcJiWD8ABAtn7AEAAPzwySefqF+/fpowYYIOHTqkrKwsrV27Vjt27JAkvffee3rssccUGhqqadOmqUePHlq3bp3JVQMAGjMaezjOpZdeanYJjkHWxiFr45C1sy1evFgDBgyQ2+1Wfn6+duzYoYcffljXXnutLr74YknS0KFDlZmZqU2bNunPf/6zIiIi9Jvf/EZZWVnyeDwm/wQwE+sHgGChsYfjrFmzxuwSHIOsjUPWxiFr51qxYoWmTJmiYcOGaevWrRo1apRCQs79VsrlcmnQoEHatGmTbr31Vj3yyCPKyckxsGJYDesHEBzl5eVml2A6Gns4zh/+8AezS3AMsjYOWRuHrJ1p9+7duv3225WcnKz8/HxFRkb6/L3nn3++Fi9erPHjx2vOnDn661//GsRKYWWsH8C5HT9+XEuWLNGECRN06aWXqnXr1oqOjlafPn2UlpamV155RadOnar2fbm5uerZs6f27dtnQtXW4ajGfunSpX490zAhIUHvvvtu8AqCKVavXm12CY5hp6y///57vfjii5J+OaNy8uRJkyvyj52ytjuydqZp06YpJCREL7/8ssLCwvz+/pCQEL3wwgvq2LGjbrvtNlVWVgahSlgd6wdQ3alTp5SVlVW1Pn7wwQe66KKLNH78eN10001q37693nzzTY0fP16dO3fW008/XbWG5ubmKjMzU4MHD1a7du1M/knM5ajG/mwVFRWaPXu22rRpo/DwcKWmpurQoUNVr48ePVr5+fkmVgin69ChgxYvXuy1zePxKCIiQq+//rpJVTUuJ0+e1B133KGOHTtq6tSpkqQxY8aoQ4cOVY0+GhbzOviOHTumNm3aeF32+9NPP2ngwIEaM2aMpZtKK86PL774QoWFhbr//vvVuXPngI8TERGh3NxcffHFF5Y4cWDFrGtj53ltR3abH7CnL7/8Uv3799cjjzyioUOH6i9/+Yv279+vgoICPfvss3ruuedUWFio7777ToWFherdu7fuvvtuJScn68EHH1RmZqbGjx+vZcuWqUkTZz/wzdGNfU5OjvLz81VSUlJ16caECROqXh89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Wy1btvTafrrR79Onj1asWGFGaX6zetYS89oIW7du1YgRI7RgwQJdf/31VdunT5+ugwcPWvpGkFaeHzfccIP279/fIM+e/+KLL7RhwwbdcMMNDVBZYKycdU3sPK/PZuX14zS7zQ/Yy+k72vvyUaS6mvrTunfvrv3791d7dLHTmP7Av+zsbGVnZ1f9e5cuXTR16lS/j/PAAw/ogQce8Ot7QkNDNX/+fM2fP7/G1wsKCjR69Gi/a4G19ejRQ9u3bze7jFqd6zI8uz1T3Q5ZDxw4UNu3b1deXp5eeeUVffnll/r1r3+t9PR03XzzzdXuCGxVdsiaeR18PXv21I8//lhte/PmzfXdd9+ZUJHvrDw/brzxRsXExOjRRx/V8OHD6/W89EcffVRNmzZVWlpaA1boHytnXRM7z+uzWXn9OM1u8wP20rFjR3355ZfVPo59tp9//lnvvfdenU29JN15550aP358vdbmxsD0xv5Mbrdbe/bs8Tpjn5aWppKSEp08eVIlJSV68803Davnggsu0NixYw0bD4A5OnTooKysLGVlZcnlcmnDhg1mlwTAQpo2baqcnBxNnjxZzzzzjO6+++6AjvPGG2/of//3f5WVldWgd9kHALs477zzfDpb36RJE7355ps677zzam3qpV+eNMKaarHGfuvWrQoPD1e3bt2qti1ZsqTBjh8fH69bb73V5/2zsrIabGwAAGBfkyZN0po1a3TfffcpNjbW70vpN2zYoAkTJqhv3766//77g1QlADQedrlq0iosdb3CwIED5Xa7g/ZYAn8bezRO/t6FF4Eja+OQtXHI2plcLpdWrlypxMREjR07Vg8//LBOnTpV5/dVVlbqueee09VXX6127drprbfeUtOmTQ2oGFbE+gEgWCzV2ANG4DNixiFr45C1ccjaucLDw6s+85mdna3evXtr0aJFKi8vr7bviRMntHz5ciUlJWnGjBkaPHiwPvroI3Xo0MGEymEVrB8AgoXGHo5z5513ml2CY5C1ccjaOGTtbC1bttTLL7+sgoICtWjRQtOnT1erVq108cUX69prr5Uk9e7dWxEREZowYYLcbrf+53/+R++88w6PCQPrB4CgsdRn7AEjFBUVmV2CY5C1ccjaOGQNSRo5cqRGjBihTz75RO+99542bdqkffv2SZI6d+6s66+/XkOGDNGVV14ZtI8Ywn5YPwAE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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -428,9 +581,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -452,9 +617,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Informe seu API_TOKEN: ········\n" + ] + } + ], "source": [ "import getpass\n", "\n", @@ -463,23 +636,46 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "IBMQ.enable_account(MY_API_TOKEN)\n", - "IBMQ.backends(operational=True)" + "AccountProvider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')\n", + "AccountProvider.backends(operational=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], - "source": [ - "backend = IBMQ.get_backend('ibmqx4')\n", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Error checking job status using websocket, retrying using HTTP.\n" + ] + } + ], + "source": [ + "backend = AccountProvider.get_backend('ibmqx4')\n", "\n", - "job_sim = execute(deutsch, backend)\n", + "job_sim = execute(qc, backend)\n", "sim_result = job_sim.result()\n", "\n", "counts = sim_result.get_counts(deutsch)\n", From b7c4162229bdc44c2870cf95ca2c8f0d459b00c5 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Wed, 14 Aug 2019 22:54:21 -0300 Subject: [PATCH 42/49] =?UTF-8?q?execu=C3=A7=C3=A3o=20na=20m=C3=A1quina=20?= =?UTF-8?q?real=20adicionada?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deutsch_jozsa.ipynb | 105 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 89 insertions(+), 16 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 8a7a35b..5648d23 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -290,14 +290,19 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 93, "metadata": {}, "outputs": [], "source": [ - "\n", + "%matplotlib inline\n", + "# Importing standard Qiskit libraries and configuring account\n", + "import numpy as np\n", "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, Aer, execute\n", - "from qiskit.tools.visualization import plot_histogram\n", + "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", + "from qiskit.compiler import transpile, assemble\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "\n", "\n", "q = QuantumRegister(2)\n", "c = ClassicalRegister(2)\n", @@ -322,16 +327,16 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 82, + "execution_count": 94, "metadata": {}, "output_type": "execute_result" } @@ -364,16 +369,16 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 83, + "execution_count": 95, "metadata": {}, "output_type": "execute_result" } @@ -397,17 +402,17 @@ }, { "cell_type": "code", - "execution_count": 84, + "execution_count": 96, "metadata": {}, "outputs": [ { "data": { - "image/png": "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+HCFhoZqxYoV2rZtmw4dOiRJGjdunPr166cPP/zQtJp8wWOPPaYTJ07o3XffVWZmpvMG4YCAAKtLc8v+/futLsEtVVVV8vf3V0xMjMv4nj17FBUVpSFDhlhUmft8pdd9ga/0ui+c1+i9vvrqK82bN09RUVHavn27Bg0a5NZ+l+5JfP/99/WDH/xAn3/+uZ5++mkvV+sbrigo/u53v9PPf/5zvfrqq2psbNTMmTP18ssva/z48V3u29zcrF27djnDYWRkpFJSUrR79+4e1VJQUKCxY8e6vX1jY6OOHDmiuLg459iIESPkcDi0d+9e59isWbO4/Pwd1157rZYuXaoFCxaovLxc27Ztk8PhsLost5l5e8OVqKqq0siRIxUUFOQyvmfPHp+ZdfGVXvcFvtLrvnBeo/cqLCzUv/71L7355psaMGCAW/tcComXLjevX7/eeTV0z549Xq649zO+cdANX331lZ544gmtW7dOSUlJkqSMjAw9/vjjbgXF+vp6tbW16bXXXlNZWZlGjRqllStXavr06fr0008VFhamqVOnqrq6WkuWLOky2efm5io3N9ft+puamiRJoaGhLuNhYWHO1yRpxowZysvLU35+vtvv3RNdTYt7U3Jyco/2a25uVm5urqKiorq9b0VFhVe+55/97GdubVdaWnrZ11988UVPlNNBd3pdVVWlgwcPKjIy0mX87NmzysvLc/t97NrrvqQ397q7Pz96+3ltpcLcnxh+jc59+/w7d+6cfvvb3+ree+9VamqqW/t/NyReuifxhRde0OrVq/XKK6/otddec9mnL5570sX7hI30OChWVFSora1N06ZNc45d+qxRd4JiSEiIJGnhwoXOmcC8vDwVFRVpx44dmj59utasWaPt27c77x/0pEvHb2xsdBlvaGhwmR07fPiwhg4d6vHjf1dnf0He1t0nwSVp3bp1+tWvfqVFixbppZdeUkZGRrf/0SQnJ6u8vLzbx+7KgQMHutzmxRdfVGZm5mW3KS4u9lRJTt3t9e7du7Vs2TLNnz/fZXzMmDHdmnmxY6/7mt7a6578/Ojt57VVcgtLVZCT2eFrdO6759+2bdt08uRJt2fXOwuJ0sVJo7lz52rDhg1atWqVrrnmGudrfe3c60qPLz2fPHlS1113ncvYhg0bNHDgQA0cOLDL/UNDQxUdHW0YMC6NDR48uKfldSks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\n", + "image/png": "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\n", "text/plain": [ "
" ] }, - "execution_count": 84, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } @@ -420,7 +425,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 97, "metadata": {}, "outputs": [ { @@ -430,7 +435,7 @@ "
" ] }, - "execution_count": 85, + "execution_count": 97, "metadata": {}, "output_type": "execute_result" } @@ -444,12 +449,80 @@ "plot_histogram(counts, title='Deutsch-Jozsa State')\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Execução em uma máquina real\n", + "\n", + "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Informe seu API_TOKEN: ········\n" + ] + } + ], + "source": [ + "import getpass\n", + "\n", + "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Máquinas disponíveis" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IBMQ.enable_account(MY_API_TOKEN)\n", + "AccountProvider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')\n", + "AccountProvider.backends(operational=True)" + ] + }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "backend = AccountProvider.get_backend('ibmqx4')\n", + "\n", + "job_sim = execute(qc, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Índice Buscado')" + ] } ], "metadata": { From 30aafbd73d785e113bd4e6eca4788c2d9b294b01 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Wed, 14 Aug 2019 22:55:38 -0300 Subject: [PATCH 43/49] ajustes --- .ipynb_checkpoints/grover-checkpoint.ipynb | 306 +++++++++++++++++---- grover.ipynb | 14 + 2 files changed, 272 insertions(+), 48 deletions(-) diff --git a/.ipynb_checkpoints/grover-checkpoint.ipynb b/.ipynb_checkpoints/grover-checkpoint.ipynb index 0966731..25abc74 100755 --- a/.ipynb_checkpoints/grover-checkpoint.ipynb +++ b/.ipynb_checkpoints/grover-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -48,7 +48,7 @@ "source": [ "## Introdução \n", "\n", - " Dado um conjunto desestruturado de elementos de tamanho $n$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $n$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em aproximadamente $\\sigma(\\sqrt{N/M})$ iterações, onde M é quantidade de soluções buscadas. \n", + " Dado um conjunto desestruturado de elementos de tamanho $N$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $N$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em aproximadamente $\\sigma(\\sqrt{N/M})$ iterações, onde M é quantidade de soluções buscadas. \n", " " ] }, @@ -101,9 +101,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐     \n",
+       "q_0: |0>┤ H ├─────\n",
+       "        ├───┤     \n",
+       "q_1: |0>┤ H ├─────\n",
+       "        ├───┤┌───┐\n",
+       "q_2: |0>┤ X ├┤ H ├\n",
+       "        └───┘└───┘\n",
+       " c_0: 0 ══════════\n",
+       "                  \n",
+       " c_1: 0 ══════════\n",
+       "                  
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qub = QuantumRegister(3,'q')\n", "cb = ClassicalRegister(2,'c')\n", @@ -134,9 +158,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐          \n",
+       "q_0: |0>┤ H ├───────■──\n",
+       "        ├───┤       │  \n",
+       "q_1: |0>┤ H ├───────■──\n",
+       "        ├───┤┌───┐┌─┴─┐\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├\n",
+       "        └───┘└───┘└───┘\n",
+       " c_0: 0 ═══════════════\n",
+       "                       \n",
+       " c_1: 0 ═══════════════\n",
+       "                       
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qc.ccx(qub[0], qub[1], qub[2])\n", "qc.draw()" @@ -151,9 +199,33 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
        ┌───┐          ┌─┐   \n",
+       "q_0: |0>┤ H ├───────■──┤M├───\n",
+       "        ├───┤       │  └╥┘┌─┐\n",
+       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
+       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
+       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
+       "        └───┘└───┘└───┘ ║  ║ \n",
+       " c_0: 0 ════════════════╩══╬═\n",
+       "                           ║ \n",
+       " c_1: 0 ═══════════════════╩═\n",
+       "                             
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -170,9 +242,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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pN7y999/P0cffTQAb775Jt27d+fss8/m8MMP53vf+x7V1dUA3HzzzZx22ml87GMf44EHHuBrX/ta057IVnLSNLOS1VRNgQCjR49m8uTJTJ48mX333bdo59TSRcRm6yTlLTt+/HimT5/OyJEjAdiwYQNTp07l2muv5a9//Svz589n3LhxANx222088MADvPrqq5xxxhl897vfbbqT2AZOmmZWspqqKdC2Xp8+fXj77bdrlxcvXpy3KfXvf/87N954I+PGjaNTp061++63337079+f9u3bc8IJJ/Dyyy+zbNkyXnnlFYYMGQLA8OHDee6554pzQgVy0jSzktVUTYEA119/PYceeihXXXUVH374YdOdRCtzwAEHMHfuXBYsWEBVVRUPPfQQxx577CZlXn75ZS677DLGjRtHz549N9n3vffeY9myZQBMnjyZQYMGseOOO7Jq1SrmzJkDwN/+9jc++tGPFu+kCtC+uQMwM6vP1jQFPvroo8C/mwKffPJJ+vbty/nnn8+4ceM466yzuPrqq+nVqxdVVVV8/etf5+abb+aKK65o0nNpLdq3b88NN9zAqaeeSnV1NWeeeSYVFRWMGTOGyspKjjvuOEaNGsWaNWs477zzAOjbty/jxo2jrKyMa6+9llNOOYWIYP/99+fss8+mffv23HTTTZxzzjm0a9eOHXfckVtuuaWZzzQ/J00zK1mFNgU++uijeZsCAU444QSef/55gNpjdOrUiTPOOIOf/exnTXwmrcuwYcMYNmzYJuuuuuqq2tcPP/xwvfseeeSRTJkyZbP1J554IieeeGLjBdlE3DxrZiWrKZoCAZYuXQokNdnHHnuMioqKIp2RtXSuaZpZyWqKpkCAL3/5yyxbtoyIYN999y3ZB+mt9CjfPYO2orKyMiZNmtTcYZiZWQkpLy+fFhFD8m1z86yZmVlGTppmZmYZOWmamZll5KRpZmaWkZOmmZlZRk6aZmZmGTlpmpmZZeSkaWZmlpGTppmZWUYeRq+ZTJw4kauuuorq6mrOOussLr300k22jx07lvvuu4/27dvTo0cPbrnlFvr161e7fdWqVRx88MGccMIJ3HDDDZvse8YZZzB//nyeeeaZopyLmbVcV9yzU3OH0GhuOGdlk7+Ha5rNYFtnowcYM2YMhxxyyGbHfuSRR+jatWuTxm9m1la5ptkMcmejB2pno997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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -243,6 +327,7 @@ " 2|\\psi\\rangle\\langle\\psi | - I\n", " $$\n", " \n", + "\n", " Do ponto de vista de implementação o passo a passo para aplicar a inversão sobre a média no sistema seria da seguinte forma: \n", " 1. Aplicar transformações de Hadamard $H^{\\otimes n}$\n", " 2. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", @@ -266,8 +351,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nós iremos realizar nossa busca em um vetor com 4 elementos 00, 01, 10, 11.
\n", - "O elemento escolhido para busca é o 11.
\n", + "Nós iremos realizar nossa busca em um vetor com 4 elementos com índices 00, 01, 10, 11.
\n", + "O elemento escolhido para busca é o úlitmo cujo o índice é 11.
\n", "\n", "**Antes de Comerçarmos:**
\n", "Para implementarmos o circuito que irá encontra-lo nós incializamos os nossos qubits,
\n", @@ -277,9 +362,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#Inicialização dos estados\n", "qub = QuantumRegister(3,'q')\n", @@ -335,9 +431,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Oracle\n", "qc.ccx(qub[0], qub[1], qub[2])\n", @@ -353,9 +460,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#---Hadamard\n", "qc.h(qub[0])\n", @@ -374,9 +492,20 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#----Troca de fase\n", "qc.x(qub[0])\n", @@ -396,9 +525,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0AAAAD/CAYAAADYF7Z/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3df3RU9Z3/8dcQllQgPzgGw88YxaIYfiSGNMIWglbIqiBqgAVbRLMhVmB7EKGJiIpZiwHZ4E+0WWVRA9sFQRMVg+KRdCtpDGhAELpN+dUgq6CEEXRhm8z3Dw/zZQSSmcnk3jvzeT7O8Ry9c3M/b15++OS+59654/J4PB4BAAAAgAE62F0AAAAAAFiFBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMWiAAAAAABiDBggAAACAMTraXQAQSnv27Gl1n2effVazZs1qcZ+rrroqVCVFLLK2Dllbh6wBtEVrawjrhzNwBQjGee655+wuwRhkbR2ytg5ZAwgW64cz0AABAAAAMAYNEAAAAABj0ADBOK+99prdJRiDrK1D1tYhawDBYv1wBhogAAAAAMbgKXAwzoQJE7R7927Lx509e7bq6uosHzc1NVVPPvmk5eNK9mVtIjuytmtOS+bNa1Ozhv9M/B0Tjkw7B5GcOUe4AgRYpK6uzvLFx44xYQ675peJ85qs0Rp+x6AlrCG+uAIEWCg1NVWbN2+2bLxRo0ZZNhbMZPWclsyd12SN1vA7Bi1hDfn/uAIE48ycOdPuEoxB1tYha+uQNYBgsX44Aw0QjNPaNzAjdMjaOmRtHbIGECzWD2egAYJxRo4caXcJxiBr65C1dcgaQLBYP5yBBgjGOXLkiN0lGIOsrUPW1iFrAMFi/XAGGiAAAAAAxqABgnGuvvpqu0swBllbh6ytQ9YAgsX64Qw0QDDOunXr7C7BGGRtHbK2DlkDCBbrhzMY1QCtXLkyoOeRp6en6913322/gmCLhx9+2O4SjEHW1iFr65A1gGCxfjiDUQ3QDzU1NWnevHnq3r27YmJilJOTo6NHj3pfHz9+vMrLy22sEO1h7dq1dpfgt169eumll17y2ebxeBQbG6vXX3/dpqr8Fy5ZHzp0SA899JB+/OMfKzExUZmZmXrxxRf17bff2l2a38Ila4l5bYUTJ06oe/fuPu82f/fddxo+fLgmTJig5uZmG6uLPDU1NbrzzjvVp08f9erVS7fddpvee+89eTweu0u7IOaIPcJh/Tgj3NfqlhjdABUXF6u8vFw1NTVqaGiQJE2dOtX7+vjx41VRUWFXeTDcoUOHdPjwYQ0ZMsRn+969e/XNN99o6NChNlUWWf7whz9owIABeuyxx1RfX68vv/xSW7du1fTp0zV8+HCfN0XQdsxra3Tt2lVz585VUVGRPB6PmpqaNGnSJEVHR2vVqlXq0MHoX/8hVVxcrGuvvVarVq3yzu+KigqNGTNGM2fOdGwTxBxBSyJ9rXbE7F6zZo0GDRqkrl27asyYMZozZ44mTpzY7uOWlpaqoKBAl19+ueLi4rRkyRJVVlZq//79kqQhQ4aoY8eO2rZtW7vXAvxQbW2toqKilJKS4rN9+/btSkxMVN++fW2qLHIcPXpUN998s06ePOmz/cw7n59++qmmTJliR2kRi3ltnVmzZunw4cNav3698vPz1dDQoPLyckVHR9tdWsSoqKjQAw88IEk+V0zO/Pvzzz+vZ555xpba/MEcwYVE+lptewP08ssv6/7779fy5ct1/PhxjR07Vk8//bTS0tICOk5xcbEGDx7s9/7Hjx/XwYMHlZ6e7t3Wr18/xcbGaseOHd5tt9xyC7fBRZiqqiq7S/BLbW2t+vfvr4suushn+/bt28PmnRenZ71ixQq53e4L3urR3NysTZs2aefOnRZXFjinZ30G89o6Xbp00bx58zRt2jRt3rxZlZWVio2NtbusiLJ06dIWr5S4XC7967/+q5qamiysyn/MEeuFy/oRCWt1S2xtgL799lvNmTNHpaWlGjFihKKiopSXl6empiZvA1RWVqZhw4Zp2LBhev/99y94rMLCQp/GpTVut1uSFBcX57M9Pj7e+5ok3XzzzXr77bcD+WPB4Xbt2mV3CX6pra1VfX29EhISfP5ZvHixMjIy7C7PL07P+o033pDL5Wp1v3B4E8TpWZ/BvLbeyZMnVVhYqMTERLtLiSjHjh3Tf/3Xf7X4WRmPx6ODBw/q008/tbCywDFHrBMu60ckrNUt6Wjn4FVVVWpubtaNN97o3XbmG3LT0tLU2NiokpISVVdX68SJE7ruuuv0ySefKCoqqs1jx8TESPr+StDZGhsbfd79OHDggJKSkto8Xmv8OQlD6+67775W91m2bFmr+y1btixUJfnIysrye9+tW7dq4cKFuvPOO322Dxo0KKB3X6qqqtplfjk961BasGCBFixYYNv4Ts46kDktMa/bItCsy8rK9Pjjjys3N1dPPfWU8vLygsqsvbI2SaB3tQTLjjnC/PDlz9pg0jmIZN8caenzd7Y2QF9++aUuueQSn22rV69Wjx491KNHD23cuFEjRoxQdHS0oqOjlZycrL/85S/q379/m8eOj49XUlKSPv74Y6Wmpkr6/oNdbrfb51a6iooK5eTktHm81jj1Q5LhZs+ePa3us2zZMuXn57e4T0lJSahK8grkEez19fU6duyYsrOz1adPH5/tjY2NAS0+WVlZ2rx5cwCV+sfJWftr4sSJWr9+fatPO1qxYoXuvvtui6o6l1OzDmROS8zrtgg06w0bNmjGjBl66623lJ6erssuu0xr167VpEmTAh67vbIOd6dPn1ZCQoK++eabFvfr0KGDGhoa1LNnz3atx645wvzw1doaYto5iOTMOWLrLXApKSmqr69XVVWVTp8+rdWrV6u4uNjbkHz11Vfq1q2bd/9u3brpq6++Ctn4+fn5Wrx4sfbt2ye3262CggJlZ2crOTlZ0ve36H3wwQcaO3ZsyMYE/FFbW6vOnTuf8/SVLVu2qG/fvtymECL5+fmtNj9du3YN6qQR52JeW2PLli2aPHmyXnnlFY0cOdL7OY+ioiIebRxCnTp1Um5ubovvbHfo0EHjxo1r9+YnUMwRtMSEtdrWBmjo0KF68MEHdfvtt6tPnz6qqalRZmam91LxxRdfrGPHjnn3P3bsmC6++OLzHmvRokXnPKmiNYWFhRo3bpwyMjLUu3dvNTU1qayszPv6xo0blZaWpoSEhCD+dHCqRx991O4SWlVbW6uMjAx17Oh7kba6ujqsPnzo9Kx/9rOf6dZbb21xn6VLl6pLly4WVRQ8p2ctMa+tsHPnTo0dO1YlJSU+c3vmzJk6cuRIWH0HSTgoKChQz549z/sghA4dOqhLly76zW9+Y0NlF8YcsZeT148zImWtbomtt8BJUlFRkYqKirz/nZycrOnTp0uSMjMz9cADD+jUqVM6efKk9u3bp379+p33OPPnz9f8+fMDGjsqKkpLly7V0qVLz/t6RUWFxo8fH9Ax4Xzh8G7+hS5/P//88xZX0jZOz7pDhw763e9+pzlz5ujf/u3f9H//93/e1y6++GItWbJEubm5NlboP6dnLTGvrTBw4EB9/fXX52zv3LmzvvjiCxsqimw9e/bUhx9+qGnTpun3v/+9z2sDBw7Uyy+/HPCbs+2NOWIvJ68fZ0TKWt0S2x+DfTa3260DBw54rwDFx8dr9uzZGjVqlG6++WaVlJSE5AEI/rr00kst+T4iWGvAgAF2l2CMcMg6Ojpazz33nA4dOqQVK1ZIktavX6/PP/88bJofKTyyjhRkjbMlJyerqqpKn376qZ577jlJ398qVFdX572lHziD9cMZHNUA7dy5UzExMT5Xee68805VV1erurpao0ePbtPxU1NTddddd/m9/8KFC3XppZe2aUwA4aF79+7eBx3cdttt6tSpk80VAQgnAwcO1IwZMyRJw4YN48logIPZfgvc2YYPH+7zHTyhlpqayrsxAAAAgMEcdQUIsEKgjwpF8MjaOmRtHbIGECzWD2egAYJxIulDfE5H1tYha+uQNYBgsX44Aw0QjHPvvffaXYIxyNo6ZG0dsgYQLNYPZ6ABgnGc9m3EkYysrUPW1iFrAMFi/XAGGiAAAAAAxqABAgAAAGAMRz0GG7DC7t27bRu7rq7O0ifA2P1FfHZmbRq7srZ6Tp8Z08R5bWLWCIxpv2PCkUnnIGfGdOIc4QoQjLNmzRpbxrXje6js/u4ru7I2kR1Z2zW/TJzXpmYN/5n4OyYcmXQOYue4rXF5PB6P3UUAobJnz55W9xkwYECr78BcddVVoSopYkVq1i6XS05bFiM1aycia7SVE9cQWKe1NYT1wxm4AgQAAADAGDRAAAAAAIxBAwTjLF++3O4SjEHW1iFr65A1gGCxfjgDDRCMk5KSYncJxiBr65C1dcgaQLBYP5yBBgjGycrKsrsEY5C1dcjaOmQNIFisH85AAwQAAADAGDRAME5GRobdJRiDrK1D1tYhawDBYv1wBhogGKe2ttbuEoxB1tYha+uQNYBgsX44Aw0QAAAAAGPQAAEAAAAwBg0QjPPaa6/ZXYIxyNo6ZG0dsgYQLNYPZ6ABAgAAAGAMGiAYZ8KECXaXYAyytg5ZW4esAQSL9cMZOtpdAGCK2bNnq66uzvJxU1NT9eSTT1o+LiKfXXNaMm9eh2vWrHvWCcesw3VehyOy9sUVIMAidXV1li8+dowJc9g1v0yc1+GaNeuedcIx63Cd1+GIrH1xBQjGmTlzpm1jp6amavPmzZaNN2rUKMvGOh87szaNXVlbPaclc+d1uGZt2rpnp3DMOlzndbBMOgeRnPv3kStAMM6sWbPsLsEYZG0dsrYOWQMIFuuHM9AAwTgjR460uwRjkLV1yNo6ZI0fcrvdqqqq0urVqyVJmzZt0ldffWVzVXAi1g9n4BY4GOfIkSN2l2AMsrYOWVuHrCFJp06d0tq1a7V8+XJVV1f7vDZ69GhJ0uDBg/XLX/5SU6dOVdeuXe0oEw7D+uEMXAECAAAIwEcffaRrrrlGU6dO1dGjR7Vw4UK9/fbb2rNnjyTpvffe0+OPP66oqCjNmDFDAwYM0MaNG22uGsAZNEAwztVXX213CcYga+uQtXXI2mwvvfSShg0bJrfbrfLycu3Zs0ePPPKIbrrpJl155ZWSpBtuuEGFhYXatm2bfv/73ys2Nlb/8A//oIULF8rj8dj8J4CdWD+cgVvgYJx169bZXYIxyNo6ZG0dsjbXqlWrlJeXp+zsbP3nf/6n4uLiWtzf5XJpxIgR2rZtm+699149+uijio6O1gMPPGBRxXAa1g9n4AoQjPPwww/bXYIxyNo6ZG0dsjbTvn37dM899ygrK0vl5eWtNj9n+9GPfqSXXnpJU6ZM0YIFC/THP/6xHSuFk7F+OINRDdDKlSsDeh55enq63n333fYrCLZYu3at3SUYI5yy/vLLL/Xiiy9K+v4dulOnTtlcUWDCKetwR9ZmmjFjhjp06KBXX31V0dHRAf98hw4d9MILL6h37976p3/6JzU3N7dDlXA61g9nMKoB+qGmpibNmzdP3bt3V0xMjHJycnT06FHv6+PHj1d5ebmNFcJ0vXr10ksvveSzzePxKDY2Vq+//rpNVUWWU6dO6Ze//KV69+6t6dOnS5ImTJigXr16eRsihBbzuv2dOHFC3bt397nd5rvvvtPw4cM1YcIER598O3F+fPbZZ6qsrNQDDzygvn37Bn2c2NhYLV68WJ999pkj3mB1YtYtCed5HY7CbX4EwugGqLi4WOXl5aqpqVFDQ4MkaerUqd7Xx48fr4qKCrvKg+EOHTqkw4cPa8iQIT7b9+7dq2+++UZDhw61qbLI0dzcrEmTJum3v/2t/va3v/m89vXXX2v69Ol6/vnnbaouMjGvrdG1a1fNnTtXRUVF8ng8ampq0qRJkxQdHa1Vq1apQwdn/vp36vxYsWKFOnXqpLy8vDYfKycnR5dccsk5J5ZWc2rWLQnXeR2OwnF+BMIRM2XNmjUaNGiQunbtqjFjxmjOnDmaOHFiu49bWlqqgoICXX755YqLi9OSJUtUWVmp/fv3S5KGDBmijh07atu2be1eC6xTVVVldwl+qa2tVVRUlFJSUny2b9++XYmJiW16F9IqTs9606ZNrb7J8etf/1onTpywqKLgOT3rM5jX1pk1a5YOHz6s9evXKz8/Xw0NDSovLw/q9i2rOHV+bNmyRT/5yU/UvXv3Nh+rU6dOGj16tLZs2RKCyoLn1KxbE47z+mzhsn6E6/zwl+0N0Msvv6z7779fy5cv1/HjxzV27Fg9/fTTSktLC+g4xcXFGjx4sN/7Hz9+XAcPHlR6erp3W79+/RQbG6sdO3Z4t91yyy3cBhdhdu3aZXcJfqmtrVX//v110UUX+Wzfvn172Lzz4vSsS0tLW33H8MSJE2Fxz7bTsz6DeW2dLl26aN68eZo2bZo2b96syspKxcbG2l1Wi5w4Pzwej+rq6nTNNdeE7Jjp6en6/PPPbf1STCdm7Y9wnNdnC5f1I1znh79sbYC+/fZbzZkzR6WlpRoxYoSioqKUl5enpqYmbwN0ww03KCEhQY899liLxyosLPRpXFrjdrsl6ZynuMTHx3tfk6Sbb75Zb7/9tt/HhfPNmDHD7hL8Ultbq/r6eiUkJPj8s3jxYmVkZNhdnl+cnvV///d/+3XPeH19vQXVtI3Tsz6DeW29kydPqrCwUImJiXaX0ionzo+//e1v+u6770Jy9eeMM8dqbGwM2TED5cSsAxFO8/ps4bJ+hPv8aI2t3wNUVVWl5uZm3Xjjjd5tZ94NOdMArVy5Ups2bfJ+RidUYmJiJH1/JehsjY2NPu8kHDhwQElJSSEd+3xcLle7j2GC++67z6/9SktLW3x92bJloSjnHFlZWX7vu3XrVi1cuFB33nmnz/ZBgwYF9O5LVVVVu8wvp2cdSosWLdKiRYtsG9/JWQcypyXmdVsEmnVZWZkef/xx5ebm6qmnnlJeXl5QmbU160hZ9x566CE99NBDfu3r79j9+/dvS0nnCMesw3VeX4g/a4hJ5yBS+2Xdmpa+dNjWBujLL7/UJZdc4rNt9erV6tGjh3r06CFJ6tOnT7uMHR8fr6SkJH388cdKTU2V9P0Hu9xut8+tdBUVFcrJyWmXGs7GN0OHxp49e1rdZ9myZcrPz29xn5KSklCV5BXII9jr6+t17NgxZWdn+/wdqK+vV2NjY0CLT1ZWljZv3hxApf5xctb+euKJJ/TrX/+61f127tx5zn3QVnJq1oHMaYl53RaBZr1hwwbNmDFDb731ltLT03XZZZdp7dq1mjRpUsBjtyXrSFn3rrjiCqWmpuq1115rdV+Xy9Xq7/Qzt/673W793d/9XUhqDMesw3Vet6S1NcS0cxCp/bJuC1tvgUtJSVF9fb2qqqp0+vRprV69WsXFxd6GpL3l5+dr8eLF2rdvn9xutwoKCpSdna3k5GRJ39+i98EHH2js2LGW1ANrPProo3aX0Kra2lp17tz5nKevbNmyRX379g2bS/5Oz/ruu+9WXFzcBT8H5HK5NGbMGFubH385PWuJeW2VLVu2aPLkyXrllVc0cuRI72cmioqKHP2YYCfPj/T0dP3xj38MWX7V1dUaMmRIyJqfQDk56wsJ13n9Q05fP6TwnB+BsrUBGjp0qB588EHdfvvt6tOnj2pqapSZmRnwAxCk729RCfQkpbCwUOPGjVNGRoZ69+6tpqYmlZWVeV/fuHGj0tLSlJCQEHA9cK5g3imyWm1trTIyMtSxo+9F2urq6rD68KHTs05ISNCGDRvUtWtXn+1nGqIhQ4Zo1apVdpQWMKdnLTGvrbBz506NHTtWJSUluvXWW73bZ86cqSNHjjj6gR5Onh+33XabDh06FJLv7vnss89UXV2t2267LQSVBcfJWZ9POM/rH3Ly+nFGuM2PYNh6C5wkFRUVqaioyPvfycnJ3i8jDMT8+fM1f/78gH4mKipKS5cu1dKlS8/7ekVFhcaPHx9wLXC2AQMGaPfu3XaX0aILXf4Ot++kCYeshw8frt27d6u0tFS/+93v9Kc//Uk/+clPlJ+fr8mTJ5/zBBynCoesmdftb+DAgfr666/P2d65c2d98cUXNlTkPyfPj9tvv12JiYl67LHHNGbMmDZ938xjjz2mTp06KTc3N4QVBsbJWZ9POM/rH3Ly+nFGuM2PYNj+GOyzud1uHThwwOcKUG5urp544gmtXLlS48aNs7SeSy+91JLvIwJgr169emnhwoXee7erq6t19913h03zA6B9derUScXFxfrwww/1zDPPBH2cN954Q//xH/+h+fPnh/SpcgACY/sVoLPt3LlTMTEx6tevn3fbihUrQnb81NRU3XXXXX7vv3DhwpCNDQAAwte0adO0bt063X///UpKSgr4Frbq6mpNnTpVaWlpeuCBB9qpSgD+cNQVoOHDh8vtdrfbo/ICbYAQmQJ96gyCR9bWIWvrkLWZXC6XVq9erYyMDE2cOFGPPPKITp8+3erPNTc367nnntPPfvYz9ejRQ2+99ZY6depkQcVwItYPZ3BUAwRYIZLuYXU6srYOWVuHrM0VExOj9957T1OmTFFRUZEGDx6s5cuXn/cLTb/99luVlZUpMzNTs2bN0siRI/WHP/xBvXr1sqFyOAXrhzPQAME49957r90lGIOsrUPW1iFrs3Xt2lWvvvqqKioq1KVLF82cOVPdunXTlVdeqZtuukmSNHjwYMXGxmrq1Klyu93693//d73zzjsR8fhgtA3rhzM46jNAgBWc9mVckYysrUPW1iFrSNK4ceM0duxYffTRR3rvvfe0bds2NTQ0SJL69u2rW2+9VaNGjdJ1113Xbrf2I/ywfjgDDRAAAEAQXC6XMjMzlZmZaXcpAALALXAAAAAAjMEVIBjHzi8gq6urs/QJMHV1dUpNTbVsvB9y+pe9RRK7srZ6Tp8Z08R5Ha5Zm7bu2Skcsw7XeR0sk85BzozpxL+PXAGCcdasWWPLuKmpqZYvAnaMeTa7sjaRHVnbNb9MnNfhmrWJ655dwjHrcJ3XbWHSOYid47bG5fF4PHYXAYTKnj17Wt1nwIABrb4Dc9VVV4WqpIgVqVm7XC45bVmM1KydiKwBtEVrawjrhzNwBQgAAACAMWiAAAAAABiDBgjGWb58ud0lGIOsrUPW1iFrAMFi/XAGGiAYJyUlxe4SjEHW1iFr65A1gGCxfjgDDRCMk5WVZXcJxiBr65C1dcgaQLBYP5yBBggAAACAMWiAYJyMjAy7SzAGWVuHrK1D1gCCxfrhDDRAME5tba3dJRiDrK1D1tYhawDBYv1wBhogAAAAAMagAQIAAABgDBogGOe1116zuwRjkLV1yNo6ZA0gWKwfzkADBAAAAMAYNEAwzoQJE+wuwRhkbR2ytg5ZAwgW64czdLS7ANhr9uzZqqurs3zc1NRUPfnkk5aPayeyBgAAdrDrHERy5nkIV4AMV1dXZ/lfCDvGdAKyBgAAdrDrfMCp5yFcAYJSU1O1efNmy8YbNWqUZWOdz8yZM20bm6zRXsjaOmQNIFgmnYNI9p+HXAhXgGCcWbNm2V2CMcjaOmRtHbIGECzWD2egAYJxRo4caXcJxiBr65C1dcgaQLBYP5yBW+BgnCNHjthdgjHCIett27Zp7dq12rp1q/bs2aOoqChdccUVGjx4sK699lr94he/UK9evewus1XhkHWkIGsAwWL9cAauAAEw0pYtW5SZmamhQ4eqpKREjY2NuuGGG9TU1KRrrrlGn376qQoKCpSUlKQ77rhDhw8ftrtkAAAQAjRAMM7VV19tdwnGcGLWTU1NKigo0E9/+lP9z//8j5555hkdOXJEW7du1cqVKyVJa9as0Z///Gf9+c9/1uzZs/X6668rJSVFr7/+ur3Ft8CJWUcqsgYQLNYPZ6ABgnHWrVtndwnGcFrWzc3Nuvvuu7VkyRLl5eVp586dmjVrluLi4s67/xVXXKGlS5eqrq5OP/7xj5WTk6NXX33V4qr947SsIxlZAwgW64cz0ADBOA8//LDdJRjDaVkvWrRIr776qv7lX/5FpaWliomJ8evnrrzySn3wwQe6/vrrdffdd+ujjz5q50oD57SsIxlZAwgW64czGNUArVy5MqDnkaenp+vdd99tv4Jgi7Vr19pdgjGclPWOHTtUVFSkf/zHf9SDDz4Y8M937txZ69atU8+ePXXXXXfpf//3f9uhyuA5KetIR9YAgsX64QxGNUA/1NTUpHnz5ql79+6KiYlRTk6Ojh496n19/PjxKi8vt7FC5zlx4oS6d+/ucwn3u+++0/DhwzVhwgQ1NzfbWF3k6dWrl1566SWfbR6PR7GxsY7+PIoTLVy4UDExMXr22WflcrmCOkZcXJxeeOEF7d69W2VlZSGuEAAA54jkcxCjG6Di4mKVl5erpqZGDQ0NkqSpU6d6Xx8/frwqKirsKs+Runbtqrlz56qoqEgej0dNTU2aNGmSoqOjtWrVKnXoYPSUCqlDhw7p8OHDGjJkiM/2vXv36ptvvtHQoUNtqiz8NDQ0qLy8XNOnT1dCQkKbjnXTTTdp4MCBWr58eYiqAwDAWSL9HMQRZ6tr1qzRoEGD1LVrV40ZM0Zz5szRxIkT233c0tJSFRQU6PLLL1dcXJyWLFmiyspK7d+/X5I0ZMgQdezYUdu2bWv3WsLJrFmzdPjwYa1fv175+fnek8vo6Gi7S/NLVVWV3SX4pba2VlFRUUpJSfHZvn37diUmJqpv3742VeY/p2S9ceNGNTc3a9q0aW0+lsvl0rRp0/TJJ5846tHYTsnaBGQNIFjhsn5EwjlIS2xvgF5++WXdf//9Wr58uY4fP66xY8fq6aefVlpaWkDHKS4u1uDBg/3e//jx4zp48KDS09O92/r166fY2Fjt2LHDu+2WW27hNrgf6NKli+bNm6dp06Zp8+bNqqysVGxsrN1l+W3XruqgXgMAAA7sSURBVF12l+CX2tpa9e/fXxdddJHP9u3bt4fNOy9OyXrbtm2KjY3VlVdeGZLjXXvttd7jOoVTsjYBWQMIVrisH5FwDtISWxugb7/9VnPmzFFpaalGjBihqKgo5eXlqampSWlpadq2bZv+/u//XiNHjtT111+vvXv3XvBYhYWFPo1La9xutySd8/jb+Ph472uSdPPNN+vtt98O8E9mhpMnT6qwsFCJiYl2lxKQGTNm2F2CX2pra1VfX6+EhASffxYvXqyMjAy7y/OLU7Let2+f+vfvH7JbNPv37+89rlM4JWsTkDWAYIXL+hEJ5yAt6Wjn4FVVVWpubtaNN97o3XbkyBFJUlpamjwejyorKxUTE6MNGzbokUceCdl3cJx5/O3x48d9tjc2NvpczThw4ICSkpJCMmZLgv1QdihkZWUFtH9ZWZkef/xx5ebm6qmnnlJeXl7A9VdVVbXLn/m+++7za7/S0tIWX1+2bFkoyjlHIFlv3bpVCxcu1J133umzfdCgQQG9+2Jq1ufjbw7+7verX/1Kv/rVr9pSkl/CMetwRdYA2sKfNcSkcxCp/c5DWuPxeC74mq0N0JdffqlLLrnEZ9vq1avVo0cP9ejRw2d7p06d1LFj6MqNj49XUlKSPv74Y6Wmpkr6/oNdbrfb51a6iooK5eTkhGzcC2npf1J7CuSx4JK0YcMGzZgxQ2+99ZbS09N12WWXae3atZo0aVJAx8nKytLmzZsD+hl/7Nmzp9V9li1bpvz8/Bb3KSkpCVVJXoFkXV9fr2PHjik7O1t9+vTx2d7Y2BjQ4mNi1j90xx13aMuWLd7P97XE5XK1+vdx165dGjhwoF555RWfB6e0l3DKOtyRNYC2aG0NMe0cRGq/85C2sPUWuJSUFNXX16uqqkqnT5/W6tWrVVxc7G1Izjhzq9XcuXNDOn5+fr4WL16sffv2ye12q6CgQNnZ2UpOTpb0/S16H3zwgcaOHRvSccPVli1bNHnyZL3yyisaOXKk97NARUVFYfX460cffdTuElpVW1urzp07n/P0lS1btqhv375hc9uhU7JOS0vTgQMHfB5z3xZnPvtzzTXXhOR4oeCUrE1A1gCCFQ7rR6Scg7TE1gZo6NChevDBB3X77berT58+qqmpUWZmps8DEE6fPq2JEydqwYIF5zyJ4myLFi1q8fXzKSws1Lhx45SRkaHevXurqanJ57s9Nm7cqLS0tDY/NjcS7Ny5U2PHjlVJSYluvfVW7/aZM2fqyJEjYfXFXoFerbJDbW2tMjIyzrnqWV1dHVYfPnRK1iNGjJAkvfHGGyE53htvvKGEhARdddVVITleKDglaxOQNYBghcP6ESnnIC2x9RY4SSoqKlJRUZH3v5OTkzV9+nRJ339R6R133KHbb7/d56T7fObPn6/58+cHNHZUVJSWLl2qpUuXnvf1iooKjR8/PqBjRqqBAwfq66+/Pmd7586d9cUXX9hQUfAGDBig3bt3211Giy50+fv555+3uJK2cUrWmZmZGjRokJ599lnl5ua26WEIBw4cUHl5uebNm6eoqKgQVtk2TsnaBGQNIFjhsH5EyjlIS2x/DPbZ3G63Dhw44L0CtHbtWlVWVqqsrEyjRo3SP//zP1taz6WXXmrJ9xEBaF8ul0vz5s3T9u3b2/QFph6PR/fee69+9KMfhc2TfAAAgC/brwCdbefOnYqJiVG/fv0kSZMnT9bkyZNDdvzU1FTdddddfu+/cOHCkI0NwF6/+MUvtHr1ahUUFCgzMzOox3iWlJTonXfe0dNPP23J0yEBAEDoOeoK0PDhw+V2u9vtUXmBNkCITIE++Q7Bc1LWLpdLK1asUGJiokaPHq3333/f759tamrSb37zG82dO1cTJkzQzJkz27HS4Dgp60hH1gCCxfrhDI5qgAArRNI9rE7ntKx79uypzZs3q2fPnrrhhhs0Y8YMff755y3+zNatW5WVlaUFCxZoypQpWrVqVci+UDWUnJZ1JCNrAMFi/XAG5/0WB9rZvffea3cJxnBi1klJSdq2bZvuu+8+vfDCC0pKStL48eP1xBNP6J133pEkrV+/XgsWLFBGRoYyMjK0a9cuvfLKK1q1apU6depk85/g/JyYdaQiawDBYv1wBkd9BgiwgtO+jCuSOTXrzp07q6SkRDNnztRvf/tbrVmzRhUVFd7Xc3JyFBUVpSFDhuiZZ57R1KlTFRcXZ2PFrXNq1pGIrAEEi/XDGWiAABirX79+WrJkiZYsWaKjR4/qT3/6k37605+qtrZWKSkpuuiii+wuEQAAhBgNEABISkhIUEJCgjwej92lAACAdsRngGAcp38BWSQha+uQtXXIGkCwWD+cgStAUF1dnaWPZayrq1Nqaqpl4/3QmjVrNGnSJFvGJmu0F7K2DlkDCJZJ5yBnxrTzPORCuAJkuNTUVMsnph1jnu2RRx6xZVyyRnsia+uQNYBgmXQOYue4reEKkOGefPJJu0swBlkDAAA7cA7iiytAAAAAAIxBAwTjLF++3O4SjEHW1iFr65A1gGCxfjgDDRCMk5KSYncJxiBr65C1dcgaQLBYP5yBBgjGycrKsrsEY5C1dcjaOmQNIFisH85AAwQAAADAGDRAAAAAAIzBY7ARUa666qpW93nkkUf82g8tI2vrkLV1yBpAW7S2NrB+OIPL4/F47C4CAAAAAKzALXAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEAAAAAAjEEDBAAAAMAYNEBnaWpq0rx589S9e3fFxMQoJydHR48etbssAAAAACFCA3SW4uJilZeXq6amRg0NDZKkqVOn2lwVAAAAgFBxbAP04YcfKjs7W4mJiYqPj9fEiRPbfczS0lIVFBTo8ssvV1xcnJYsWaLKykrt37+/3ccGAAAA0P4c2QCtW7dOt9xyi/Lz83Xw4EH99a9/VV5eXkDHKC4u1uDBg/3e//jx4zp48KDS09O92/r166fY2Fjt2LEjoLEBAAAAOJPjGqCTJ0/qnnvu0VNPPaWcnBxFR0crJiZG2dnZkqSysjINGzZMw4YN0/vvv3/B4xQWFgbUuLjdbklSXFycz/b4+HjvawAAAADCW0e7C/ihqqoquVwu/fznPz/ntcbGRpWUlKi6ulonTpzQddddp08++URRUVFtHjcmJkbS91eCfjhmbGxsm4/fmsLFpe0+BgAAAGCC4oL8C77muAbo6NGj6tatm1wu1zmv1dTUaMSIEYqOjlZ0dLSSk5P1l7/8Rf3792/zuPHx8UpKStLHH3+s1NRUSdLevXvldrsDupUuWC39TwIAAAAQGo67BS49PV379u3Tm2++qebmZjU2Nmrjxo2SpK+++krdunXz7tutWzd99dVXIRs7Pz9fixcv1r59++R2u1VQUKDs7GwlJyeHbAwAAAAA9nHcFaCUlBS9+OKLmjt3rqZMmaKYmBjl5uYqOztbF198sY4dO+bd99ixY7r44ovPe5xFixZp1apV2rVrl99jFxYW6tixY8rIyNCpU6c0evRolZWVtfnP5NfY3AIHAAAAhERLd1e5PB6Px8Ja2qSxsVHXX3+9qqurdfLkSWVlZamuri4knwECAAAAEPkcdwWoJfHx8Zo9e7ZGjRolSSopKaH5AQAAAOC3sLoCBAAAAABt4biHIAAAAABAe6EBAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGiAAAAAAxqABAgAAAGAMGqCzNDU1ad68eerevbtiYmKUk5Ojo0eP2l0WAAAAgBChATpLcXGxysvLVVNTo4aGBknS1KlTba4KAAAAQKg4tgH68MMPlZ2drcTERMXHx2vixIntPmZpaakKCgp0+eWXKy4uTkuWLFFlZaX279/f7mMDAAAAaH+ObIDWrVunW265Rfn5+Tp48KD++te/Ki8vL6BjFBcXa/DgwX7vf/z4cR08eFDp6enebf369VNsbKx27NgR0NgAAAAAnMlxDdDJkyd1zz336KmnnlJOTo6io6MVExOj7OxsSdINN9yghIQEPfbYYy0ep7CwMKDGxe12S5Li4uJ8tsfHx3tfAwAAABDeOtpdwA9VVVXJ5XLp5z//+XlfX7lypTZt2uT9jE6oxMTESPr+StDZGhsbFRsbG9KxzqdwcWm7jwEAAACYoLgg/4KvOa4BOnr0qLp16yaXy3Xe1/v06dMu48bHxyspKUkff/yxUlNTJUl79+6V2+0O6Fa6YLX0PwkAAABAaDjuFrj09HTt27dPb775ppqbm9XY2KiNGzdaMnZ+fr4WL16sffv2ye12q6CgQNnZ2UpOTrZkfAAAAADty3FXgFJSUvTiiy9q7ty5mjJlimJiYpSbm+v9DJC/Fi1apFWrVmnXrl1+/0xhYaGOHTumjIwMnTp1SqNHj1ZZWVmgf4SgcAscAAAAEBot3V3l8ng8HgtrCYmVK1eqoaFBCxYssLsUAAAAAGEk7Bqg3Nxc1dTU6NSpUxowYIDefPNNu0sCAAAAECbCrgECAAAAgGA57iEIAAAAANBeaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGIMGCAAAAIAxaIAAAAAAGOP/AXdUnExbYu0WAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "#--- Hadarmard\n", "qc.h(qub)\n", @@ -416,9 +557,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/YAAAD/CAYAAABb/00BAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de1xVdb7/8fcGk7xw8YjilUwby/CCIkNaipXKVF4q1LIzapJSqU1lOlDZRJzGwEy7WsNJj5l6OpoVlIVdHsFM6RBaaJo2Y5qmOaUlbi+NTrB/f/STcQvC3hv2urBez8ejx4PWXqzvh3ffvuwPa+21XB6PxyMAAAAAAGBLIWYXAAAAAAAAAkdjDwAAAACAjdHYAwAAAABgYzT2AAAAAADYGI09AAAAAAA2RmMPAAAAAICN0dgDAAAAAGBjNPYAAAAAANgYjT0AAAAAADZGYw8AAAAAgI3R2AMAAAAAYGM09gAAAAAA2BiNPQAAAAAANkZjDwAAAACAjdHYAwAAAABgYzT2AAAAAADYGI09AAAAAAA2RmMPAAAAAICN0dgDAAAAAGBjNPYAAAAAANhYE7MLABrSjh076tzn2Wef1YwZM2rd55JLLmmokhotsjYOWRuHrAHUR11rCOsHgGDhjD0c57nnnjO7BMcga+OQtXHIGkCgWD8ABAuNPQAAAAAANkZjDwAAAACAjdHYw3FeffVVs0twDLI2Dlkbh6wBBIr1A0Cw0NgDAAAAAGBj3BUfjjNmzBht377d8HHvuecelZWVGT5ufHy8nnzyScPHlczL2onMyNqsOS05b147NWv4zom/Y+zIae9BJGvOEfJAY8QZe8AgZWVlhv8SMWNMOIdZ88uJ85qsURd+x6A2rCHeyAONEWfsAQPFx8erqKjIsPGGDBli2FhwJqPntOTceU3WqAu/Y1Ab1hBv5IHGhjP2cJzp06ebXYJjkLVxyNo4ZA0gUKwfAIKFxh6OM2PGDLNLcAyyNg5ZG4esAQSK9QNAsNDYw3EGDx5sdgmOQdbGIWvjkDWAQLF+AAgWGns4zsGDB80uwTHI2jhkbRyyBhAo1g8AwUJjDwAAAACAjdHYw3EuvfRSs0twDLI2Dlkbh6wBBIr1A0Cw8Lg7OM6aNWvMLsExyNo4ZG0csgYQKNYP+/rxxx+1adMmffvtt/J4PIqJiVFCQoLatm1b4/5Hjx7V4sWLdffdd8vlchlcLZzIUWfsly5d6tfzIxMSEvTuu+8GryCY4g9/+IPZJTgGWRuHrI1D1gACxfphLz/99JOWLFmixMREtW7dWsOHD9ett96qyZMn69prr1VMTIx69eql5557TkePHq36vqNHj+o3v/mNZs2apc8++8zEnwBO4qjG/mwVFRWaPXu22rRpo/DwcKWmpurQoUNVr48ePVr5+fkmVohgWL16tdkl+KxDhw5avHix1zaPx6OIiAi9/vrrJlXlO7tkvX//fj300EP61a9+pZiYGCUlJenFF1/UiRMnzC7NZ3bJWmJeG+HYsWNq06aN19nBn376SQMHDtSYMWNUWVlpYnWNT0lJiSZOnKhOnTqpQ4cOuuGGG/Tee+/J4/GYXdo5MUfMYYf14zS7r9X19dFHH6l379667bbb9M9//lNz587Ve++9p6+++kq7du3Shx9+qMcff1zNmjXTjBkz1KNHD73zzjtVTX1JSYn+7//+T/369TP7R4FDOLqxz8nJUX5+vkpKSrRv3z5J0oQJE6peHz16tAoKCswqDw63f/9+HThwQH369PHavmvXLh09elT9+/c3qbLG5aOPPlKPHj306KOPaufOnfr++++1ceNGTZ06VQMHDvT6Yx/qj3ltjJYtW2rWrFnKzs6Wx+NRRUWFxo0bp7CwMK1YsUIhIY7+9d+gcnJydNlll2nFihVV87ugoEDDhw/X9OnTLdvcM0dQG6ev1c8++6wGDx6siooKFRYWasuWLbr//vs1dOhQde3aVRdeeKGGDBmiWbNm6ZNPPtFHH32kqKgoXXvttYqLi6tq6lNTU83+UeAglli1V61apV69eqlly5YaPny4Zs6cqbFjxwZ93Ly8PGVkZKhr166KjIzUvHnzVFhYqK+//lqS1KdPHzVp0kSbNm0Kei3A2UpLSxUaGqq4uDiv7Zs3b1ZMTIw6d+5sUmWNx6FDh3Tdddfp+PHjXttPn6n6/PPPNX78eDNKa7SY18aZMWOGDhw4oNdee03p6enat2+f8vPzFRYWZnZpjUZBQYHuv/9+SfI6w3366+eff17PPPOMKbX5gjmCc3HyWv3iiy/qrrvu0qhRo7RlyxalpKTU+Rn5yy+/XEVFRWrbtq2++eYb3XTTTTT1MJzpjf1LL72k++67T4sWLdKRI0c0YsQIPf300+rbt69fx8nJyVHv3r193v/IkSPau3evEhISqrZ169ZNERER2rJlS9W2UaNGcTl+I1NcXGx2CT4pLS1V9+7d1axZM6/tmzdvts1fyq2e9ZIlS+R2u895yWllZaXef/99bd261eDK/Gf1rE9jXhunRYsWmj17tiZNmqSioiIVFhYqIiLC7LIalfnz59d6ZtvlcumJJ55QRUWFgVX5jjliPLusH41hrQ7El19+qbvuukvDhw/X6tWr1bJlS5++7+jRoxo9erR++OEHXX755XrllVf0ySefBLlawJupjf2JEyc0c+ZM5eXladCgQQoNDdWUKVNUUVFR1dgvX75cAwYM0IABA/TBBx+c81iZmZleDXld3G63JCkyMtJre1RUVNVrknTddddp7dq1/vxYsLht27aZXYJPSktLtXPnTkVHR3v9k5ubq8TERLPL84nVs37jjTd8ulOtHf64Z/WsT2NeG+/48ePKzMxUTEyM2aU0KocPH9Zf/vKXWj+L7vF4tHfvXn3++ecGVuY/5ohx7LJ+NIa1OhB33HGHmjVrpqVLl+q8887z6XvO/kz92rVr1aFDB912223cqwKGMvVxd8XFxaqsrNQ111xTte3gwYOSpL59+6q8vFwLFizQhg0bdOzYMV155ZX67LPPFBoaWu+xw8PDJf1y5v5M5eXlXn+t3rNnj2JjY+s9Xl14DEbDuPfee+vcZ+HChXXut3DhwoYqyUtycrLP+27cuFFZWVmaOHGi1/ZevXr59dfy4uLioMwvq2fdkObMmaM5c+aYNr6Vs/ZnTkvM6/rwN+vly5frscceU1pamp566ilNmTIloMyClbWT+HsVYqDMmCPMD2++rA1Oeg8iWXeOnJ1HWVmZioqK9MQTT6h9+/Y+HePspv705fePPfaYJkyYoA8++EDDhg3z+h6r5gF7qO2+LaY29t9//321Zz+uXLlS7dq1U7t27bRu3ToNGjRIYWFhCgsLU5cuXfTVV1+pe/fu9R47KipKsbGx+vTTTxUfHy/plxuCuN1ur0v6CwoKDPmMjFVvrmM3O3bsqHOfhQsXKj09vdZ9FixY0FAlVfHnUYs7d+7U4cOHlZKSok6dOnltLy8v9+uXanJysoqKivyo1DdWztpXY8eO1WuvvVbnX9SXLFmiyZMnG1RVdVbN2p85LTGv68PfrN9++21NmzZNb731lhISEnThhRdq9erVGjdunN9jBytruzt16pSio6O9HnFVk5CQEO3bt8/nRiFQZs0R5oe3utYQp70Hkaw5R2rKY8mSJWrWrJnPv+/P1dRLv7y/uPfee7V48eJqjb0V80DjYOql+HFxcdq5c6eKi4t16tQprVy5Ujk5OVWN9g8//KBWrVpV7d+qVSv98MMPDTZ+enq6cnNztXv3brndbmVkZCglJUVdunSR9MtHBT788EONGDGiwcYEfFFaWqrmzZtXuxvt+vXr1blzZy6XbCDp6el1NvUtW7YMqBlCdcxrY6xfv14333yzli1bpsGDB1d9jjo7O5vLQhtQ06ZNlZaWVuuZt5CQEI0cOTLoTb2/mCOojVPX6vXr12vAgAFevce51NbUS1JYWJiuvvpqbdiwIVjlAtWY2tj3799fDz74oG688UZ16tRJJSUlSkpKqrpkrXXr1jp8+HDV/ocPH1br1q1rPNbcuXOr3bmzLpmZmRo5cqQSExPVsWNHVVRUaPny5VWvr1u3Tn379lV0dHQAPx2s6pFHHjG7hDqVlpYqMTFRTZp4X1SzYcMGW920xupZX3311br++utr3Wf+/Plq0aKFQRUFzupZS8xrI2zdulUjRozQggULvOb29OnTdfDgQVs9Q9sOMjIy1L59+xpvoBcSEqIWLVroj3/8owmVnRtzxFxWXj9OayxrtT8qKir0+eef+/TM+bqa+tP69eunvXv3evUyQDCZeim+JGVnZys7O7vq37t06aKpU6dKkpKSknT//ffr5MmTOn78uHbv3q1u3brVeJwHHnhADzzwgF9jh4aGav78+Zo/f36NrxcUFGj06NF+HRPWZ4ezr+e6DO/55583uJL6sXrWISEheuWVVzRz5kz993//t/71r39Vvda6dWvNmzdPaWlpJlboO6tnLTGvjdCzZ0/9+OOP1bY3b95c3333nQkVNW7t27fXxx9/rEmTJunPf/6z12s9e/bUSy+95PdJh2BjjpjLyuvHaY1lrfbHzz//rJSUlDpvDOjxeHTjjTf69Jz6Pn36aOTIkV7vLYBgMv1xd2dyu93as2dP1Rn7qKgo3XPPPRoyZIiuu+46LViwoEFunOerCy64QGPHjjVsPBijR48eZpfgGHbIOiwsTM8995z279+vJUuWSJJee+01ffvtt7Zp6iV7ZN1YkDXO1KVLFxUXF+vzzz/Xc889J+mXS3rLysqqPloInMb6YU1hYWEqKCio8w8vLpdLmZmZdTb1kpSSkqKCgoJq9xMDgsX0M/Zn2rp1q8LDw73Oyk+cOLHaHTkDFR8fr1tvvdXn/bOyshpkXADW16ZNG02ePFlpaWm64YYbzC4HgM307NlTPXv21PTp0zVgwACzywEQJFdffbXZJQA1slRjP3DgQK9nyDe0+Ph4/noOAAAAAGhULHUpPmAEfx8JhMCRtXHI2jhkDSBQrB8AgoXGHo7TmG/+YjVkbRyyNg5ZAwgU6weAYKGxh+PceeedZpfgGGRtHLI2DlkDCBTrB4BgobGH4xQVFZldgmOQtXHI2jhkDSBQrB8AgoXGHgAAAAAAG6OxBwAAAADAxiz1uDvACNu3bzdt7LKyMkPviFtWVmbqIx7NzNppzMra6Dl9ekwnzmsnZg3/OO13jB056T3I6TGtOkfIA40NZ+zhOKtWrTJl3Pj4eMMXczPGPJNZWTuRGVmbNb+cOK+dmjV858TfMXbkpPcgZo5bl/rUtWvvgRq/Dva4QF1cHo/HY3YRQEPZsWNHnfv06NGjzr+YX3LJJQ1VUqPVWLN2uVyy2rLYWLO2IrJGfVlxDYFx6lpDWD/sLzM3TzkZ6dW+BszGGXsAAAAAAGyMxh4AAAAAABujsYfjLFq0yOwSHIOsjUPWxiFrAIFi/QAQLDT2cJy4uDizS3AMsjYOWRuHrAEEivUDQLDQ2MNxkpOTzS7BMcjaOGRtHLIGECjWDwDBQmMPAAAAAICN0djDcRITE80uwTHI2jhkbRyyBhAo1g8AwUJjD8cpLS01uwTHIGvjkLVxyBpAoFg/AAQLjT0AAAAAADZGYw8AAAAAgI3R2MNxXn31VbNLcAyyNg5ZG4esAQSK9QNAsNDYAwAAAABgYzT2cJwxY8aYXYJjkLVxyNo4ZA0gUKwfAIKlidkFAE5xzz33qKyszPBx4+Pj9eSTTxo+Lho/s+a05Lx5bdesWfeMY8es7Tqv7YisYRbmnnE4Yw8YpKyszPCFzYwx4RxmzS8nzmu7Zs26Zxw7Zm3XeW1HZA2zMPeMwxl7OM706dNNGzs+Pl5FRUWGjTdkyBDDxqqJmVk7jVlZGz2nJefOa7tm7bR1z0x2zNqu8zpQTnoPIjn7/0f8G3PPGJyxh+PMmDHD7BIcg6yNQ9bGIWsAgWL9ABAsNPZwnMGDB5tdgmOQtXHI2jhkjbO53W4VFxdr5cqVkqT3339fP/zwg8lVwYpYPwAEC5fiw3EOHjxodgmOQdbGIWvjkDUk6eTJk1q9erUWLVqkDRs2eL02bNgwSVLv3r11xx13aMKECWrZsqUZZcJiWD8ABAtn7AEAAPzwySefqF+/fpowYYIOHTqkrKwsrV27Vjt27JAkvffee3rssccUGhqqadOmqUePHlq3bp3JVQMAGjMaezjOpZdeanYJjkHWxiFr45C1sy1evFgDBgyQ2+1Wfn6+duzYoYcffljXXnutLr74YknS0KFDlZmZqU2bNunPf/6zIiIi9Jvf/EZZWVnyeDwm/wQwE+sHgGChsYfjrFmzxuwSHIOsjUPWxiFr51qxYoWmTJmiYcOGaevWrRo1apRCQs79VsrlcmnQoEHatGmTbr31Vj3yyCPKyckxsGJYDesHEBzl5eVml2A6Gns4zh/+8AezS3AMsjYOWRuHrJ1p9+7duv3225WcnKz8/HxFRkb6/L3nn3++Fi9erPHjx2vOnDn661//GsRKYWWsH8C5HT9+XEuWLNGECRN06aWXqnXr1oqOjlafPn2UlpamV155RadOnar2fbm5uerZs6f27dtnQtXW4ajGfunSpX490zAhIUHvvvtu8AqCKVavXm12CY5hp6y///57vfjii5J+OaNy8uRJkyvyj52ytjuydqZp06YpJCREL7/8ssLCwvz+/pCQEL3wwgvq2LGjbrvtNlVWVgahSlgd6wdQ3alTp5SVlVW1Pn7wwQe66KKLNH78eN10001q37693nzzTY0fP16dO3fW008/XbWG5ubmKjMzU4MHD1a7du1M/knM5ajG/mwVFRWaPXu22rRpo/DwcKWmpurQoUNVr48ePVr5+fkmVgin69ChgxYvXuy1zePxKCIiQq+//rpJVTUuJ0+e1B133KGOHTtq6tSpkqQxY8aoQ4cOVY0+GhbzOviOHTumNm3aeF32+9NPP2ngwIEaM2aMpZtKK86PL774QoWFhbr//vvVuXPngI8TERGh3NxcffHFF5Y4cWDFrGtj53ltR3abH7CnL7/8Uv3799cjjzyioUOH6i9/+Yv279+vgoICPfvss3ruuedUWFio7777ToWFherdu7fuvvtuJScn68EHH1RmZqbGjx+vZcuWqUkTZz/wzdGNfU5OjvLz81VSUlJ16caECROqXh89erQKCgrMKg8Ot3//fh04cEB9+vTx2r5r1y4dPXpU/fv3N6myxqOyslLjxo3Tn/70J/38889er/3444+aOnWqnn/+eZOqa5yY18Zo2bKlZs2apezsbHk8HlVUVGjcuHEKCwvTihUrav1cuJmsOj+WLFmipk2basqUKfU+Vmpqqtq2bVutYTKaVbOujV3ntR3ZcX7AfrZv365BgwbpH//4hwoKCvTqq6/qiiuukMvlqrZvSEiIUlJS9O677+qll15SSUmJ5s6dq+uvv56m/v+zxAq4atUq9erVSy1bttTw4cM1c+ZMjR07Nujj5uXlKSMjQ127dlVkZKTmzZunwsJCff3115KkPn36qEmTJtq0aVPQa4FxiouLzS7BJ6WlpQoNDVVcXJzX9s2bNysmJqZeZ42MYvWs33///Tr/ePf73/9ex44dM6iiwFk969OY18aZMWOGDhw4oNdee03p6enat2+f8vPzA7qM3ChWnR/r16/Xr3/9a7Vp06bex2ratKmGDRum9evXN0BlgbNq1nWx47w+k13WD7vOD9jHsWPHNGLECIWEhOijjz7SyJEjffo+l8ulAwcO6F//+peaNGmi/fv3B7lS+zC9sX/ppZd03333adGiRTpy5IhGjBihp59+Wn379vXrODk5Oerdu7fP+x85ckR79+5VQkJC1bZu3bopIiJCW7Zsqdo2atQoLsdvZLZt22Z2CT4pLS1V9+7d1axZM6/tmzdvts1fyq2edV5eXp1neI4dO2aLz0RaPevTmNfGadGihWbPnq1JkyapqKhIhYWFioiIMLusWllxfng8HpWVlalfv34NdsyEhAR9++23OnjwYIMd019WzNoXdpzXZ7LL+mHX+QH7uP/++7V7926tXr1a3bt39/n7Tn+mfvz48Vq6dKlKS0v1xBNPBLFS+zC1sT9x4oRmzpypvLw8DRo0SKGhoZoyZYoqKiqqGvuhQ4cqOjpajz76aK3HyszM9GrI6+J2uyWp2l1to6Kiql6TpOuuu05r1671+biwvmnTppldgk9KS0u1c+dORUdHe/2Tm5urxMREs8vzidWz/tvf/ubTZzJ37txpQDX1Y/WsT2NeG+/48ePKzMxUTEyM2aXUyYrz4+eff9ZPP/3UIGfrTzt9LDMfz2TFrP1hp3l9JrusH3afH7C2b775RosWLdKdd96pQYMG+fx9Zzb1y5Yt0y233KJRo0Zp7ty5tri6MthM/TBCcXGxKisrdc0111RtO/3X69ON/dKlS/X+++83+OMLwsPDJf1y5v5M5eXlXn/53bNnj2JjYxt07JrU9FkS+O/ee+/1ab+8vLxaX1+4cGFDlFNNcnKyz/tu3LhRWVlZmjhxotf2Xr16+fXX8uLi4qDML6tn3ZDmzp2ruXPnmja+lbP2Z05LzOv68Dfr5cuX67HHHlNaWpqeeuopTZkyJaDM6pt1Y1n3HnroIT300EM+7evr2P6cpfKFHbO267w+F1/WECe9B5GCl7WZcjNvr/Fr1OzsuZeXlyePx6PZs2f7fIyzm/rTn6nPyMhQQUGBVq5cqfT0dK/vaYxzz+PxnPM1Uxv777//Xm3btvXatnLlSrVr167qcQWdOnUKythRUVGKjY3Vp59+qvj4eEm/3BDE7XZ7XdJfUFCg1NTUoNRwptr+I8F3O3bsqHOfhQsXVvsf/2wLFixoqJKq+POoxZ07d+rw4cNKSUnx+n9g586dKi8v9+uXanJysoqKivyo1DdWztpXjz/+uH7/+9/Xud/WrVurfc7QSFbN2p85LTGv68PfrN9++21NmzZNb731lhISEnThhRdq9erVGjdunN9j1yfrxrLuXXTRRYqPj9err75a574ul6vO3+mnP4Lodrt13nnnNUiNdszarvO6NnWtIU57DyIFL2uzZObmKScjvdrXqFlNc2/t2rVKTk5Wly5dfDrGuZp6SRowYIAuuugirV27ttr/W41t7tXF1Evx4+LitHPnThUXF+vUqVNauXKlcnJyqhrtYEtPT1dubq52794tt9utjIwMpaSkVE2yEydO6MMPP9SIESMMqQfGeOSRR8wuoU6lpaVq3rx5tbvRrl+/Xp07d7bNpYdWz3ry5MmKjIw85+fsXS6Xhg8fbmpT7yurZy0xr42yfv163XzzzVq2bJkGDx5c9Znk7OxsSz8OzMrzIyEhQX/9618bLL8NGzaoT58+DdbU+8vKWZ+LXef12ay+fkj2nB+wj5MnT2rr1q1KSkryaf/amnrpl/dqSUlJ3OxcJjf2/fv314MPPqgbb7xRnTp1UklJiZKSkvy+cZ70y6Wy/r75zszM1MiRI5WYmKiOHTuqoqJCy5cvr3p93bp16tu3r6Kjo/2uB9YVyF/2jVZaWqrExMRqi9eGDRtsddMaq2cdHR2tt99+Wy1btvTafrrR79Onj1asWGFGaX6zetYS89oIW7du1YgRI7RgwQJdf/31VdunT5+ugwcPWvpGkFaeHzfccIP279/fIM+e/+KLL7RhwwbdcMMNDVBZYKycdU3sPK/PZuX14zS7zQ/Yy+k72vvyUaS6mvrTunfvrv3791d7dLHTmP7Av+zsbGVnZ1f9e5cuXTR16lS/j/PAAw/ogQce8Ot7QkNDNX/+fM2fP7/G1wsKCjR69Gi/a4G19ejRQ9u3bze7jFqd6zI8uz1T3Q5ZDxw4UNu3b1deXp5eeeUVffnll/r1r3+t9PR03XzzzdXuCGxVdsiaeR18PXv21I8//lhte/PmzfXdd9+ZUJHvrDw/brzxRsXExOjRRx/V8OHD6/W89EcffVRNmzZVWlpaA1boHytnXRM7z+uzWXn9OM1u8wP20rFjR3355ZfVPo59tp9//lnvvfdenU29JN15550aP358vdbmxsD0xv5Mbrdbe/bs8Tpjn5aWppKSEp08eVIlJSV68803Davnggsu0NixYw0bD4A5OnTooKysLGVlZcnlcmnDhg1mlwTAQpo2baqcnBxNnjxZzzzzjO6+++6AjvPGG2/of//3f5WVldWgd9kHALs477zzfDpb36RJE7355ps677zzam3qpV+eNMKaarHGfuvWrQoPD1e3bt2qti1ZsqTBjh8fH69bb73V5/2zsrIabGwAAGBfkyZN0po1a3TfffcpNjbW70vpN2zYoAkTJqhv3766//77g1QlADQedrlq0iosdb3CwIED5Xa7g/ZYAn8bezRO/t6FF4Eja+OQtXHI2plcLpdWrlypxMREjR07Vg8//LBOnTpV5/dVVlbqueee09VXX6127drprbfeUtOmTQ2oGFbE+gEgWCzV2ANG4DNixiFr45C1ccjaucLDw6s+85mdna3evXtr0aJFKi8vr7bviRMntHz5ciUlJWnGjBkaPHiwPvroI3Xo0MGEymEVrB8AgoXGHo5z5513ml2CY5C1ccjaOGTtbC1bttTLL7+sgoICtWjRQtOnT1erVq108cUX69prr5Uk9e7dWxEREZowYYLcbrf+53/+R++88w6PCQPrB4CgsdRn7AEjFBUVmV2CY5C1ccjaOGQNSRo5cqRGjBihTz75RO+99542bdqkffv2SZI6d+6s66+/XkOGDNGVV14ZtI8Ywn5YPwAE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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "qc.measure(qub[0],cb[0])\n", "qc.measure(qub[1],cb[1])\n", @@ -428,9 +581,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Select the QasmSimulator from the Aer provider\n", "simulator = Aer.get_backend('qasm_simulator')\n", @@ -452,9 +617,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Informe seu API_TOKEN: ········\n" + ] + } + ], "source": [ "import getpass\n", "\n", @@ -462,24 +635,61 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], + "source": [ + "### Máquinas disponíveis" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "IBMQ.enable_account(MY_API_TOKEN)\n", - "IBMQ.backends(operational=True)" + "AccountProvider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')\n", + "AccountProvider.backends(operational=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Escolhendo uma máquina e rodando o algoritmo" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], - "source": [ - "backend = IBMQ.get_backend('ibmqx4')\n", + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Error checking job status using websocket, retrying using HTTP.\n" + ] + } + ], + "source": [ + "backend = AccountProvider.get_backend('ibmqx4')\n", "\n", - "job_sim = execute(deutsch, backend)\n", + "job_sim = execute(qc, backend)\n", "sim_result = job_sim.result()\n", "\n", "counts = sim_result.get_counts(deutsch)\n", diff --git a/grover.ipynb b/grover.ipynb index f4bec0a..25abc74 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -634,6 +634,13 @@ "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Máquinas disponíveis" + ] + }, { "cell_type": "code", "execution_count": 14, @@ -659,6 +666,13 @@ "AccountProvider.backends(operational=True)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Escolhendo uma máquina e rodando o algoritmo" + ] + }, { "cell_type": "code", "execution_count": null, From a8ba3a766c94e543bbfabe625f6b99850caf8232 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Thu, 15 Aug 2019 19:56:05 -0300 Subject: [PATCH 44/49] deletando os arquivos --- simon.ipynb | 0 superdense.ipynb | 333 --------------------------- teletransporte.ipynb | 528 ------------------------------------------- 3 files changed, 861 deletions(-) delete mode 100644 simon.ipynb delete mode 100644 superdense.ipynb delete mode 100644 teletransporte.ipynb diff --git a/simon.ipynb b/simon.ipynb deleted file mode 100644 index e69de29..0000000 diff --git a/superdense.ipynb b/superdense.ipynb deleted file mode 100644 index c4a883a..0000000 --- a/superdense.ipynb +++ /dev/null @@ -1,333 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Superdense\n", - "\n", - "**Definição:** Dense code usa um qubit compartilhado com um pars EPR para decondificar e transmitir dois bits clássicos.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " *Obs.:* EPR ou Einstein–Podolsky–Rosen paradox (EPR paradox) é um paradoxo que avalia que em certas circunstancias a medição do estado de A pode determinar com um precisão arbritária o estado de outro qubit B, mesmo a longas distâncias desde que estejam emaranhados.
Fonte: https://phys.org/news/2018-04-einstein-podolsky-rosen-paradox-many-particle.html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Como funciona?\n", - "\n", - "Agora iremos supor que Alice e Bob querem se comunicar e que Alice tem o primeiro qubit e Bob o segundo.\n", - "\n", - "
1.Inicialmente irimos ter dois bits emaranhados:\n", - "\n", - "$|\\psi_0\\rangle = \\frac{1}{\\sqrt{2}}(|0_A0_B\\rangle + |1_A1_B)$\n", - "\n", - "Sabendo disso, devemos ter em mente que Alice só pode transforma o qubit dela e Bob só poderá transformar o qubit dele. Isso poderá ser feito da seguinte forma: Se alice tem n qubits e Bob m qubits, temos que a transformação realizada por alice será $I^{m}\\otimes U$, onde U é a matrix de transformação para n qubits, enquanto a de Bob $I^n\\otimes U$ onde U é a matrix de transformação para m qubits." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### O que é feito?\n", - "\n", - "\n", - "Alice que transmiti dois bits que representam valores entre 0 e 3 para isso ele realiza uma transformação no seu qubit $|\\psi_0\\rangle$.\n", - "\n", - "Valor______Transformação_______Novo Estado\n", - "
\n", - "\n", - "\n", - "0 || $|\\psi_0\\rangle = (I\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle)$
\n", - "1 || $|\\psi_0\\rangle = (X \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle)$
\n", - "2 || $|\\psi_0\\rangle = (Z \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle)$
\n", - "3 || $|\\psi_0\\rangle = (Y\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle)$
\n", - "\n", - "Depois disso Bob usa C_not e nos dois bits emaranhados e depois apliaca Hadamard: \n", - "
\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle) \\\\\n", - "\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle) \\\\ \n", - "\\end{cases} $\n", - "\n", - "$C_not$\n", - "$\\rightarrow$\n", - "\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle + |10\\rangle) \\\\\n", - "\\frac{1}{\\sqrt{2}}(|11\\rangle - |01\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle - |10\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|11\\rangle + |01\\rangle) \\\\ \n", - "\\end{cases} $\n", - "=\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|0\\rangle + |1\\rangle)\\otimes|0\\rangle \\\\\n", - "\\frac{1}{\\sqrt{2}}(|1\\rangle - |0\\rangle)\\otimes|1\\rangle \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|0\\rangle - |1\\rangle)\\otimes|0\\rangle \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|1\\rangle + |0\\rangle)\\otimes|1\\rangle \\\\ \n", - "\\end{cases} $\n", - "\n", - "$H\\otimes I$ \n", - "$\\rightarrow$\n", - "\n", - "$ \\begin{cases}\n", - " |00\\rangle \\\\\n", - " |01\\rangle \\\\ \n", - " |10\\rangle \\\\ \n", - " |11\\rangle \\\\ \n", - "\\end{cases} $\n", - "\n", - "\n", - "Ao final do processo Bob terá os mesmo bits que foram enviados por Alice." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exemplo: Supondo que o bit represente o valor 1" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import qiskit as qkit \n", - "import time\n", - "from qiskit import Aer\n", - "from qiskit.tools.visualization import circuit_drawer\n", - "from qiskit.tools.visualization import plot_histogram\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Iniciando os registradores quânticos e clássicos" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "rq = qkit.QuantumRegister(size=2)\n", - "rc = qkit.ClassicalRegister(size=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "superdense = qkit.QuantumCircuit(rq, rc)\n", - "\n", - "\n", - "superdense.h(rq[0])\n", - "superdense.cx(rq[0], rq[1])\n", - "\n", - "superdense.x(rq[0])\n", - "\n", - "superdense.cx(rq[0], rq[1])\n", - "superdense.h(rq[0])\n", - "superdense.measure(rq[0], rc[0])\n", - "superdense.measure(rq[1], rc[1])\n", - "circuit_drawer(superdense)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">\n", - "Faltam 0 segundos\n", - ">\n", - "Faltam 1 segundos\n", - ">\n", - "Faltam 2 segundos\n", - ">\n", - "Faltam 3 segundos\n", - ">\n", - "Faltam 4 segundos\n", - ">\n", - "Faltam 5 segundos\n", - ">\n", - "Faltam 6 segundos\n", - ">\n", - "Faltam 7 segundos\n", - ">\n", - "Faltam 8 segundos\n", - ">\n", - "Faltam 9 segundos\n", - ">\n", - "Faltam 10 segundos\n", - ">\n", - "Faltam 11 segundos\n", - ">\n", - "Faltam 12 segundos\n", - ">\n", - "Faltam 13 segundos\n", - ">\n", - "Faltam 14 segundos\n", - ">\n", - "Faltam 15 segundos\n", - ">\n", - "Faltam 16 segundos\n", - ">\n", - "Faltam 17 segundos\n", - ">\n", - "Faltam 18 segundos\n", - ">\n", - "Faltam 19 segundos\n", - ">\n", - "Faltam 20 segundos\n", - ">\n", - "Faltam 21 segundos\n", - ">\n", - "Faltam 22 segundos\n", - ">\n", - "Faltam 23 segundos\n", - ">\n", - "Faltam 24 segundos\n", - ">\n", - "Faltam 25 segundos\n", - ">\n", - "Faltam 26 segundos\n", - ">\n", - "Faltam 27 segundos\n", - ">\n", - "Faltam 28 segundos\n", - ">\n", - "Faltam 29 segundos\n", - ">\n", - "Faltam 30 segundos\n", - ">\n", - "Faltam 31 segundos\n", - ">\n", - "Faltam 32 segundos\n", - ">\n", - "Faltam 33 segundos\n", - ">\n", - "Faltam 34 segundos\n", - ">\n", - "Faltam 35 segundos\n", - ">\n", - "Faltam 36 segundos\n", - ">\n", - "Faltam 37 segundos\n", - ">\n", - "Faltam 38 segundos\n", - ">\n", - "Faltam 39 segundos\n", - ">\n", - "Faltam 40 segundos\n", - ">\n", - "Faltam 41 segundos\n", - ">\n", - "Faltam 42 segundos\n", - ">\n", - "Faltam 43 segundos\n", - ">\n", - "Faltam 44 segundos\n", - ">\n", - "Faltam 45 segundos\n", - ">\n", - "Faltam 46 segundos\n", - ">\n", - "Faltam 47 segundos\n", - ">\n", - "Faltam 48 segundos\n", - ">\n", - "Faltam 49 segundos\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "shots = 50\n", - "job = qkit.execute(superdense, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", - "k =0 \n", - "wait_time = 1 \n", - "while k < shots:\n", - " print(job.status)\n", - " print(\"Faltam {0} segundos\".format(k))\n", - " k = k + wait_time\n", - " time.sleep(wait_time)\n", - " \n", - "results_sim = job.result()\n", - "outputs_sim = results_sim.get_counts()\n", - "\n", - "plot_histogram(outputs_sim)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/teletransporte.ipynb b/teletransporte.ipynb deleted file mode 100644 index 417848e..0000000 --- a/teletransporte.ipynb +++ /dev/null @@ -1,528 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Teletransporte\n", - "\n", - "**Definição:** Teletransporte quântico é o processo pela qual um estado arbritário de qubits é transferido de uma localização para outra." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Em que se basea: \n", - "\n", - "Baseado no teorema da não-clonagem de que move bits quânticos é possível, porém copia-los é impossível. O algoritmo de teletransporte vai trabalhar com o emaranhamento de dois qubits um utilizado por um lado da comunicação e o outro bit pelo outro lado. Neste caso chamaremos uma pessoa de Alice e outra de Bob.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ferramentas necessárias: \n", - "\n", - "Para darmos procegimento a ideia de teletransportar informações através de bits quânticos, precisamos saber que mudanças de bases de qubits canonicais e não canonicais pode ser últil. No nosso caso uma utilizaremos uma base canonical com quatro dimensões. Como mostrado a seguir:\n", - "\n", - "**Base canonica:** $\\{|0_A0_B \\rangle, |0_A1_B\\rangle, |1_A0_B\\rangle, |1_A1_B\\rangle \\}$\n", - "
Enquanto isso uma base não-canonica chamada **Bell basis** que consiste em 4 vetores:\n", - " \n", - " $|\\Psi+\\rangle = \\frac{|0_A1_B \\rangle + |1_A0_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Psi-\\rangle = \\frac{|0_A1_B \\rangle - |1_A0_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Phi+\\rangle = \\frac{|0_A0_B \\rangle + |1_A1_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Phi-\\rangle = \\frac{|0_A0_B \\rangle - |1_A1_B\\rangle}{\\sqrt{2}}$
\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " ### Como tudo funciona:\n", - " \n", - " Antes de tudo Alice possui um qubit $|\\psi\\rangle = \\alpha|0\\rangle + \\beta|1\\rangle$ a qual deseja teletransportar para Bob. \n", - " \n", - " Então mais dois quibits emaranhados são colocados no sistema de forma que o estado inicial é composto por três qubits da seguinte forma: $|\\Psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle$ aplicando ao circuito\n", - " $(C_not\\otimes I)(H\\otimes I)$ afim de obtermos o estado $|\\Phi+\\rangle$ (ou qualquer outro estado vetor da base não-canonica de Bell a depender dos bits de entrada) para realizarmos a transmição do qubit de interesse.\n", - " \n", - "os bits de entrada e os elementos da base não-canonica de Bells que geram:\n", - "\n", - "$$|00\\rangle \\rightarrow |\\Phi+\\rangle, |01\\rangle \\rightarrow |\\Psi+\\rangle, |10\\rangle \\rightarrow |\\Phi-\\rangle,|11\\rangle \\rightarrow |\\Psi-\\rangle$$\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Gerando a base não-canônica de Bell:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$|\\varphi_0\\rangle = |\\psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle = (\\alpha|0\\rangle + \\beta|1\\rangle)\\otimes|00\\rangle$$\n", - "$$|\\varphi_1\\rangle = |\\psi\\rangle\\otimes\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\otimes|0\\rangle$$\n", - "$$|\\varphi_2\\rangle = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |10\\rangle}{\\sqrt{2}} = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}} $$ \n", - "$$|\\varphi_2\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|00\\rangle + |11\\rangle)}{\\sqrt{2}} = |\\psi\\rangle\\otimes|\\Phi+\\rangle$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Dessa forma Alice controla os dois primeiros bits enquanto Bob apenas o último. A parti daí Alice usa o processo de decondificação dessa forma o qubit a ser transmitido e a metade emaranhada que ela possui podem ser combinadas. Para tal ela tem implementado o seguinte circuito quântico: $(C_not\\otimes I)$ seguido por $(H\\otimes I\\otimes I)$,\n", - "sendo assim $(H\\otimes I\\otimes I)(C_not\\otimes I)(|\\psi\\rangle\\otimes|\\Phi+\\rangle)$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - " Ao passar pelo circuito teremos:\n", - "\n", - "$$|\\varphi_3\\rangle = \\frac{\\alpha(|0\\rangle + |1\\rangle)(|00\\rangle + |11\\rangle) + \\beta(|0\\rangle - |1\\rangle)(|10\\rangle + |01\\rangle)}{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|10\\rangle + |01\\rangle)}{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{\\alpha|000\\rangle + |011\\rangle + |100\\rangle + |111\\rangle + \\beta|010\\rangle + |001\\rangle + -|110\\rangle + |101\\rangle }{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{|00\\rangle(\\alpha|0\\rangle + \\beta|1\\rangle) + |01\\rangle(\\beta|1\\rangle + \\alpha|0\\rangle) + |10\\rangle(\\alpha|0\\rangle - \\beta|1\\rangle) + |11\\rangle(-\\beta|0\\rangle + \\alpha|1\\rangle)}{2}$$" - ] - }, - { - "attachments": { - "image.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Circuito Completo:\n", - "\n", - "![image.png](attachment:image.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Neste momento os dois qubits de Alice são medidos e então os três qubits colapsão para um das quatro possibilidades. Supondo que \n", - "o bit colapsado seja $|10\\rangle$ temos que lidar com dois problemas:\n", - "\n", - "(a) Apesar de Alice saber o estado Bob não sabe.
\n", - "(b) Bob $\\alpha|0\\rangle - \\beta|1\\rangle$, mas não o qubit desejado.
\n", - "\n", - "A fim de resolver este problema Alice envia uma copia de dois bits que usa essa informação para alcançar o estado desejado." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Rebendo $|01\\rangle$ então ele sabe o qubit está no estado:\n", - "\n", - " \n", - "$$ \n", - "\\begin{equation*}\n", - "\\alpha|0\\rangle - \\beta|1\\rangle = \\begin{vmatrix}\n", - " \\alpha \\\\\n", - " -\\beta \\\\\n", - "\\end{vmatrix}\n", - "\\end{equation*};\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Após este vetor agir sobre a seguinte base \n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$ teremos:\n", - "\n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "$\n", - "\\begin{vmatrix}\n", - "\\alpha \\\\\n", - "-\\beta \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "$\n", - "= \n", - "\\begin{vmatrix}\n", - "\\alpha \\\\\n", - "\\beta \\\\\n", - "\\end{vmatrix}\n", - "= \n", - "$\n", - "$\\alpha|0\\rangle + \\beta|1\\rangle = |\\psi\\rangle$\n", - "\n", - "E agora Bob tem a informação que estava com Alice.
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Bit recebido:**\n", - "1. $|00\\rangle$\n", - "2. $|01\\rangle$\n", - "3. $|10\\rangle$\n", - "4. $|11\\rangle$\n", - "
\n", - "
\n", - "\n", - "**Matriz de reconstrução de Bob:** \n", - "
\n", - "
\n", - "1.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - " 1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "2.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - " 1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "3.\n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "4.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - "-1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Pontos a serem observados:\n", - "\n", - "1. Alice não possui mais o estado $|\\psi\\rangle$.\n", - "2. Os bits clássicos navegam em um canal clássico e é impossível que Bob chegue a informação sem que este bits sejam transmitidos.\n", - "3. $\\alpha$ e $\\beta$ são números complexos arbritarios que satisfazem a equação $|\\alpha|^{2} + |\\beta|^{2} = 1$ podendo ter uma expansão infinito decimal porém toda essa informação. Contudo essa informação é passada na forma de qubit que quando colapsa quando passado para Bob e inutil quando medido.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulação do circuito:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import qiskit as qkit \n", - "import time\n", - "from qiskit import Aer\n", - "from qiskit.tools.visualization import circuit_drawer\n", - "from qiskit.tools.visualization import plot_histogram\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Iniciando os registradores quânticos:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "rq = qkit.QuantumRegister(size=3)\n", - "rc = qkit.ClassicalRegister(size=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Implementando o Circuito Quântico. O qubit a ser teletransportado se encontra no registra quântico na posição rq[0]." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Inicializando o circuito e criando o estado de Bell $|\\Phi+\\rangle$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "teleport = qkit.QuantumCircuit(rq, rc)\n", - "teleport.h(rq[1])\n", - "teleport.cx(rq[1], rq[2])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Combinando a parte a ser transmitida com a parte emaranhada de Alice" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: Unable to compile latex. Is `pdflatex` installed? Skipping latex circuit drawing...\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "\n", - "teleport.cx(rq[0], rq[1])\n", - "teleport.h(rq[0])\n", - "teleport.measure(rq[0], rc[0])\n", - "teleport.measure(rq[1], rc[1])\n", - "circuit_drawer(teleport)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulando o Circuito em um computador clássico" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">\n", - "Faltam 0 segundos\n", - ">\n", - "Faltam 1 segundos\n", - ">\n", - "Faltam 2 segundos\n", - ">\n", - "Faltam 3 segundos\n", - ">\n", - "Faltam 4 segundos\n", - ">\n", - "Faltam 5 segundos\n", - ">\n", - "Faltam 6 segundos\n", - ">\n", - "Faltam 7 segundos\n", - ">\n", - "Faltam 8 segundos\n", - ">\n", - "Faltam 9 segundos\n", - ">\n", - "Faltam 10 segundos\n", - ">\n", - "Faltam 11 segundos\n", - ">\n", - "Faltam 12 segundos\n", - ">\n", - "Faltam 13 segundos\n", - ">\n", - "Faltam 14 segundos\n", - ">\n", - "Faltam 15 segundos\n", - ">\n", - "Faltam 16 segundos\n", - ">\n", - "Faltam 17 segundos\n", - ">\n", - "Faltam 18 segundos\n", - ">\n", - "Faltam 19 segundos\n", - ">\n", - "Faltam 20 segundos\n", - ">\n", - "Faltam 21 segundos\n", - ">\n", - "Faltam 22 segundos\n", - ">\n", - "Faltam 23 segundos\n", - ">\n", - "Faltam 24 segundos\n", - ">\n", - "Faltam 25 segundos\n", - ">\n", - "Faltam 26 segundos\n", - ">\n", - "Faltam 27 segundos\n", - ">\n", - "Faltam 28 segundos\n", - ">\n", - "Faltam 29 segundos\n", - ">\n", - "Faltam 30 segundos\n", - ">\n", - "Faltam 31 segundos\n", - ">\n", - "Faltam 32 segundos\n", - ">\n", - "Faltam 33 segundos\n", - ">\n", - "Faltam 34 segundos\n", - ">\n", - "Faltam 35 segundos\n", - ">\n", - "Faltam 36 segundos\n", - ">\n", - "Faltam 37 segundos\n", - ">\n", - "Faltam 38 segundos\n", - ">\n", - "Faltam 39 segundos\n", - ">\n", - "Faltam 40 segundos\n", - ">\n", - "Faltam 41 segundos\n", - ">\n", - "Faltam 42 segundos\n", - ">\n", - "Faltam 43 segundos\n", - ">\n", - "Faltam 44 segundos\n", - ">\n", - "Faltam 45 segundos\n", - ">\n", - "Faltam 46 segundos\n", - ">\n", - "Faltam 47 segundos\n", - ">\n", - "Faltam 48 segundos\n", - ">\n", - "Faltam 49 segundos\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "shots = 50\n", - "job = qkit.execute(teleport, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", - "k =0 \n", - "wait_time = 1 \n", - "while k < shots:\n", - " print(job.status)\n", - " print(\"Faltam {0} segundos\".format(k))\n", - " k = k + wait_time\n", - " time.sleep(wait_time)\n", - " \n", - "results_sim = job.result()\n", - "outputs_sim = results_sim.get_counts()\n", - "\n", - "plot_histogram(outputs_sim)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Fonte:\n", - "Quantum Computing for Computer Scientists, Noson F. Yanofsky\n", - "\n", - "Rieffel, Eleanor G., and Wolfgang H. Polak. Quantum Computing : A Gentle Introduction, edited by William Gropp, and Ewing Lusk, MIT Press, 2011. ProQuest Ebook Central, https://ebookcentral.proquest.com/lib/ufrpe-ebooks/detail.action?docID=3339229. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From ec56b22a4f2272f945cf3d1ea922029357b923b5 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Thu, 15 Aug 2019 19:56:54 -0300 Subject: [PATCH 45/49] deletando arquivos --- simon.ipynb | 0 superdense.ipynb | 333 --------------------------- teletransporte.ipynb | 528 ------------------------------------------- 3 files changed, 861 deletions(-) delete mode 100644 simon.ipynb delete mode 100644 superdense.ipynb delete mode 100644 teletransporte.ipynb diff --git a/simon.ipynb b/simon.ipynb deleted file mode 100644 index e69de29..0000000 diff --git a/superdense.ipynb b/superdense.ipynb deleted file mode 100644 index c4a883a..0000000 --- a/superdense.ipynb +++ /dev/null @@ -1,333 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Superdense\n", - "\n", - "**Definição:** Dense code usa um qubit compartilhado com um pars EPR para decondificar e transmitir dois bits clássicos.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " *Obs.:* EPR ou Einstein–Podolsky–Rosen paradox (EPR paradox) é um paradoxo que avalia que em certas circunstancias a medição do estado de A pode determinar com um precisão arbritária o estado de outro qubit B, mesmo a longas distâncias desde que estejam emaranhados.
Fonte: https://phys.org/news/2018-04-einstein-podolsky-rosen-paradox-many-particle.html" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Como funciona?\n", - "\n", - "Agora iremos supor que Alice e Bob querem se comunicar e que Alice tem o primeiro qubit e Bob o segundo.\n", - "\n", - "
1.Inicialmente irimos ter dois bits emaranhados:\n", - "\n", - "$|\\psi_0\\rangle = \\frac{1}{\\sqrt{2}}(|0_A0_B\\rangle + |1_A1_B)$\n", - "\n", - "Sabendo disso, devemos ter em mente que Alice só pode transforma o qubit dela e Bob só poderá transformar o qubit dele. Isso poderá ser feito da seguinte forma: Se alice tem n qubits e Bob m qubits, temos que a transformação realizada por alice será $I^{m}\\otimes U$, onde U é a matrix de transformação para n qubits, enquanto a de Bob $I^n\\otimes U$ onde U é a matrix de transformação para m qubits." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### O que é feito?\n", - "\n", - "\n", - "Alice que transmiti dois bits que representam valores entre 0 e 3 para isso ele realiza uma transformação no seu qubit $|\\psi_0\\rangle$.\n", - "\n", - "Valor______Transformação_______Novo Estado\n", - "
\n", - "\n", - "\n", - "0 || $|\\psi_0\\rangle = (I\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle)$
\n", - "1 || $|\\psi_0\\rangle = (X \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle)$
\n", - "2 || $|\\psi_0\\rangle = (Z \\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle)$
\n", - "3 || $|\\psi_0\\rangle = (Y\\otimes I)|\\psi_0\\rangle$ || $\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle)$
\n", - "\n", - "Depois disso Bob usa C_not e nos dois bits emaranhados e depois apliaca Hadamard: \n", - "
\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle + |11\\rangle) \\\\\n", - "\\frac{1}{\\sqrt{2}}(|10\\rangle - |01\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle - |11\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|10\\rangle + |01\\rangle) \\\\ \n", - "\\end{cases} $\n", - "\n", - "$C_not$\n", - "$\\rightarrow$\n", - "\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle + |10\\rangle) \\\\\n", - "\\frac{1}{\\sqrt{2}}(|11\\rangle - |01\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|00\\rangle - |10\\rangle) \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|11\\rangle + |01\\rangle) \\\\ \n", - "\\end{cases} $\n", - "=\n", - "$ \\begin{cases}\n", - "\\frac{1}{\\sqrt{2}}(|0\\rangle + |1\\rangle)\\otimes|0\\rangle \\\\\n", - "\\frac{1}{\\sqrt{2}}(|1\\rangle - |0\\rangle)\\otimes|1\\rangle \\\\ \n", - "\\frac{1}{\\sqrt{2}}(|0\\rangle - |1\\rangle)\\otimes|0\\rangle \\\\ \n", - "\\frac{1}{\\sqrt{2}}(-|1\\rangle + |0\\rangle)\\otimes|1\\rangle \\\\ \n", - "\\end{cases} $\n", - "\n", - "$H\\otimes I$ \n", - "$\\rightarrow$\n", - "\n", - "$ \\begin{cases}\n", - " |00\\rangle \\\\\n", - " |01\\rangle \\\\ \n", - " |10\\rangle \\\\ \n", - " |11\\rangle \\\\ \n", - "\\end{cases} $\n", - "\n", - "\n", - "Ao final do processo Bob terá os mesmo bits que foram enviados por Alice." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exemplo: Supondo que o bit represente o valor 1" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import qiskit as qkit \n", - "import time\n", - "from qiskit import Aer\n", - "from qiskit.tools.visualization import circuit_drawer\n", - "from qiskit.tools.visualization import plot_histogram\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Iniciando os registradores quânticos e clássicos" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "rq = qkit.QuantumRegister(size=2)\n", - "rc = qkit.ClassicalRegister(size=2)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "superdense = qkit.QuantumCircuit(rq, rc)\n", - "\n", - "\n", - "superdense.h(rq[0])\n", - "superdense.cx(rq[0], rq[1])\n", - "\n", - "superdense.x(rq[0])\n", - "\n", - "superdense.cx(rq[0], rq[1])\n", - "superdense.h(rq[0])\n", - "superdense.measure(rq[0], rc[0])\n", - "superdense.measure(rq[1], rc[1])\n", - "circuit_drawer(superdense)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">\n", - "Faltam 0 segundos\n", - ">\n", - "Faltam 1 segundos\n", - ">\n", - "Faltam 2 segundos\n", - ">\n", - "Faltam 3 segundos\n", - ">\n", - "Faltam 4 segundos\n", - ">\n", - "Faltam 5 segundos\n", - ">\n", - "Faltam 6 segundos\n", - ">\n", - "Faltam 7 segundos\n", - ">\n", - "Faltam 8 segundos\n", - ">\n", - "Faltam 9 segundos\n", - ">\n", - "Faltam 10 segundos\n", - ">\n", - "Faltam 11 segundos\n", - ">\n", - "Faltam 12 segundos\n", - ">\n", - "Faltam 13 segundos\n", - ">\n", - "Faltam 14 segundos\n", - ">\n", - "Faltam 15 segundos\n", - ">\n", - "Faltam 16 segundos\n", - ">\n", - "Faltam 17 segundos\n", - ">\n", - "Faltam 18 segundos\n", - ">\n", - "Faltam 19 segundos\n", - ">\n", - "Faltam 20 segundos\n", - ">\n", - "Faltam 21 segundos\n", - ">\n", - "Faltam 22 segundos\n", - ">\n", - "Faltam 23 segundos\n", - ">\n", - "Faltam 24 segundos\n", - ">\n", - "Faltam 25 segundos\n", - ">\n", - "Faltam 26 segundos\n", - ">\n", - "Faltam 27 segundos\n", - ">\n", - "Faltam 28 segundos\n", - ">\n", - "Faltam 29 segundos\n", - ">\n", - "Faltam 30 segundos\n", - ">\n", - "Faltam 31 segundos\n", - ">\n", - "Faltam 32 segundos\n", - ">\n", - "Faltam 33 segundos\n", - ">\n", - "Faltam 34 segundos\n", - ">\n", - "Faltam 35 segundos\n", - ">\n", - "Faltam 36 segundos\n", - ">\n", - "Faltam 37 segundos\n", - ">\n", - "Faltam 38 segundos\n", - ">\n", - "Faltam 39 segundos\n", - ">\n", - "Faltam 40 segundos\n", - ">\n", - "Faltam 41 segundos\n", - ">\n", - "Faltam 42 segundos\n", - ">\n", - "Faltam 43 segundos\n", - ">\n", - "Faltam 44 segundos\n", - ">\n", - "Faltam 45 segundos\n", - ">\n", - "Faltam 46 segundos\n", - ">\n", - "Faltam 47 segundos\n", - ">\n", - "Faltam 48 segundos\n", - ">\n", - "Faltam 49 segundos\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "shots = 50\n", - "job = qkit.execute(superdense, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", - "k =0 \n", - "wait_time = 1 \n", - "while k < shots:\n", - " print(job.status)\n", - " print(\"Faltam {0} segundos\".format(k))\n", - " k = k + wait_time\n", - " time.sleep(wait_time)\n", - " \n", - "results_sim = job.result()\n", - "outputs_sim = results_sim.get_counts()\n", - "\n", - "plot_histogram(outputs_sim)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/teletransporte.ipynb b/teletransporte.ipynb deleted file mode 100644 index 417848e..0000000 --- a/teletransporte.ipynb +++ /dev/null @@ -1,528 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Teletransporte\n", - "\n", - "**Definição:** Teletransporte quântico é o processo pela qual um estado arbritário de qubits é transferido de uma localização para outra." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Em que se basea: \n", - "\n", - "Baseado no teorema da não-clonagem de que move bits quânticos é possível, porém copia-los é impossível. O algoritmo de teletransporte vai trabalhar com o emaranhamento de dois qubits um utilizado por um lado da comunicação e o outro bit pelo outro lado. Neste caso chamaremos uma pessoa de Alice e outra de Bob.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Ferramentas necessárias: \n", - "\n", - "Para darmos procegimento a ideia de teletransportar informações através de bits quânticos, precisamos saber que mudanças de bases de qubits canonicais e não canonicais pode ser últil. No nosso caso uma utilizaremos uma base canonical com quatro dimensões. Como mostrado a seguir:\n", - "\n", - "**Base canonica:** $\\{|0_A0_B \\rangle, |0_A1_B\\rangle, |1_A0_B\\rangle, |1_A1_B\\rangle \\}$\n", - "
Enquanto isso uma base não-canonica chamada **Bell basis** que consiste em 4 vetores:\n", - " \n", - " $|\\Psi+\\rangle = \\frac{|0_A1_B \\rangle + |1_A0_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Psi-\\rangle = \\frac{|0_A1_B \\rangle - |1_A0_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Phi+\\rangle = \\frac{|0_A0_B \\rangle + |1_A1_B\\rangle}{\\sqrt{2}}$
\n", - " $|\\Phi-\\rangle = \\frac{|0_A0_B \\rangle - |1_A1_B\\rangle}{\\sqrt{2}}$
\n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " ### Como tudo funciona:\n", - " \n", - " Antes de tudo Alice possui um qubit $|\\psi\\rangle = \\alpha|0\\rangle + \\beta|1\\rangle$ a qual deseja teletransportar para Bob. \n", - " \n", - " Então mais dois quibits emaranhados são colocados no sistema de forma que o estado inicial é composto por três qubits da seguinte forma: $|\\Psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle$ aplicando ao circuito\n", - " $(C_not\\otimes I)(H\\otimes I)$ afim de obtermos o estado $|\\Phi+\\rangle$ (ou qualquer outro estado vetor da base não-canonica de Bell a depender dos bits de entrada) para realizarmos a transmição do qubit de interesse.\n", - " \n", - "os bits de entrada e os elementos da base não-canonica de Bells que geram:\n", - "\n", - "$$|00\\rangle \\rightarrow |\\Phi+\\rangle, |01\\rangle \\rightarrow |\\Psi+\\rangle, |10\\rangle \\rightarrow |\\Phi-\\rangle,|11\\rangle \\rightarrow |\\Psi-\\rangle$$\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Gerando a base não-canônica de Bell:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "$$|\\varphi_0\\rangle = |\\psi\\rangle\\otimes|0\\rangle\\otimes|0\\rangle = (\\alpha|0\\rangle + \\beta|1\\rangle)\\otimes|00\\rangle$$\n", - "$$|\\varphi_1\\rangle = |\\psi\\rangle\\otimes\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\otimes|0\\rangle$$\n", - "$$|\\varphi_2\\rangle = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |10\\rangle}{\\sqrt{2}} = |\\psi\\rangle\\otimes\\frac{|00\\rangle + |11\\rangle}{\\sqrt{2}} $$ \n", - "$$|\\varphi_2\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|00\\rangle + |11\\rangle)}{\\sqrt{2}} = |\\psi\\rangle\\otimes|\\Phi+\\rangle$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Dessa forma Alice controla os dois primeiros bits enquanto Bob apenas o último. A parti daí Alice usa o processo de decondificação dessa forma o qubit a ser transmitido e a metade emaranhada que ela possui podem ser combinadas. Para tal ela tem implementado o seguinte circuito quântico: $(C_not\\otimes I)$ seguido por $(H\\otimes I\\otimes I)$,\n", - "sendo assim $(H\\otimes I\\otimes I)(C_not\\otimes I)(|\\psi\\rangle\\otimes|\\Phi+\\rangle)$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - " Ao passar pelo circuito teremos:\n", - "\n", - "$$|\\varphi_3\\rangle = \\frac{\\alpha(|0\\rangle + |1\\rangle)(|00\\rangle + |11\\rangle) + \\beta(|0\\rangle - |1\\rangle)(|10\\rangle + |01\\rangle)}{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{\\alpha|0\\rangle(|00\\rangle + |11\\rangle) + \\beta|1\\rangle(|10\\rangle + |01\\rangle)}{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{\\alpha|000\\rangle + |011\\rangle + |100\\rangle + |111\\rangle + \\beta|010\\rangle + |001\\rangle + -|110\\rangle + |101\\rangle }{2}$$\n", - "$$|\\varphi_4\\rangle = \\frac{|00\\rangle(\\alpha|0\\rangle + \\beta|1\\rangle) + |01\\rangle(\\beta|1\\rangle + \\alpha|0\\rangle) + |10\\rangle(\\alpha|0\\rangle - \\beta|1\\rangle) + |11\\rangle(-\\beta|0\\rangle + \\alpha|1\\rangle)}{2}$$" - ] - }, - { - "attachments": { - "image.png": { - "image/png": "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" - } - }, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Circuito Completo:\n", - "\n", - "![image.png](attachment:image.png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Neste momento os dois qubits de Alice são medidos e então os três qubits colapsão para um das quatro possibilidades. Supondo que \n", - "o bit colapsado seja $|10\\rangle$ temos que lidar com dois problemas:\n", - "\n", - "(a) Apesar de Alice saber o estado Bob não sabe.
\n", - "(b) Bob $\\alpha|0\\rangle - \\beta|1\\rangle$, mas não o qubit desejado.
\n", - "\n", - "A fim de resolver este problema Alice envia uma copia de dois bits que usa essa informação para alcançar o estado desejado." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Rebendo $|01\\rangle$ então ele sabe o qubit está no estado:\n", - "\n", - " \n", - "$$ \n", - "\\begin{equation*}\n", - "\\alpha|0\\rangle - \\beta|1\\rangle = \\begin{vmatrix}\n", - " \\alpha \\\\\n", - " -\\beta \\\\\n", - "\\end{vmatrix}\n", - "\\end{equation*};\n", - "$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Após este vetor agir sobre a seguinte base \n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$ teremos:\n", - "\n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "$\n", - "\\begin{vmatrix}\n", - "\\alpha \\\\\n", - "-\\beta \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "$\n", - "= \n", - "\\begin{vmatrix}\n", - "\\alpha \\\\\n", - "\\beta \\\\\n", - "\\end{vmatrix}\n", - "= \n", - "$\n", - "$\\alpha|0\\rangle + \\beta|1\\rangle = |\\psi\\rangle$\n", - "\n", - "E agora Bob tem a informação que estava com Alice.
" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Bit recebido:**\n", - "1. $|00\\rangle$\n", - "2. $|01\\rangle$\n", - "3. $|10\\rangle$\n", - "4. $|11\\rangle$\n", - "
\n", - "
\n", - "\n", - "**Matriz de reconstrução de Bob:** \n", - "
\n", - "
\n", - "1.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - " 1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "2.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - " 1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "3.\n", - "$\n", - "\\begin{vmatrix}\n", - " 1 & 0 \\\\ \n", - " 0 & -1 \\\\\n", - "\\end{vmatrix}\n", - "$\n", - "
\n", - "4.\n", - "$\n", - "\\begin{vmatrix}\n", - " 0 & 1 \\\\ \n", - "-1 & 0 \\\\\n", - "\\end{vmatrix}\n", - "$\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "Pontos a serem observados:\n", - "\n", - "1. Alice não possui mais o estado $|\\psi\\rangle$.\n", - "2. Os bits clássicos navegam em um canal clássico e é impossível que Bob chegue a informação sem que este bits sejam transmitidos.\n", - "3. $\\alpha$ e $\\beta$ são números complexos arbritarios que satisfazem a equação $|\\alpha|^{2} + |\\beta|^{2} = 1$ podendo ter uma expansão infinito decimal porém toda essa informação. Contudo essa informação é passada na forma de qubit que quando colapsa quando passado para Bob e inutil quando medido.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulação do circuito:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import qiskit as qkit \n", - "import time\n", - "from qiskit import Aer\n", - "from qiskit.tools.visualization import circuit_drawer\n", - "from qiskit.tools.visualization import plot_histogram\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Iniciando os registradores quânticos:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "rq = qkit.QuantumRegister(size=3)\n", - "rc = qkit.ClassicalRegister(size=2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Implementando o Circuito Quântico. O qubit a ser teletransportado se encontra no registra quântico na posição rq[0]." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Inicializando o circuito e criando o estado de Bell $|\\Phi+\\rangle$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "teleport = qkit.QuantumCircuit(rq, rc)\n", - "teleport.h(rq[1])\n", - "teleport.cx(rq[1], rq[2])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Combinando a parte a ser transmitida com a parte emaranhada de Alice" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING: Unable to compile latex. Is `pdflatex` installed? Skipping latex circuit drawing...\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "\n", - "teleport.cx(rq[0], rq[1])\n", - "teleport.h(rq[0])\n", - "teleport.measure(rq[0], rc[0])\n", - "teleport.measure(rq[1], rc[1])\n", - "circuit_drawer(teleport)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Simulando o Circuito em um computador clássico" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">\n", - "Faltam 0 segundos\n", - ">\n", - "Faltam 1 segundos\n", - ">\n", - "Faltam 2 segundos\n", - ">\n", - "Faltam 3 segundos\n", - ">\n", - "Faltam 4 segundos\n", - ">\n", - "Faltam 5 segundos\n", - ">\n", - "Faltam 6 segundos\n", - ">\n", - "Faltam 7 segundos\n", - ">\n", - "Faltam 8 segundos\n", - ">\n", - "Faltam 9 segundos\n", - ">\n", - "Faltam 10 segundos\n", - ">\n", - "Faltam 11 segundos\n", - ">\n", - "Faltam 12 segundos\n", - ">\n", - "Faltam 13 segundos\n", - ">\n", - "Faltam 14 segundos\n", - ">\n", - "Faltam 15 segundos\n", - ">\n", - "Faltam 16 segundos\n", - ">\n", - "Faltam 17 segundos\n", - ">\n", - "Faltam 18 segundos\n", - ">\n", - "Faltam 19 segundos\n", - ">\n", - "Faltam 20 segundos\n", - ">\n", - "Faltam 21 segundos\n", - ">\n", - "Faltam 22 segundos\n", - ">\n", - "Faltam 23 segundos\n", - ">\n", - "Faltam 24 segundos\n", - ">\n", - "Faltam 25 segundos\n", - ">\n", - "Faltam 26 segundos\n", - ">\n", - "Faltam 27 segundos\n", - ">\n", - "Faltam 28 segundos\n", - ">\n", - "Faltam 29 segundos\n", - ">\n", - "Faltam 30 segundos\n", - ">\n", - "Faltam 31 segundos\n", - ">\n", - "Faltam 32 segundos\n", - ">\n", - "Faltam 33 segundos\n", - ">\n", - "Faltam 34 segundos\n", - ">\n", - "Faltam 35 segundos\n", - ">\n", - "Faltam 36 segundos\n", - ">\n", - "Faltam 37 segundos\n", - ">\n", - "Faltam 38 segundos\n", - ">\n", - "Faltam 39 segundos\n", - ">\n", - "Faltam 40 segundos\n", - ">\n", - "Faltam 41 segundos\n", - ">\n", - "Faltam 42 segundos\n", - ">\n", - "Faltam 43 segundos\n", - ">\n", - "Faltam 44 segundos\n", - ">\n", - "Faltam 45 segundos\n", - ">\n", - "Faltam 46 segundos\n", - ">\n", - "Faltam 47 segundos\n", - ">\n", - "Faltam 48 segundos\n", - ">\n", - "Faltam 49 segundos\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "\n", - "shots = 50\n", - "job = qkit.execute(teleport, backend= Aer.get_backend(\"qasm_simulator_py\"), shots=shots)\n", - "k =0 \n", - "wait_time = 1 \n", - "while k < shots:\n", - " print(job.status)\n", - " print(\"Faltam {0} segundos\".format(k))\n", - " k = k + wait_time\n", - " time.sleep(wait_time)\n", - " \n", - "results_sim = job.result()\n", - "outputs_sim = results_sim.get_counts()\n", - "\n", - "plot_histogram(outputs_sim)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Fonte:\n", - "Quantum Computing for Computer Scientists, Noson F. Yanofsky\n", - "\n", - "Rieffel, Eleanor G., and Wolfgang H. Polak. Quantum Computing : A Gentle Introduction, edited by William Gropp, and Ewing Lusk, MIT Press, 2011. ProQuest Ebook Central, https://ebookcentral.proquest.com/lib/ufrpe-ebooks/detail.action?docID=3339229. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 16f1ba3a8ea274dbf768cf7866fd1b2b5c7c529a Mon Sep 17 00:00:00 2001 From: Tiago de Lima <33109618+Tiagoblima@users.noreply.github.com> Date: Fri, 16 Aug 2019 12:19:47 -0300 Subject: [PATCH 46/49] =?UTF-8?q?Revis=C3=A3o=20e=20corre=C3=A7=C3=A3o=20o?= =?UTF-8?q?rtogr=C3=A1fica?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Como solicitado realizamos uma pequena revisão do que havia sido escrito. --- deutsch_jozsa.ipynb | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 5648d23..5dbe9f4 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -5,7 +5,7 @@ "metadata": {}, "source": [ "\n", - "# Problema de Deutch e Deutch-Jozsa\n", + "# Problema de Deutsch e Deutsch-Jozsa\n", "\n", "## Observação dos autores\n", "\n", @@ -14,9 +14,9 @@ "### Cronograma\n", "- Antes de comecarmos\n", "- Paralelismo Quântico\n", - "- Problema de Deutch\n", + "- Problema de Deutsch\n", "- Porta Hadamard para N qubits\n", - "- Problema de Deutch-Jozsa\n" + "- Problema de Deutsch-Jozsa\n" ] }, { @@ -27,8 +27,6 @@ "\n", " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", "\n", - "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", - "\n", "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", "\n", " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", @@ -62,7 +60,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Problema de Deutch\n", + "# Problema de Deutsch\n", "\n", "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", "\n", @@ -220,9 +218,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Problema de Deutch Jozsa\n", + "## Problema de Deutsch Jozsa\n", "\n", - "O algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Para o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "O algoritmo de Deutsch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Para o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", "\n", "\n", "Porém, antes de seguirmos com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancilla nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim, a evolução do sistema ficaria da seguinte forma:\n", @@ -527,21 +525,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 2", "language": "python", - "name": "python3" + "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.3" + "pygments_lexer": "ipython2", + "version": "2.7.14" } }, "nbformat": 4, From 935020e128537d21a2cba68c1790a17e40ab0d79 Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Sat, 17 Aug 2019 18:45:34 -0300 Subject: [PATCH 47/49] deleting --- .../deutsch_jozsa-checkpoint.ipynb | 408 ---------- .ipynb_checkpoints/grover-checkpoint.ipynb | 749 ------------------ conceitos_basicos.ipynb | 0 deutsch_jozsa.ipynb | 547 ------------- grover.ipynb | 749 ------------------ 5 files changed, 2453 deletions(-) delete mode 100644 .ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb delete mode 100755 .ipynb_checkpoints/grover-checkpoint.ipynb delete mode 100644 conceitos_basicos.ipynb delete mode 100644 deutsch_jozsa.ipynb delete mode 100644 grover.ipynb diff --git a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb deleted file mode 100644 index 24c9eeb..0000000 --- a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb +++ /dev/null @@ -1,408 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# Problema de Deutch e Deutch-Jozsa\n", - "\n", - "## Observação dos autores\n", - "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", - "\n", - "### Cronograma\n", - "- Antes de comecarmos\n", - "- Paralelismo Quântico\n", - "- Problema de Deutch\n", - "- Porta Hadamard para N qubits\n", - "- Problema de Deutch-Jozsa\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Antes de começarmos\n", - "\n", - " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", - "\n", - "Porém você deve estar se perguntando **\"Paralelismo quântico?\" \"O que é isso?\"**\n", - "\n", - "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", - "\n", - " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", - "\n", - " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", - "\n", - "\n", - "## Avaliando uma função\n", - "\n", - " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", - "\n", - "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", - "\n", - " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", - " \n", - " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", - "\n", - "$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$\n", - " \n", - " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Problema de Deutch\n", - "\n", - "Agora que temos um noção do comportamento de $U_f$ e como podemos obte-lo podemos falar do problema de Deutsch.\n", - "\n", - "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", - "\n", - "### Conceitos Iniciais:\n", - "\n", - "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", - "\n", - "### Como o algoritmo funciona:\n", - "\n", - "Agora que sabemos o que é uma função constante ou balanceada, podemos então podemos seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é uma saída e metade a outra. Nesse caso, isso se resumiria a se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", - "\n", - "Para isso iremos utilizar o conceito aprensetado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", - "\n", - "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Antes de seguirmos para nosso exemplo:**\n", - "\n", - "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", - "\n", - "\n", - "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", - "\n", - "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### Exemplo:\n", - "\n", - "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. ]\n", - "\n", - "Suponha que temos uma função $f$ em que $f(0) = 1$ e $f(1) = 1$ que claramente esse é uma função constante.\n", - "\n", - "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", - "\n", - "#### 1º Passo:\n", - "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n", - "\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$\n", - "\n", - "#### 2º Passo:\n", - "\n", - "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", - "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle$\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle|1\\rangle$\n", - "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle$\n", - "\n", - "$|\\psi_3\\rangle = \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "\n", - "#### 3º Passo:\n", - "\n", - "Aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador C-Not\n", - "\n", - "\n", - "$|\\psi_4\\rangle = U_f\\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "$|\\psi_4\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle - |10\\rangle + |11\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "#### 4º Passo:\n", - "\n", - "Agora basta aplicarmos o Hadarmad ao estado atual \n", - "\n", - "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Esses estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", - "\n", - "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", - "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", - "\n", - "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", - "\n", - "$$\\begin{eqnarray}\n", - "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", - "\\end{eqnarray}$$\n", - "\n", - "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", - "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", - "\n", - "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", - "\n", - "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", - "\n", - "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", - "\n", - "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", - "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", - "\n", - "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", - "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Porta Hadamard para N qubits\n", - "\n", - "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", - "\n", - "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", - "\n", - "\n", - "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", - "\n", - "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", - "\n", - "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", - "\n", - "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", - "\n", - "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", - "\n", - "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", - "\n", - "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", - "\n", - "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problema de Deutch Jozsa\n", - "\n", - "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", - "\n", - "\n", - "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", - "\n", - "Desenvolvendo o último termo da igaldade ficamos com:\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo temos que se $f(x) = 0$:\n", - "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "E se $f(x) = 1$ temos:\n", - "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Portanto, podemos concluir que:\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", - "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", - "\n", - "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", - "\n", - "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", - "\n", - "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", - "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", - "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exemplo prático\n", - "\n", - "Agora nós vamos fazer um exemplo prático do algoritmo considerando a seguinte função, onde:\n", - "\n", - "f(0) = 0; f(1)=1;\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Incializando os nossos qubits\n", - "\n", - "Inicializaremos o qubit de entrada da função e o auxiliar (ancilla):\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, Aer, execute\n", - "from qiskit.tools.visualization import plot_histogram\n", - "\n", - "q = QuantumRegister(2)\n", - "c = ClassicalRegister(2)\n", - "qc = QuantumCircuit(q, c)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Depois disso iniciaremos a construção do circuito com um Hadamard no primeiro\n", - "e segundo qubits e depois o portão c-not que é uma representação para a nossa função." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.h(q[0])\n", - "qc.h(q[1])\n", - "\n", - "qc.cx(q[0], q[1])\n", - "\n", - "qc.h(q[0])\n", - "\n", - "qc.measure(q[0], c[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "backend = Aer.get_backend('qasm_simulator')\n", - "job_sim = execute(qc, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(qc)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/.ipynb_checkpoints/grover-checkpoint.ipynb b/.ipynb_checkpoints/grover-checkpoint.ipynb deleted file mode 100755 index 25abc74..0000000 --- a/.ipynb_checkpoints/grover-checkpoint.ipynb +++ /dev/null @@ -1,749 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "# Importing standard Qiskit libraries and configuring account\n", - "import numpy as np\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", - "from qiskit.compiler import transpile, assemble\n", - "from qiskit.tools.jupyter import *\n", - "from qiskit.visualization import *\n", - "# Loading your IBM Q account(s)\n", - "#provider = IBMQ.load_account()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Algoritmo de Grover\n", - "- Introdução\n", - "- Preparação dos estados\n", - "- Aplicando Oracle\n", - "- Inversão sobre a média\n", - "- Circuito Quântico\n", - "- Exercícios" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Observações dos autores\n", - "\n", - "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch-Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", - " \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introdução \n", - "\n", - " Dado um conjunto desestruturado de elementos de tamanho $N$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $N$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em aproximadamente $\\sigma(\\sqrt{N/M})$ iterações, onde M é quantidade de soluções buscadas. \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Preparação dos estados\n", - " Considere o operador unitário $U_f$ que implementa a função (ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", - " $$\n", - " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", - " $$\n", - " \n", - " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca, o segundo registrador quântico trata-se do qubit auxiliar (ou ancilla).\n", - " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de fase_.\n", - " \n", - " \n", - " Considere uma entrada qualquer $|x\\rangle$. O estado inicial do sistema se encontraria como a seguir:\n", - " $$\n", - " |x\\rangle\\left( \\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\right)\n", - " $$\n", - " \n", - " Distribuindo e aplicando $U_f$\n", - " \n", - " $$\n", - " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = U_f\\left[ \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) \\right]\n", - " $$\n", - " $$\n", - " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x) \\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right) \n", - " $$\n", - " \n", - " Sabendo que $\\oplus$ o qual trata-se de uma soma módulo 2, opera como um $XOR$ nos estados dos qubits. É possivel verificar que a operação $|1 \\oplus f(x)\\rangle$ trata-se da negação de $f(x)$. \n", - " Ou seja:\n", - " $$\n", - " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " Levando este resultado em consideração, então a fase do sistema (ou sinal da equação) é determinada pelo resultado da função, matematicamente falando:\n", - " $$\n", - " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancilla enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", - " \n", - " Para um sistema cuja entrada tem três qubits, o estado se encontraria como a seguir:\n", - " $$\n", - " \\frac{1}{2}\\left(|00\\rangle + |01\\rangle + |10\\rangle + |11\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$ \n", - " Utilizando a API _Qiskit_ disponibilizada pela IBM a preparação do estado ficaria da seguinte forma:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐     \n",
-       "q_0: |0>┤ H ├─────\n",
-       "        ├───┤     \n",
-       "q_1: |0>┤ H ├─────\n",
-       "        ├───┤┌───┐\n",
-       "q_2: |0>┤ X ├┤ H ├\n",
-       "        └───┘└───┘\n",
-       " c_0: 0 ══════════\n",
-       "                  \n",
-       " c_1: 0 ══════════\n",
-       "                  
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qub = QuantumRegister(3,'q')\n", - "cb = ClassicalRegister(2,'c')\n", - "qc = QuantumCircuit(qub,cb)\n", - "qc.h(qub[0])\n", - "qc.h(qub[1])\n", - "#Preparando a ancila\n", - "qc.x(qub[2])\n", - "qc.h(qub[2])\n", - "#Drawing circuits\n", - "qc.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Aplicando o Oracle\n", - " Agora seja $f$ uma função que \"busca\" pela cadeia $11$, então ao aplicar a inversão de fase o estado resultante ficaria da seguinte forma:\n", - " \n", - " $$\n", - " \\frac{1}{2}\\left(|00\\rangle + |01\\rangle + |10\\rangle - |11\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Explicando de forma simplificada, é como se o estado $11$ estivesse sendo marcado para que a busca pudesse ser efetuada.\n", - " Um operador que já implementa esta função é o operador $Toffoli$ o qual já se encontra implementado na API do _Qiskit_." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          \n",
-       "q_0: |0>┤ H ├───────■──\n",
-       "        ├───┤       │  \n",
-       "q_1: |0>┤ H ├───────■──\n",
-       "        ├───┤┌───┐┌─┴─┐\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├\n",
-       "        └───┘└───┘└───┘\n",
-       " c_0: 0 ═══════════════\n",
-       "                       \n",
-       " c_1: 0 ═══════════════\n",
-       "                       
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.ccx(qub[0], qub[1], qub[2])\n", - "qc.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " Para fins de demonstração efetuaremos uma medição nos qubits para verificar as probabilidades do sistema somente com a inversão de fase." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤M├───\n",
-       "        ├───┤       │  └╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
-       "        └───┘└───┘└───┘ ║  ║ \n",
-       " c_0: 0 ════════════════╩══╬═\n",
-       "                           ║ \n",
-       " c_1: 0 ═══════════════════╩═\n",
-       "                             
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.measure(qub[0],cb[0])\n", - "qc.measure(qub[1],cb[1])\n", - "qc.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", - " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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pN7y999/P0cffTQAb775Jt27d+fss8/m8MMP53vf+x7V1dUA3HzzzZx22ml87GMf44EHHuBrX/ta057IVnLSNLOS1VRNgQCjR49m8uTJTJ48mX333bdo59TSRcRm6yTlLTt+/HimT5/OyJEjAdiwYQNTp07l2muv5a9//Svz589n3LhxANx222088MADvPrqq5xxxhl897vfbbqT2AZOmmZWspqqKdC2Xp8+fXj77bdrlxcvXpy3KfXvf/87N954I+PGjaNTp061++63337079+f9u3bc8IJJ/Dyyy+zbNkyXnnlFYYMGQLA8OHDee6554pzQgVy0jSzktVUTYEA119/PYceeihXXXUVH374YdOdRCtzwAEHMHfuXBYsWEBVVRUPPfQQxx577CZlXn75ZS677DLGjRtHz549N9n3vffeY9myZQBMnjyZQYMGseOOO7Jq1SrmzJkDwN/+9jc++tGPFu+kCtC+uQMwM6vP1jQFPvroo8C/mwKffPJJ+vbty/nnn8+4ceM466yzuPrqq+nVqxdVVVV8/etf5+abb+aKK65o0nNpLdq3b88NN9zAqaeeSnV1NWeeeSYVFRWMGTOGyspKjjvuOEaNGsWaNWs477zzAOjbty/jxo2jrKyMa6+9llNOOYWIYP/99+fss8+mffv23HTTTZxzzjm0a9eOHXfckVtuuaWZzzQ/J00zK1mFNgU++uijeZsCAU444QSef/55gNpjdOrUiTPOOIOf/exnTXwmrcuwYcMYNmzYJuuuuuqq2tcPP/xwvfseeeSRTJkyZbP1J554IieeeGLjBdlE3DxrZiWrKZoCAZYuXQokNdnHHnuMioqKIp2RtXSuaZpZyWqKpkCAL3/5yyxbtoyIYN999y3ZB+mt9CjfPYO2orKyMiZNmtTcYZiZWQkpLy+fFhFD8m1z86yZmVlGTppmZmYZOWmamZll5KRpZmaWkZOmmZlZRk6aZmZmGTlpmpmZZeSkaWZmlpGTppmZWUYeRq+ZTJw4kauuuorq6mrOOussLr300k22jx07lvvuu4/27dvTo0cPbrnlFvr161e7fdWqVRx88MGccMIJ3HDDDZvse8YZZzB//nyeeeaZopyLmbVcV9yzU3OH0GhuOGdlk7+Ha5rNYFtnowcYM2YMhxxyyGbHfuSRR+jatWuTxm9m1la5ptkMcmejB2pno997771ryxx22GG1r4cMGcL48eNrl1988UXeffddjjrqKF588cXa9f/617+49dZb+elPf8r555/f9CdiViDXaqylc02zGWzLbPQbN27k6quvZvTo0ZuVGzNmDJdccgldunRp/KDNzMxJszlszWz0I0eOBOCuu+5i2LBh9O3bd5NyM2bMYN68eS1iElczs5bKzbPNYFtmo//HP/7B1KlTueuuu1izZg1VVVV07dqVfv368dJLLzF48GA2bNjAsmXLOOmkk3jkkUeKdl5mZq2dk2YzyJ2Nvnfv3jz00EPccccdm5SpmY1+woQJm8xGn1tu3LhxvPjii7WdhGruYy5cuJDPfe5zTphmZo3MSbMZbMts9GZm1nyU7/5aW1FZWRmTJk1q7jDM2gz3ni09viabKy8vnxYRQ/Jtc0cgMzOzjJw0zczMMnLSNDMzy8hJ08zMLCMnTTMzs4ycNM3MzDJy0jQzM8vISdPMzCwjJ00zM7OMnDTNUhMnTuSTn/wkBx54IDfddNNm28eOHctBBx3EoYceyimnnMJbb70FJDPMHHPMMRx88MEceuihPPTQQ5vte+WVV9KvX78mPwcza1pFT5qSLpY0T9I6SdMkHdZA2eGSnpD0rqTVkp6VdHID5U+XFJIebZrorbWqrq7miiuuYPz48UydOpUHH3yQ1157bZMy++23H5MmTWLKlCmcfPLJtQPld+7cmdtuu42pU6cyYcIEvvOd7/D+++/X7jd9+vRNls2s5SrqgO2STgNuBi4GpqT/Pi5pn4hYmGeXw4FJwHeBFcCZwMOSjoiIp+ocewDwI+CpzY7SxDx2Y8s3bdo09thjD/r37w/A8OHDefzxx9l7771ryxx22L//vhsyZAjjx48HYODAgbXre/fuTY8ePVi2bBndu3enurqaUaNGcccdd/DYY48V52TMrMkUu6Z5GXB3RNwZEbMiYiSwBLgoX+GI+FpE/HdEPBcRcyJiNDANOCW3nKQOwG+A7wBzm/YUrDVasmQJu+66a+1ynz59WLJkSb3l77//fo4++ujN1k+bNo2qqir22GMPAO68806OPfbYvPOlmlnLU7SapqSOwIHAj+tsegI4pIBDdQPqVoeuB+ZHxD2Sjtz6KK2tyjfbj6S8ZcePH8/06dN59NFN7wIsXbqUiy66iLFjx9KuXTuWLFnC73//e89rataKFLN5tgdQBrxTZ/07wOZ/such6RKgL3BfzrpjgNOA/TMe4wLgAkia0l544QUgqVl06dKFOXPmANC9e3cGDBjA9OnTASgrK2Pw4MHMnj2bNWvWAFBRUcGKFSuA1tM8W/N5DBgwgKqqKhYtWgRAr169KC8vZ9asWQB07dqVQYMG8dJLL1FdXQ1AZWUlc+fOrb1/N3DgQNauXcvixYuB5PPeYYcdmD17NgDdunVjr732Yvr06UQEkqisrOSNN95g9erVAAwaNIhVq1bV1vq25Tq9807yX69v37507NiRuXOTRomddtqJXXbZhVmzZvHCCy/QoUMHFi9eTLt27Wo/j3322Yd3332XP/3pT4wdO5bx48ezZs0aXn31VQA6derExRdfzOmnn05ZWRmvvvoqb7/9Nm+88Qb77rsvAGvXrmXw4MH86le/AqB///5EBAsWLACgZ8+e9OzZk5kzZwLJvdKKigpmzJjB+vXrARg8eDALFy5k5cqVLfI6tSY1/zda+nVqTd9fy5cvb5Tfp4YUbT5NSX2At4GhufcjJY0CTo+IvevdOSn3WZJk+bmI+EO6rgfwMnBGRPw9XXc30CMiTtxSTI01n6bvabZ8GzZs4BOf+AS/+93v6N27N0cddRR33HEHFRUVtWVefvllzj33XCZMmMCee+5Zu76qqooRI0bw6U9/mosuynunAYB+/frV9rhtq/y7Unp8TTbX0HyaxaxpLgOqgbo3dz7C5rXPTeQkzLNrEmbq40BvYGJOU1q7dJ8NwMciYva2h26tXfv27bnhhhs49dRTqa6u5swzz6SiooIxY8ZQWVnJcccdx6hRo1izZg3nnXcekNRYx40bx+9+9zueeeYZVqxYwW9+8xsgeTylpoZpZq1H0ZJmRFRJmgYMAybkbBoGPFjffpJGAPcA50TEb+ts/gdQ95vpOpL2hkuAedsat7Udw4YNY9iwYZusu+qqq2pfP/zww3n3GzFiBCNGjNji8dt6LdOsNSjqIyfAT4D7JD0HPA1cCPQBbgeQdC9ARJydLn+OpIZ5OTBZUk0ttSoiVkTEGuCV3DeQ9B7QPiI2WW9mZratipo0I+IBSTuTPHfZmyThHR8RC9Iiu9XZ5UKSGG9Kf2o8CRzRtNGamZltqtg1TSLiVuDWerYd0dByxuOfuzVxmZmZbYnHnjUzM8vISdPMzCwjJ00zM7OMnDTNzMwyctI0MzPLyEnTzMwsIydNMzOzjIr+nKZZMXgQajNrCq5pmpmZZeSkaWZmlpGTppmZWUZOmmZmZhk5aZqZmWXkpGlmZpaRk6aZmVlGTppmZmYZOWmamZll5KRpZmaWkZOmmZlZRk6aZmZmGTlpmpmZZVRQ0pQ0QtIxOcvfk7RI0p8l9W788MzMzEpHoTXNa2peSDoAuAr4H6ADcGPjhWVmZlZ6Cp1Pc3dgdvr6M8DvIuIGSU8Af27UyMzMzEpMoTXNdUC39PVRwMT09fs5683MzFqlQmuaTwE3SpoCDAFOTdd/FHirMQMzMzMrNYXWNL8CVJEkywsjYnG6/jjcPGtmZq1cQTXNiFgEnJRn/aWNFpGZmVmJKvg5TUnbSTpV0pWSdkzX7SmpvPHDMzMzKx0F1TQlDSTp/LM9sCMwAXgPuChd/mJjB2hmZlYqCq1p3gQ8AfQCPshZ/wfgyMYKyszMrBQV2nv2EOCgiKiWlLt+IdCn0aIyMzMrQVsz9myHPOt2I3lW08zMrNUqNGk+AVyWsxySdgBGA481WlRmZmYlqNDm2cuAv0maDWwHPAAMBN4BRjRybGZmZiWl0Oc0F0vaHzgdOICkpnoH8OuI+KDBnc3MzFq4QmuapMnxl+mPmZlZm7HFpClpOPBIRKxPX9crIh5qtMjMzMxKTJaa5m+BXYB/pq/rE0BZYwRlZmZWiraYNCOiXb7XZmZmbU1BSVDSUEmbJVpJZZKGNl5YZmZmpafQmuPfgHwDs++YbjMzM2u1Ck2aIrl3WdfOwJptD8fMzKx0ZXrkRNIf0pcB3C/pw5zNZcDHgWcaOTYzM7OSkvU5zeXpvwJWsukMJ1XAFODORozLzMys5GRKmhFxHoCk+cCPI8JNsWZm1uYUOoze6KYKxMzMrNRlGRHoZeDwiFgpaQb5OwIBEBH7NWZwZmZmpSRLTfNBoKbjT0MjApmZmbVqWUYEGp3vtZmZWVvjYfHMzMwyynJPs8H7mLl8T9PMzFqzrLOcmJmZtXkF3dM0MzNry3xP08zMLCM/p2lmZpaRn9M0MzPLqOjPaUq6GPgm0Bt4Fbg0Ip6qp2xv4EbgAGAv4L6IODdPuR2A64BTSaYpewu4KiLGb2u8ZmZmNQoae7aGpD2BinRxVkS8mXG/04CbgYtJZka5GHhc0j4RsTDPLp2AZcB/AxfUc8wOwBMks6+MABYBffl37djMzKxRFJQ0Je0M3AWcDGz892o9CpwfEcvr3TlxGXB3RNRMIzZS0rHARcC36xaOiPnAV9M3ObWeY54HfAQYGhFV6br5mU7IzMysAIX2nv0FMBA4DNgu/RkK7MEW5tOU1BE4kKRWmOsJ4JAC48h1CvA0cIukpZJmSromrYGamZk1mkKbZz8NHBURU3PWPS3py8DELezbAygD3qmz/h3g6ALjyDUA+A9gHHAC0B8YC2wPXF63sKQLSJt6e/fuzQsvvABAnz596NKlC3PmzAGge/fuDBgwgOnTpwNQVlbG4MGDmT17NmvWJNOJVlRUsGLFCmCnbQi/tNR8HgMGDKCqqopFixYB0KtXL8rLy5k1axYAXbt2ZdCgQbz00ktUV1cDUFlZydy5c3n//fcBGDhwIGvXrmXx4sVA8nnvsMMOzJ49G4Bu3bqx1157MX36dCICSVRWVvLGG2+wevVqAAYNGsSqVatYsmQJkP06tSYzZsxg/fr1AAwePJiFCxeycuVKoOVdp9ak5nelc+fOVFRUtNjr1Jq+v5YvX86CBQsA6NmzJz179mTmzJlAYdepIYrINEJeUlhaAJwUES/XWT8YeCQidmtg3z7A2yTNqE/lrB8FnB4Re2/hvR8FltXtCCTpdZIa7x4RUZ2uuwD4KbB9NHCClZWVMWnSpIbeNpMr7mk9/+luOGdlc4fQKHxNSpOvS+nxNdlceXn5tIgYkm9boc2z1wI3Sdq1ZkX6+sZ0W0OWAdXALnXWf4TNa5+FWAK8XpMwU7OALiS1WzMzs0axNQO27wHMl/R2urwrsI4k+f2ivuNERJWkacAwYELOpmEkz4JuraeBMyS1i4iazkkfBdaSJGozM7NGUewB238C3CfpOZJkdyHQB7gdQNK9ABFxds0OkvZPX+4AbEyXqyJiZrr+NuArwM2SfkZyT3M0cGtDTbNmZmaFKuqA7RHxQPrYyndJBjd4BTg+IhakRfLdE51eZ/kkYAFJciQi3pJ0DElCfhFYCvySZLADMzOzRrNVgxtsi4i4Fbi1nm1H5FmnDMf8P7btsRUzM7MtKqgjkKSOkkZLel3SOknVuT9NFaSZmVkpKLT37PeBc0h6y24kGUN2LLCcZEg8MzOzVqvQpDkCuDAifk7y+MjvI+KrwCiSXrBmZmatVqFJsxdQ02v1X8CO6es/Acc0VlBmZmalqNCkuZDkERGAOSTD6gEcDHzQWEGZmZmVokKT5sPAUenrm4HRkuYBd9PAwAZmZmatQUGPnETEt3Ne/1bSIpJHPV6PiEcbOzgzM7NSsk3PaabPR/5fI8ViZmZW0gptnkXSAZLulfR8+nOfpAOaIjgzM7NSUujgBmcC/yAZAu+P6U8v4DlJn2/88MzMzEpHoc2z1wNXR8SY3JWSvk0y1uv9jRWYmZlZqSm0ebYnMD7P+gkkU4OZmZm1WoUmzb8BR+RZfwTw5LYGY2ZmVsqyTEI9PGfxceAHkobw716zBwHDgWsaPTozM7MSsrWTUF+Q/uS6hXqm/DIzM2sNskxCXfBjKWZmZq2RE6KZmVlGWzO4wQmSJktaJuldSU9KOr4pgjMzMyslhQ5u8EWSQdvfBK4EvgXMAx6WdH7jh2dmZlY6Ch3c4Ergsoj4Wc66uyRNI0mgv2y0yMzMzEpMoc2zu5FMOF3X48Du2x6OmZlZ6dqaSaiH5Vl/DLBg28MxMzMrXYU2z/4YuCWd1eQZIIBDgbOAkY0cm5mZWUkpdBLqn0v6J/ANklGAAGYBIyLi940dnJmZWSnJnDQltSdphp0cEQ83XUhmZmalKfM9zYjYADwEdGu6cMzMzEpXoR2BXgIGNkUgZmZmpa7QpHkNcKOkUyT1k1Se+9ME8ZmZmZWMQnvPPpb++xBJz9kaSpfLGiMoMzOzUlRo0jyySaIwMzNrATIlTUldgB8BpwAdgInAVyNiWRPGZmZmVlKy3tMcDZxL0jz7G5JRgW5ropjMzMxKUtbm2eHAFyLifwEk/Rp4WlJZRFQ3WXRmZmYlJGtNsx/wVM1CRDwHbAD6NEVQZmZmpShr0iwDquqs20DhHYnMzMxarKxJT8D9kj7MWbcdcKektTUrIuLkxgzOzMyslGRNmvfkWXd/YwZiZmZW6jIlzYg4r6kDMTMzK3WFDqNnZmbWZjlpmpmZZeSkaWZmlpGTppmZWUZOmmZmZhk5aZqZmWXkpGlmZpaRk6aZmVlGTppmZmYZOWmamZll5KRpZmaWkZOmmZlZRk6aZmZmGTlpmpmZZeSkaWZmlpGTppmZWUZOmmZmZhk5aZqZmWXkpGlmZpZR0ZOmpIslzZO0TtI0SYdtofzhabl1kuZKurDO9jJJ38855jxJ10lq37RnYmZmbU1Rk6ak04CbgTFAJfAM8Lik3eopvwfwx7RcJfAD4BZJn80pdiVwCfBVYG/ga+nyt5voNMzMrI0qdm3sMuDuiLgzXR4p6VjgIvInuQuBxRExMl2eJelTwOXAg+m6Q4BHIuKRdHm+pD8An2qSMzAzszaraDVNSR2BA4En6mx6giTx5XNwnvJ/BoZI6pAuTwGOlLR3+j77AP9BUkM1MzNrNMWsafYAyoB36qx/Bzi6nn12ASbmKd8+Pd4S4IdAN2CmpOp02/URcWu+A0q6ALgAoHfv3rzwwgsA9OnThy5dujBnzhwAunfvzoABA5g+fToAZWVlDB48mNmzZ7NmzRoAKioqWLFiBbBTpg+gJaj5PHwNWGwAAAr2SURBVAYMGEBVVRWLFi0CoFevXpSXlzNr1iwAunbtyqBBg3jppZeorq4GoLKykrlz5/L+++8DMHDgQNauXcvixYuB5PPeYYcdmD17NgDdunVjr732Yvr06UQEkqisrOSNN95g9erVAAwaNIhVq1axZMkSIPt1ak1mzJjB+vXrARg8eDALFy5k5cqVQMu7Tq1Jze9K586dqaioaLHXqTV9fy1fvpwFCxYA0LNnT3r27MnMmTOBwq5TQxQRTXgKOW8k9QHeBoZGxFM560cBp0fE3nn2eR24LyK+n7PucODvQO+IWCrpc8CPgG8CrwL7k9w3/WZE3NVQTJWVlTFp0qRtPrcr7mk9/+luOGdlc4fQKHxNSpOvS+nxNdlceXn5tIgYkm9bMWuay4Bqktpjro+wee2zxtJ6ym8AlqfLPwJ+HBH/my7PkLQ7yT3SBpOmmZlZIYp2TzMiqoBpwLA6m4aR9I7NZyqbN90OA56PiPXpcheSZJyrGj+DamZmjazYvWd/Atwn6TngaZLesX2A2wEk3QsQEWen5W8HviLpJuDnwP8DzgVOzznmI8C3JM0jaZ6tJOmle29Tn4yZmbUtRU2aEfGApJ2B7wK9gVeA4yNiQVpktzrl50k6HvgpyWMpi4GvRsSDOcVGAt8HbiVpul0C3Alc25TnYmZmbU/RR81Je7Xm7dkaEUfkWfckcEADx1sNXJr+mJmZNRnf9zMzM8vISdPMzCwjJ00zM7OMnDTNzMwyctI0MzPLyEnTzMwsIydNMzOzjJw0zczMMnLSNDMzy8hJ08zMLCMnTTMzs4ycNM3MzDJy0jQzM8vISdPMzCwjJ00zM7OMnDTNzMwyctI0MzPLyEnTzMwsIydNMzOzjJw0zczMMnLSNDMzy8hJ08zMLCMnTTMzs4ycNM3MzDJy0jQzM8vISdPMzCwjJ00zM7OMnDTNzMwyctI0MzPLyEnTzMwsIydNMzOzjJw0zczMMnLSNDMzy8hJ08zMLCMnTTMzs4ycNM3MzDJy0jQzM8vISdPMzCwjJ00zM7OMnDTNzMwyctI0MzPLyEnTzMwsIydNMzOzjJw0zczMMnLSNDMzy8hJ08zMLCMnTTMzs4ycNM3MzDJy0jQzM8vISdPMzCwjJ00zM7OMnDTNzMwyctI0MzPLyEnTzMwsIydNMzOzjJw0zczMMip60pR0saR5ktZJmibpsC2UPzwtt07SXEkXbusxzczMtkZRk6ak04CbgTFAJfAM8Lik3eopvwfwx7RcJfAD4BZJn93aY5qZmW2tYtc0LwPujog7I2JWRIwElgAX1VP+QmBxRIxMy98J3ANcvg3HNDMz2ypFS5qSOgIHAk/U2fQEcEg9ux2cp/yfgSGSOmzlMc3MzLZK+yK+Vw+gDHinzvp3gKPr2WcXYGKe8u3T46nQY0q6ALggXfxXeXn57CzBl4AewLKmfpNffL2p36HVafLr4mtSMP+ulKaW9Luye30bipk0a0SdZeVZt6XyNevVQJm8x4yIO4A7thxmaZH0fEQMae44bFO+LqXH16Q0tZbrUsykuQyoJqk95voIm9cUayytp/wGYDlJciz0mGZmZlulaPc0I6IKmAYMq7NpGEmP13ymsnkz6zDg+YhYv5XHNDMz2yrFbp79CXCfpOeAp0l6x/YBbgeQdC9ARJydlr8d+Iqkm4CfA/8POBc4PesxW5EW16TcRvi6lB5fk9LUKq6LIhq6ndgEbyhdDFwB9AZeAb4eEZPTbX8HiIgjcsofDvwU+BiwGPhhRNye9ZhmZmaNpehJ08zMrKXy2LNmZmYZOWmamZll5KRpZmaWkZOmmbUakpT7r1ljc0egEiapLzCQZBCHjcDsiFjavFGZtRw1yTP8RWeNxEmzREm6CDgfGAysAeYAi0gGfPh9RMyW1C4iNjZjmG2KpM4R8UFzx2Gbk9QO+E+gJ9AFeBt4MiL+2ayBWavjpFmCJO1MkiRvBG4j+SI4GjgS2JvkC+HSiJgpSf4ruulJ2gl4CXgMuB94puZzz70GkvYmmc5uVbMF28ZI6gbcRfL7sZHkj8sAPgCeBO6PiNf8u1I8kjoAewALIuLD5o6nMfmeZmk6A3g9Iq6LiOUR8VpE/CwiPgt8GegMPCqph78EiubzQC+SqegmA3MkXStpUE7C7Af8hmQ2ByuerwKDgOMjohdwJnAT8CrwaeAGST39u1JUlwDTgdslnSRpF0lluQUk7SDpuDTBthhOmqWpCugm6eMAkjqlc4cSEVNIvhTWAcc0X4htzn7Ar4ATgUpgPMlwjjMl/V865dzngb0iYm7zhdkmHQvcExH/AEj/yLyf5Iv7G0AFcF8zxtcWnQY8R9In43ckt5V+JOlQSd3TMmcAoyJifTPFuFWcNEvTb0mamS6V1C0iPoyIqvS+DRGxEHgP6NucQbYVkjoBM4G3IuKfEfFyRHwbGEJSk5kJXANcD/yw2QJtgyS1Jxk687OSeqbryiSVRUR1OpzmhUBfSYObM9a2Ir0O64E7I+Iwkrkp7yL5g3MyMEnSlcClwLPNFuhW8j3NEpPTVf4/gZuBcpJaza0kzR19gaEk9zr3jYj5zRBmm5Mmzp0iYmnazBS5nbAkHQFMAnaLiEXNFGabJOkg4Nckf2z+JCLeqbO9HzALGBQRbzdDiG2KpN7A54CZEfHnOtsqgS+m23cC+rW0a+KkWaIk7QjsBhwCfIZkhhdI5hhtB9wbEdc0T3RtS00HEkkDgDW5X8o5274HnBsRA5ov0rYnbX1pB5wHjCGZuem3wAPAWyTN6icBFRHxieaKs62R1JnkD8t1uc/M5tz/v57kHnRlc8W4tZw0S4ikjwBnkdyHWUbS++894CmSZowOwJ7An4E33LGh6eVck8uAf5JMgL4EmAA8FBFr0i+FL5H0mn202YJt49I/NM8luVe2P7Aa+JDk3toPIqLFNQW2ZPX1VpbUBXgB+FVEtLjbGU6aJUTS3SRToD0CrCBpmt0X+CjJF/Z3/YtfXPVck0qSR38WAT+KiCeaLcA2TNIOwOrcL+a05rkdsD3wcZKWAf/OFEm+a5KnzHYkHYV+ExFVRQuukThploi0trKapMlics663YCDgC8AA4AREfFCswXahjRwTfoBnyKpXe4OnO5rUnySfk5Si3yO5HnAzZ6NlbRTRKz0M5rFkfGa7BgR7xU9uEbi3rOlYx9gHsnjJkDS/h8RCyLiAZL7Mu8B/9VM8bVF9V2ThRExgaQ34Gp8TYpO0ukkf7TcCPye5HGG4ZIGpvfTkLQ98CtJ+zphNr16rslnJO2Zc006A/fUPE7XErmmWSLS/0yPkgwBdjbwZt0h8iSNBL4QEfs3Q4htjq9J6ZJ0J1AN3AAMB84hud8/G/gj8FeSAQ9ujoiOzRVnW9JWrolrmiUiHdP0OySj/dwLnC2pn6SuUHvz/HCSZ9KsCHxNSlP6bOY84L2ImBsRP46IfYFPkAybdw7JY1q34EENiqItXRPXNEtM2mxxNXAyyUDtU4F3ScaeXQJ8MSJmNF+EbY+vSelJxwLulY4p2xFYX6dD0GkkQxoeEBEvNlecbUlbuSZOmiUqfdThBOAUkiHzXgEmRMRrzRpYG+ZrUtrSnrOKiGpJXyJpBuzS3HG1Za3xmjhptgDyFGAlx9ektEm6DCiLiB81dyyWaC3XxEnTzFqddOaMav9hUzpayzVx0jQzM8vIvWfNzMwyctI0MzPLyEnTzMwsIydNMzOzjJw0zczMMnLSNDMzy+j/A9E0dq7uBUE4AAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Select the QasmSimulator from the Aer provider\n", - "simulator = Aer.get_backend('qasm_simulator')\n", - "\n", - "# Execute and get counts\n", - "result = execute(qc, simulator).result()\n", - "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='O indíce procurado')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inversão sobre a média\n", - "\n", - " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", - " \n", - " Agora considere que ao invés de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", - " \n", - " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", - " $$\\left[\\begin{array}{ccccc}\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\end{array}\\right]\n", - " \\left[\\begin{array}{c}\n", - " 4 \\\\\n", - " 5 \\\\\n", - " 10\\\\\n", - " 3 \\\\\n", - " 3 \\\\\n", - " \\end{array}\\right] \n", - " = \n", - " \\left[\\begin{array}{c}\n", - " 5 \\\\\n", - " 5 \\\\\n", - " 5\\\\\n", - " 5 \\\\\n", - " 5 \\\\\n", - " \\end{array}\\right]$$\n", - " \n", - " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", - " \n", - " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", - " $$\n", - " \\bar{V} = -V + 2AV \n", - " $$\n", - " Evidenciando o vetor $V$ obtemos: $(-I + 2A)V$. Desse modo, o operador de inversão sobre a média é obtido a partir da operação matricial: \n", - " $$\n", - " -I + 2A\n", - " $$\n", - " \n", - " ### Implementando inversão sobre a média\n", - " \n", - " Sob a perspectiva de computação quântica este operador pode ser obtido a partir da seguinte fórmula: \n", - " \n", - " $$\n", - " H^{\\otimes n}\\left(2|0\\rangle\\langle0| - I \\right)H^{\\otimes n}\n", - " $$\n", - " \n", - " Considerando a entrada do sistema $|\\psi\\rangle$, a qual será efetuada a busca, como de uma superposição de todos os estados possíveis. Ou seja : $H^{\\otimes n} | 0 \\rangle^{\\otimes n} = |\\psi\\rangle$.\n", - " E Considerando tanto $|0\\rangle$ como $\\langle 0|$ como vetores de dimensão $n$ obtemos:\n", - " \n", - " $$\n", - " 2|\\psi\\rangle\\langle\\psi | - I\n", - " $$\n", - " \n", - "\n", - " Do ponto de vista de implementação o passo a passo para aplicar a inversão sobre a média no sistema seria da seguinte forma: \n", - " 1. Aplicar transformações de Hadamard $H^{\\otimes n}$\n", - " 2. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", - "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$
\n", - " 3. Reaplicar transformações de Hadamard $H^{\\otimes n}$\n", - " \n", - " A aplicação do operador $U_f$(ou oracle)junto com os três passos $1,2$ e $3$ compõe a interação de Grover ou _Grover's interation_.\n", - " O algoritmo tem que ser executado aproximadamente $\\sigma\\left(\\sqrt{N/M}\\right)$ vezes, mais especificamente a aplicação da interação de Grover no sistema. \n", - " \n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Circuito Quântico" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Nós iremos realizar nossa busca em um vetor com 4 elementos com índices 00, 01, 10, 11.
\n", - "O elemento escolhido para busca é o úlitmo cujo o índice é 11.
\n", - "\n", - "**Antes de Comerçarmos:**
\n", - "Para implementarmos o circuito que irá encontra-lo nós incializamos os nossos qubits,
\n", - "os dois primeiros em $|00\\rangle$ e o último o anclilla qubits em $|1\\rangle$. Após isso
\n", - "aplicaremos a transformação de hadamard a todos os estados." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Inicialização dos estados\n", - "qub = QuantumRegister(3,'q')\n", - "cb = ClassicalRegister(2,'c')\n", - "qc = QuantumCircuit(qub,cb)\n", - "\n", - "#Preparando a ancila\n", - "qc.x(qub[2])\n", - "\n", - "#Hadarmad \n", - "\n", - "qc.barrier()\n", - "\n", - "qc.h(qub)\n", - "qc.barrier()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Antes de irmos em frente:**\n", - "\n", - "Agora faremos a iteração de grover apenas uma vez. Isso acontece porque de forma precisa a
\n", - "quantidade vezes que iremos rodar o procedimento de Grover é cálculada pela seguinte equação:
\n", - "\n", - "$$\n", - "R = CI\\left(\\frac{arccos\\sqrt(M/N)}{\\theta}\\right)\n", - "$$\n", - "\n", - "Onde CI(x) é o valor inteiro mais próximo de x (se o valor for por exemplo 1.5 arredondamos para baixo ficando com 1)
\n", - "e $\\theta$ é dado pela equação:\n", - "\n", - "$$\n", - "sin\\theta = \\frac{2\\sqrt(M(N -M))}{N}\n", - "$$\n", - "\n", - "\n", - "Nós podemos resumir tudo isso na seguinte expressão: $ R \\leq \\lceil \\pi/2\\theta \\rceil$.
\n", - "No nosso caso valor the $\\theta$ será de $\\pi/3$ o que nós daria um valor proximado de 0.5
\n", - "e arredondado de 1.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Seguindo em frente**\n", - "\n", - "1. Aplicar a função Oracle que irá marcar o índice buscado $O$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Oracle\n", - "qc.ccx(qub[0], qub[1], qub[2])\n", - "qc.barrier()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. Aplicaremos agora a transformação de Hadamard aos dois primeiros qubits" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#---Hadamard\n", - "qc.h(qub[0])\n", - "qc.h(qub[1])\n", - "\n", - "qc.barrier()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "3. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", - "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#----Troca de fase\n", - "qc.x(qub[0])\n", - "qc.x(qub[1])\n", - "\n", - "qc.h(qub[1])\n", - "\n", - "qc.cx(qub[0], qub[1])\n", - "\n", - "\n", - "qc.h(qub[1])\n", - "\n", - "qc.x(qub[0])\n", - "qc.x(qub[1]) \n", - "qc.barrier()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#--- Hadarmard\n", - "qc.h(qub)\n", - "\n", - "qc.draw(output='mpl')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Após a última aplicação podemos efetuar a medição dos qubits da entrada, ou seja efetuar a medição nos qubits $0$ e $1$. \n", - "O circuito quântico resultante ficaria então da seguinte forma:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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tXHI2jhkjbO53W4VFxdr5cqVkqT3339fP/zwg8lVwYpYPwAEC5fiw3EOHjxodgmOQdbGIWvjkDUk6eTJk1q9erUWLVqkDRs2eL02bNgwSVLv3r11xx13aMKECWrZsqUZZcJiWD8ABAtn7AEAAPzwySefqF+/fpowYYIOHTqkrKwsrV27Vjt27JAkvffee3rssccUGhqqadOmqUePHlq3bp3JVQMAGjMaezjOpZdeanYJjkHWxiFr45C1sy1evFgDBgyQ2+1Wfn6+duzYoYcffljXXnutLr74YknS0KFDlZmZqU2bNunPf/6zIiIi9Jvf/EZZWVnyeDwm/wQwE+sHgGChsYfjrFmzxuwSHIOsjUPWxiFr51qxYoWmTJmiYcOGaevWrRo1apRCQs79VsrlcmnQoEHatGmTbr31Vj3yyCPKyckxsGJYDesHEBzl5eVml2A6Gns4zh/+8AezS3AMsjYOWRuHrJ1p9+7duv3225WcnKz8/HxFRkb6/L3nn3++Fi9erPHjx2vOnDn661//GsRKYWWsH8C5HT9+XEuWLNGECRN06aWXqnXr1oqOjlafPn2UlpamV155RadOnar2fbm5uerZs6f27dtnQtXW4ajGfunSpX490zAhIUHvvvtu8AqCKVavXm12CY5hp6y///57vfjii5J+OaNy8uRJkyvyj52ytjuydqZp06YpJCREL7/8ssLCwvz+/pCQEL3wwgvq2LGjbrvtNlVWVgahSlgd6wdQ3alTp5SVlVW1Pn7wwQe66KKLNH78eN10001q37693nzzTY0fP16dO3fW008/XbWG5ubmKjMzU4MHD1a7du1M/knM5ajG/mwVFRWaPXu22rRpo/DwcKWmpurQoUNVr48ePVr5+fkmVgin69ChgxYvXuy1zePxKCIiQq+//rpJVTUuJ0+e1B133KGOHTtq6tSpkqQxY8aoQ4cOVY0+GhbzOviOHTumNm3aeF32+9NPP2ngwIEaM2aMpZtKK86PL774QoWFhbr//vvVuXPngI8TERGh3NxcffHFF5Y4cWDFrGtj53ltR3abH7CnL7/8Uv3799cjjzyioUOH6i9/+Yv279+vgoICPfvss3ruuedUWFio7777ToWFherdu7fuvvtuJScn68EHH1RmZqbGjx+vZcuWqUkTZz/wzdGNfU5OjvLz81VSUlJ16caECROqXh89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Wy1btvTafrrR79Onj1asWGFGaX6zetYS89oIW7du1YgRI7RgwQJdf/31VdunT5+ugwcPWvpGkFaeHzfccIP279/fIM+e/+KLL7RhwwbdcMMNDVBZYKycdU3sPK/PZuX14zS7zQ/Yy+k72vvyUaS6mvrTunfvrv3791d7dLHTmP7Av+zsbGVnZ1f9e5cuXTR16lS/j/PAAw/ogQce8Ot7QkNDNX/+fM2fP7/G1wsKCjR69Gi/a4G19ejRQ9u3bze7jFqd6zI8uz1T3Q5ZDxw4UNu3b1deXp5eeeUVffnll/r1r3+t9PR03XzzzdXuCGxVdsiaeR18PXv21I8//lhte/PmzfXdd9+ZUJHvrDw/brzxRsXExOjRRx/V8OHD6/W89EcffVRNmzZVWlpaA1boHytnXRM7z+uzWXn9OM1u8wP20rFjR3355ZfVPo59tp9//lnvvfdenU29JN15550aP358vdbmxsD0xv5Mbrdbe/bs8Tpjn5aWppKSEp08eVIlJSV68803Davnggsu0NixYw0bD4A5OnTooKysLGVlZcnlcmnDhg1mlwTAQpo2baqcnBxNnjxZzzzzjO6+++6AjvPGG2/of//3f5WVldWgd9kHALs477zzfDpb36RJE7355ps677zzam3qpV+eNMKaarHGfuvWrQoPD1e3bt2qti1ZsqTBjh8fH69bb73V5/2zsrIabGwAAGBfkyZN0po1a3TfffcpNjbW70vpN2zYoAkTJqhv3766//77g1QlADQedrlq0iosdb3CwIED5Xa7g/ZYAn8bezRO/t6FF4Eja+OQtXHI2plcLpdWrlypxMREjR07Vg8//LBOnTpV5/dVVlbqueee09VXX6127drprbfeUtOmTQ2oGFbE+gEgWCzV2ANG4DNixiFr45C1ccjaucLDw6s+85mdna3evXtr0aJFKi8vr7bviRMntHz5ciUlJWnGjBkaPHiwPvroI3Xo0MGEymEVrB8AgoXGHo5z5513ml2CY5C1ccjaOGTtbC1bttTLL7+sgoICtWjRQtOnT1erVq108cUX69prr5Uk9e7dWxEREZowYYLcbrf+53/+R++88w6PCQPrB4CgsdRn7AEjFBUVmV2CY5C1ccjaOGQNSRo5cqRGjBihTz75RO+99542bdqkffv2SZI6d+6s66+/XkOGDNGVV14ZtI8Ywn5YPwAE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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.measure(qub[0],cb[0])\n", - "qc.measure(qub[1],cb[1])\n", - "\n", - "qc.draw(output='mpl')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Select the QasmSimulator from the Aer provider\n", - "simulator = Aer.get_backend('qasm_simulator')\n", - "\n", - "# Execute and get counts\n", - "result = execute(qc, simulator).result()\n", - "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='Índice Buscado')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Execução em uma máquina real\n", - "\n", - "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Informe seu API_TOKEN: ········\n" - ] - } - ], - "source": [ - "import getpass\n", - "\n", - "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Máquinas disponíveis" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "IBMQ.enable_account(MY_API_TOKEN)\n", - "AccountProvider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')\n", - "AccountProvider.backends(operational=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Escolhendo uma máquina e rodando o algoritmo" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Error checking job status using websocket, retrying using HTTP.\n" - ] - } - ], - "source": [ - "backend = AccountProvider.get_backend('ibmqx4')\n", - "\n", - "job_sim = execute(qc, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Índice Buscado')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Fonte e mais informações: \n", - "\n", - "[IBMQ website](https://quantum-computing.ibm.com/support/guides/quantum-algorithms)
\n", - "[Quantum Computation and Quantum Information](https://books.google.com.br/books/about/Quantum_Computation_and_Quantum_Informat.html?id=-s4DEy7o-a0C&printsec=frontcover&source=kp_read_button&redir_esc=y#v=onepage&q&f=false)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercício\n", - "\n", - " 1. Calcule os valores invertidos sobre a média de cada valor do vetor $\\left[4,5,10,3,3\\right]$\n", - " \n", - " 2. Mostre que $A^2 = A$\n", - " \n", - " 3. Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. \n", - " \n", - " 4. O que acontece se repetirmos o exemplo porém aplicarmos _inversão de fase_ e inversão sobre a média quatro vezes?\n", - " \n", - " 5. Fazer o exemplo para uma entrada de três qubits onde $f$ \"escolhe\" a cadeia 001\n", - " 6. Crie um circuito quântico utilizando um oracle diferente. Dica:Verifique a ação de $U_f$ sobre os estados da base ( incluindo a ancila )" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/conceitos_basicos.ipynb b/conceitos_basicos.ipynb deleted file mode 100644 index e69de29..0000000 diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb deleted file mode 100644 index 5dbe9f4..0000000 --- a/deutsch_jozsa.ipynb +++ /dev/null @@ -1,547 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# Problema de Deutsch e Deutsch-Jozsa\n", - "\n", - "## Observação dos autores\n", - "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", - "\n", - "### Cronograma\n", - "- Antes de comecarmos\n", - "- Paralelismo Quântico\n", - "- Problema de Deutsch\n", - "- Porta Hadamard para N qubits\n", - "- Problema de Deutsch-Jozsa\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Antes de começarmos\n", - "\n", - " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", - "\n", - "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", - "\n", - " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", - "\n", - " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "## Avaliando uma função\n", - "\n", - " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", - "\n", - "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", - "\n", - " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", - " \n", - " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", - "\n", - "$$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", - " \n", - " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Problema de Deutsch\n", - "\n", - "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", - "\n", - "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", - "\n", - "### Conceitos Iniciais:\n", - "\n", - "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", - "\n", - "### Como o algoritmo funciona:\n", - "\n", - "Agora que sabemos o que é uma função constante ou balanceada, podemos então seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é um valor e metade a outra outro. Nesse caso, isso se resumiria no fato de para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", - "\n", - "Para isso iremos utilizar o conceito apresentado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", - "\n", - "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", - "\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Antes de seguirmos para nosso exemplo:**\n", - "\n", - "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", - "\n", - "\n", - "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", - "\n", - "\n", - "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", - "\n", - "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### Passos do Algoritmo:\n", - "\n", - "#### 1º Passo:\n", - "\n", - "Incializar os registradores \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2º Passo:\n", - "\n", - "Considerando que o registrador de entrada deve se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancilla encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Esses estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", - "\n", - "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", - "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", - "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3º Passo:\n", - "\n", - "\n", - "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", - "\n", - "$$\\begin{eqnarray}\n", - "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", - "\\end{eqnarray}$$\n", - "\n", - "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", - "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", - "\n", - "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", - "\n", - "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", - "\n", - "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4º Passo:\n", - "\n", - "\n", - "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", - "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", - "\n", - "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|00\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", - "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Porta Hadamard para N qubits\n", - "\n", - "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", - "\n", - "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", - "\n", - "\n", - "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", - "\n", - "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", - "\n", - "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", - "\n", - "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", - "\n", - "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", - "\n", - "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", - "\n", - "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", - "\n", - "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problema de Deutsch Jozsa\n", - "\n", - "O algoritmo de Deutsch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Para o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", - "\n", - "\n", - "Porém, antes de seguirmos com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancilla nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim, a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", - "\n", - "Desenvolvendo o último termo da igaldade ficamos com:\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo temos que se $f(x) = 0$:\n", - "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "E se $f(x) = 1$ temos:\n", - "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Portanto, podemos concluir que:\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", - "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", - "\n", - "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", - "\n", - "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se as células de cada linha da matriz $H^{\\otimes N}$ e realizassem um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", - "\n", - "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", - "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", - "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exemplo prático :\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Incializando os nossos qubits\n", - "\n", - "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. \n", - "\n", - "Suponha que temos uma função $f$ em que $f(0) = 1$ e $f(1) = 0$ que claramente esse é uma função balanceada.\n", - "\n", - "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", - "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$" - ] - }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "# Importing standard Qiskit libraries and configuring account\n", - "import numpy as np\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", - "from qiskit.compiler import transpile, assemble\n", - "from qiskit.tools.jupyter import *\n", - "from qiskit.visualization import *\n", - "\n", - "\n", - "q = QuantumRegister(2)\n", - "c = ClassicalRegister(2)\n", - "qc = QuantumCircuit(q, c)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", - "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", - "\n", - "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle \\rightarrow |0\\rangle|1\\rangle$\n", - "\n", - "\n", - "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle \\rightarrow \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "\n", - "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{2}\\right)$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 94, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 94, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#preparando o ancilla\n", - "qc.x(q[1])\n", - "\n", - "qc.barrier()\n", - "\n", - "qc.h(q[1])\n", - "qc.h(q[0])\n", - "\n", - "qc.barrier()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Então, aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador **X**\n", - "\n", - "\n", - "$|\\psi_4\\rangle = U_f\\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "$|\\psi_4\\rangle = \\left(\\frac{-|00\\rangle + |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", - "\n", - "$|\\psi_4\\rangle = -\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.x(q[0])\n", - "qc.barrier()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Agora basta aplicarmos o Hadarmad ao estado atual e medirmos\n", - "\n", - "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", - "\n", - "\n", - "$|\\psi_5\\rangle = -|1\\rangle|0\\rangle$" - ] - }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 96, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.h(q)\n", - "qc.measure(q, c)\n", - "qc.draw(output='mpl')" - ] - }, - { - "cell_type": "code", - "execution_count": 97, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 97, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "backend = Aer.get_backend('qasm_simulator')\n", - "job_sim = execute(qc, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(qc)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Execução em uma máquina real\n", - "\n", - "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" - ] - }, - { - "cell_type": "code", - "execution_count": 98, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Informe seu API_TOKEN: ········\n" - ] - } - ], - "source": [ - "import getpass\n", - "\n", - "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Máquinas disponíveis" - ] - }, - { - "cell_type": "code", - "execution_count": 99, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 99, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "IBMQ.enable_account(MY_API_TOKEN)\n", - "AccountProvider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')\n", - "AccountProvider.backends(operational=True)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "backend = AccountProvider.get_backend('ibmqx4')\n", - "\n", - "job_sim = execute(qc, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Índice Buscado')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 2", - "language": "python", - "name": "python2" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.14" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/grover.ipynb b/grover.ipynb deleted file mode 100644 index 25abc74..0000000 --- a/grover.ipynb +++ /dev/null @@ -1,749 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "# Importing standard Qiskit libraries and configuring account\n", - "import numpy as np\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", - "from qiskit.compiler import transpile, assemble\n", - "from qiskit.tools.jupyter import *\n", - "from qiskit.visualization import *\n", - "# Loading your IBM Q account(s)\n", - "#provider = IBMQ.load_account()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Algoritmo de Grover\n", - "- Introdução\n", - "- Preparação dos estados\n", - "- Aplicando Oracle\n", - "- Inversão sobre a média\n", - "- Circuito Quântico\n", - "- Exercícios" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Observações dos autores\n", - "\n", - "- Recomendamos que antes de prosseguir para o algoritmo de Grover, o leitor esteja bem familiarizado com os algoritmos de Deutsch e a sua extensão Deutsch-Jozsa. Pois muitos dos conceitos já vistos lá são reutilizados neste módulo.\n", - " \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introdução \n", - "\n", - " Dado um conjunto desestruturado de elementos de tamanho $N$, como fazer para achar um elemento específico dentro do conjunto? A solução mais simples que não envolve a ordenação do conjunto implica a verificação de cada elemento do array até que o elemento desejado seja encontrado. No pior caso, seria necessário fazer $N$ requisições. O algoritmo proposto por Luv Grover tem a capacidade de fazê-lo em aproximadamente $\\sigma(\\sqrt{N/M})$ iterações, onde M é quantidade de soluções buscadas. \n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Preparação dos estados\n", - " Considere o operador unitário $U_f$ que implementa a função (ou oracle) $f\\{0,1\\}^n \\mapsto \\{0,1\\}$. Seja $\\tilde{x}$ a cadeia binária a qual deseja-se achar. Onde $f(x) = 1$ se $x = \\tilde{x}$ e $f(x) = 0$ se $ x \\neq \\tilde{x}$. A ação de $U_f$ nos estados dos qubits ocorreria da seguinte forma:\n", - " $$\n", - " U_f |x\\rangle |y\\rangle = |x\\rangle |y \\oplus f(x) \\rangle \n", - " $$\n", - " \n", - " O algoritmo em si faz uso de dois registradores quânticos, o primeiro trata-se de um registrador de $n$ qubits o qual é a entrada one será feita a busca, o segundo registrador quântico trata-se do qubit auxiliar (ou ancilla).\n", - " Mas antes de entrar nos detalhes do algoritmo é necessário fazer algumas observações, relaciondas a um passo importante na evolução do sistema chamado de _inversão de fase_.\n", - " \n", - " \n", - " Considere uma entrada qualquer $|x\\rangle$. O estado inicial do sistema se encontraria como a seguir:\n", - " $$\n", - " |x\\rangle\\left( \\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}} \\right)\n", - " $$\n", - " \n", - " Distribuindo e aplicando $U_f$\n", - " \n", - " $$\n", - " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = U_f\\left[ \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) \\right]\n", - " $$\n", - " $$\n", - " \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x) \\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right) \n", - " $$\n", - " \n", - " Sabendo que $\\oplus$ o qual trata-se de uma soma módulo 2, opera como um $XOR$ nos estados dos qubits. É possivel verificar que a operação $|1 \\oplus f(x)\\rangle$ trata-se da negação de $f(x)$. \n", - " Ou seja:\n", - " $$\n", - " |x\\rangle \\left(\\frac{| f(x) \\rangle - | \\bar{f(x)}\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " Levando este resultado em consideração, então a fase do sistema (ou sinal da equação) é determinada pelo resultado da função, matematicamente falando:\n", - " $$\n", - " (-1)^{f(x)}|x\\rangle \\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Por simplicidade, vamos considerar que a entrada é uma superposição de todos os estados possíveis. Como se aplicássemos portas Hadamard do tipo $H^{\\otimes n}$ a um registrador $|0\\rangle^{\\otimes n}$ . E que o estado inicial da ancilla enconta-se como em $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$.\n", - " \n", - " Para um sistema cuja entrada tem três qubits, o estado se encontraria como a seguir:\n", - " $$\n", - " \\frac{1}{2}\\left(|00\\rangle + |01\\rangle + |10\\rangle + |11\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$ \n", - " Utilizando a API _Qiskit_ disponibilizada pela IBM a preparação do estado ficaria da seguinte forma:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐     \n",
-       "q_0: |0>┤ H ├─────\n",
-       "        ├───┤     \n",
-       "q_1: |0>┤ H ├─────\n",
-       "        ├───┤┌───┐\n",
-       "q_2: |0>┤ X ├┤ H ├\n",
-       "        └───┘└───┘\n",
-       " c_0: 0 ══════════\n",
-       "                  \n",
-       " c_1: 0 ══════════\n",
-       "                  
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qub = QuantumRegister(3,'q')\n", - "cb = ClassicalRegister(2,'c')\n", - "qc = QuantumCircuit(qub,cb)\n", - "qc.h(qub[0])\n", - "qc.h(qub[1])\n", - "#Preparando a ancila\n", - "qc.x(qub[2])\n", - "qc.h(qub[2])\n", - "#Drawing circuits\n", - "qc.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Aplicando o Oracle\n", - " Agora seja $f$ uma função que \"busca\" pela cadeia $11$, então ao aplicar a inversão de fase o estado resultante ficaria da seguinte forma:\n", - " \n", - " $$\n", - " \\frac{1}{2}\\left(|00\\rangle + |01\\rangle + |10\\rangle - |11\\rangle\\right)\\left(\\frac{| 0 \\rangle - | 1\\rangle }{\\sqrt{2}}\\right)\n", - " $$\n", - " \n", - " Explicando de forma simplificada, é como se o estado $11$ estivesse sendo marcado para que a busca pudesse ser efetuada.\n", - " Um operador que já implementa esta função é o operador $Toffoli$ o qual já se encontra implementado na API do _Qiskit_." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          \n",
-       "q_0: |0>┤ H ├───────■──\n",
-       "        ├───┤       │  \n",
-       "q_1: |0>┤ H ├───────■──\n",
-       "        ├───┤┌───┐┌─┴─┐\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├\n",
-       "        └───┘└───┘└───┘\n",
-       " c_0: 0 ═══════════════\n",
-       "                       \n",
-       " c_1: 0 ═══════════════\n",
-       "                       
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.ccx(qub[0], qub[1], qub[2])\n", - "qc.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " Para fins de demonstração efetuaremos uma medição nos qubits para verificar as probabilidades do sistema somente com a inversão de fase." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
        ┌───┐          ┌─┐   \n",
-       "q_0: |0>┤ H ├───────■──┤M├───\n",
-       "        ├───┤       │  └╥┘┌─┐\n",
-       "q_1: |0>┤ H ├───────■───╫─┤M├\n",
-       "        ├───┤┌───┐┌─┴─┐ ║ └╥┘\n",
-       "q_2: |0>┤ X ├┤ H ├┤ X ├─╫──╫─\n",
-       "        └───┘└───┘└───┘ ║  ║ \n",
-       " c_0: 0 ════════════════╩══╬═\n",
-       "                           ║ \n",
-       " c_1: 0 ═══════════════════╩═\n",
-       "                             
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.measure(qub[0],cb[0])\n", - "qc.measure(qub[1],cb[1])\n", - "qc.draw()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Considerando este reusltado podemos fazer as seguintes observações: Se aplicarmos uma medição nos qubits superiores qualquer um dos estados poderia ser retornado com mesma probabilidade dado que $\\left| \\frac{1}{2} \\right|^2 = \\left| - \\frac{1}{2} \\right|^2 $ o que não é muito interessante para quem faz a busca.\n", - " Por isso que o algoritmo de Grover faz uso de um passo muito importante para resolver este problema chamado de _inversão sobre a média_. " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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pN7y999/P0cffTQAb775Jt27d+fss8/m8MMP53vf+x7V1dUA3HzzzZx22ml87GMf44EHHuBrX/ta057IVnLSNLOS1VRNgQCjR49m8uTJTJ48mX333bdo59TSRcRm6yTlLTt+/HimT5/OyJEjAdiwYQNTp07l2muv5a9//Svz589n3LhxANx222088MADvPrqq5xxxhl897vfbbqT2AZOmmZWspqqKdC2Xp8+fXj77bdrlxcvXpy3KfXvf/87N954I+PGjaNTp061++63337079+f9u3bc8IJJ/Dyyy+zbNkyXnnlFYYMGQLA8OHDee6554pzQgVy0jSzktVUTYEA119/PYceeihXXXUVH374YdOdRCtzwAEHMHfuXBYsWEBVVRUPPfQQxx577CZlXn75ZS677DLGjRtHz549N9n3vffeY9myZQBMnjyZQYMGseOOO7Jq1SrmzJkDwN/+9jc++tGPFu+kCtC+uQMwM6vP1jQFPvroo8C/mwKffPJJ+vbty/nnn8+4ceM466yzuPrqq+nVqxdVVVV8/etf5+abb+aKK65o0nNpLdq3b88NN9zAqaeeSnV1NWeeeSYVFRWMGTOGyspKjjvuOEaNGsWaNWs477zzAOjbty/jxo2jrKyMa6+9llNOOYWIYP/99+fss8+mffv23HTTTZxzzjm0a9eOHXfckVtuuaWZzzQ/J00zK1mFNgU++uijeZsCAU444QSef/55gNpjdOrUiTPOOIOf/exnTXwmrcuwYcMYNmzYJuuuuuqq2tcPP/xwvfseeeSRTJkyZbP1J554IieeeGLjBdlE3DxrZiWrKZoCAZYuXQokNdnHHnuMioqKIp2RtXSuaZpZyWqKpkCAL3/5yyxbtoyIYN999y3ZB+mt9CjfPYO2orKyMiZNmtTcYZiZWQkpLy+fFhFD8m1z86yZmVlGTppmZmYZOWmamZll5KRpZmaWkZOmmZlZRk6aZmZmGTlpmpmZZeSkaWZmlpGTppmZWUYeRq+ZTJw4kauuuorq6mrOOussLr300k22jx07lvvuu4/27dvTo0cPbrnlFvr161e7fdWqVRx88MGccMIJ3HDDDZvse8YZZzB//nyeeeaZopyLmbVcV9yzU3OH0GhuOGdlk7+Ha5rNYFtnowcYM2YMhxxyyGbHfuSRR+jatWuTxm9m1la5ptkMcmejB2pno997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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Select the QasmSimulator from the Aer provider\n", - "simulator = Aer.get_backend('qasm_simulator')\n", - "\n", - "# Execute and get counts\n", - "result = execute(qc, simulator).result()\n", - "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='O indíce procurado')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inversão sobre a média\n", - "\n", - " Considere a o seguinte vetor de tamanho $5$ com os seguintes valores : $\\left[4,5,10,3,3\\right]$. Sabendo que média desses números é $5$, como inverter seus valores em relação à média? Primeiramente deve-se calcular a distância entre o valor e a média, matemáticamente isto é feito subtraindo a média $m$ e o valor $v$: $m-v$ . Em seguinda pegamos o resultado e o somamos à média mais uma vez: $m - v + m$ ou $ -v + 2m$. \n", - " \n", - " Agora considere que ao invés de calcular a inversão sobre a média de cada valor individualmente, queiramos calcular a inversão sobre a média dos valores no vetor utilizando operações matriciais. Como fazê-lo?\n", - " \n", - " Sabendo que para calcular a média soma-se todos os valores e o resultado é dividido pelo número de valores somados. Ou seja $\\frac{1}{n}\\sum_{i=1}^{n} x_i$ , para $n$ o número de valores somados e $x_i$ o $i$-ésimo valor. Agora considere o coeficiente $\\frac{1}{n}$. Retomando o uso do vetor $\\left[4,5,10,3,3\\right]$ podemos calcular a média desse vetor aplicando a seguinte operação: \n", - " $$\\left[\\begin{array}{ccccc}\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} & \\frac{1}{5} \\\\\n", - " \\end{array}\\right]\n", - " \\left[\\begin{array}{c}\n", - " 4 \\\\\n", - " 5 \\\\\n", - " 10\\\\\n", - " 3 \\\\\n", - " 3 \\\\\n", - " \\end{array}\\right] \n", - " = \n", - " \\left[\\begin{array}{c}\n", - " 5 \\\\\n", - " 5 \\\\\n", - " 5\\\\\n", - " 5 \\\\\n", - " 5 \\\\\n", - " \\end{array}\\right]$$\n", - " \n", - " As células da primeira matriz estão todas com valor $\\frac{1}{5}$ pois trata-se do coeficiente utilizado no somatório da média. Por simplicidade chamaremos a matriz cujas todas células estão com valor $\\frac{1}{5}$ de $A$. \n", - " \n", - " Desse modo, matricialmente falando. A operação de inversão sobre a média de um vetor $V$ ocorre da seguinte forma:\n", - " $$\n", - " \\bar{V} = -V + 2AV \n", - " $$\n", - " Evidenciando o vetor $V$ obtemos: $(-I + 2A)V$. Desse modo, o operador de inversão sobre a média é obtido a partir da operação matricial: \n", - " $$\n", - " -I + 2A\n", - " $$\n", - " \n", - " ### Implementando inversão sobre a média\n", - " \n", - " Sob a perspectiva de computação quântica este operador pode ser obtido a partir da seguinte fórmula: \n", - " \n", - " $$\n", - " H^{\\otimes n}\\left(2|0\\rangle\\langle0| - I \\right)H^{\\otimes n}\n", - " $$\n", - " \n", - " Considerando a entrada do sistema $|\\psi\\rangle$, a qual será efetuada a busca, como de uma superposição de todos os estados possíveis. Ou seja : $H^{\\otimes n} | 0 \\rangle^{\\otimes n} = |\\psi\\rangle$.\n", - " E Considerando tanto $|0\\rangle$ como $\\langle 0|$ como vetores de dimensão $n$ obtemos:\n", - " \n", - " $$\n", - " 2|\\psi\\rangle\\langle\\psi | - I\n", - " $$\n", - " \n", - "\n", - " Do ponto de vista de implementação o passo a passo para aplicar a inversão sobre a média no sistema seria da seguinte forma: \n", - " 1. Aplicar transformações de Hadamard $H^{\\otimes n}$\n", - " 2. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", - "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$
\n", - " 3. Reaplicar transformações de Hadamard $H^{\\otimes n}$\n", - " \n", - " A aplicação do operador $U_f$(ou oracle)junto com os três passos $1,2$ e $3$ compõe a interação de Grover ou _Grover's interation_.\n", - " O algoritmo tem que ser executado aproximadamente $\\sigma\\left(\\sqrt{N/M}\\right)$ vezes, mais especificamente a aplicação da interação de Grover no sistema. \n", - " \n", - " \n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Circuito Quântico" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Nós iremos realizar nossa busca em um vetor com 4 elementos com índices 00, 01, 10, 11.
\n", - "O elemento escolhido para busca é o úlitmo cujo o índice é 11.
\n", - "\n", - "**Antes de Comerçarmos:**
\n", - "Para implementarmos o circuito que irá encontra-lo nós incializamos os nossos qubits,
\n", - "os dois primeiros em $|00\\rangle$ e o último o anclilla qubits em $|1\\rangle$. Após isso
\n", - "aplicaremos a transformação de hadamard a todos os estados." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#Inicialização dos estados\n", - "qub = QuantumRegister(3,'q')\n", - "cb = ClassicalRegister(2,'c')\n", - "qc = QuantumCircuit(qub,cb)\n", - "\n", - "#Preparando a ancila\n", - "qc.x(qub[2])\n", - "\n", - "#Hadarmad \n", - "\n", - "qc.barrier()\n", - "\n", - "qc.h(qub)\n", - "qc.barrier()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Antes de irmos em frente:**\n", - "\n", - "Agora faremos a iteração de grover apenas uma vez. Isso acontece porque de forma precisa a
\n", - "quantidade vezes que iremos rodar o procedimento de Grover é cálculada pela seguinte equação:
\n", - "\n", - "$$\n", - "R = CI\\left(\\frac{arccos\\sqrt(M/N)}{\\theta}\\right)\n", - "$$\n", - "\n", - "Onde CI(x) é o valor inteiro mais próximo de x (se o valor for por exemplo 1.5 arredondamos para baixo ficando com 1)
\n", - "e $\\theta$ é dado pela equação:\n", - "\n", - "$$\n", - "sin\\theta = \\frac{2\\sqrt(M(N -M))}{N}\n", - "$$\n", - "\n", - "\n", - "Nós podemos resumir tudo isso na seguinte expressão: $ R \\leq \\lceil \\pi/2\\theta \\rceil$.
\n", - "No nosso caso valor the $\\theta$ será de $\\pi/3$ o que nós daria um valor proximado de 0.5
\n", - "e arredondado de 1.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Seguindo em frente**\n", - "\n", - "1. Aplicar a função Oracle que irá marcar o índice buscado $O$\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Oracle\n", - "qc.ccx(qub[0], qub[1], qub[2])\n", - "qc.barrier()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. Aplicaremos agora a transformação de Hadamard aos dois primeiros qubits" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#---Hadamard\n", - "qc.h(qub[0])\n", - "qc.h(qub[1])\n", - "\n", - "qc.barrier()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "3. Aplicar mudança de fase condicional nos estados, com toda a base computacional recebendo -1 exceto o estado $|0\\rangle^{\\otimes n}$
\n", - "$|x\\rangle \\rightarrow -(-1)^{\\delta_x0}|x\\rangle$" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#----Troca de fase\n", - "qc.x(qub[0])\n", - "qc.x(qub[1])\n", - "\n", - "qc.h(qub[1])\n", - "\n", - "qc.cx(qub[0], qub[1])\n", - "\n", - "\n", - "qc.h(qub[1])\n", - "\n", - "qc.x(qub[0])\n", - "qc.x(qub[1]) \n", - "qc.barrier()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#--- Hadarmard\n", - "qc.h(qub)\n", - "\n", - "qc.draw(output='mpl')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Após a última aplicação podemos efetuar a medição dos qubits da entrada, ou seja efetuar a medição nos qubits $0$ e $1$. \n", - "O circuito quântico resultante ficaria então da seguinte forma:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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tXHI2jhkjbO53W4VFxdr5cqVkqT3339fP/zwg8lVwYpYPwAEC5fiw3EOHjxodgmOQdbGIWvjkDUk6eTJk1q9erUWLVqkDRs2eL02bNgwSVLv3r11xx13aMKECWrZsqUZZcJiWD8ABAtn7AEAAPzwySefqF+/fpowYYIOHTqkrKwsrV27Vjt27JAkvffee3rssccUGhqqadOmqUePHlq3bp3JVQMAGjMaezjOpZdeanYJjkHWxiFr45C1sy1evFgDBgyQ2+1Wfn6+duzYoYcffljXXnutLr74YknS0KFDlZmZqU2bNunPf/6zIiIi9Jvf/EZZWVnyeDwm/wQwE+sHgGChsYfjrFmzxuwSHIOsjUPWxiFr51qxYoWmTJmiYcOGaevWrRo1apRCQs79VsrlcmnQoEHatGmTbr31Vj3yyCPKyckxsGJYDesHEBzl5eVml2A6Gns4zh/+8AezS3AMsjYOWRuHrJ1p9+7duv3225WcnKz8/HxFRkb6/L3nn3++Fi9erPHjx2vOnDn661//GsRKYWWsH8C5HT9+XEuWLNGECRN06aWXqnXr1oqOjlafPn2UlpamV155RadOnar2fbm5uerZs6f27dtnQtXW4ajGfunSpX490zAhIUHvvvtu8AqCKVavXm12CY5hp6y///57vfjii5J+OaNy8uRJkyvyj52ytjuydqZp06YpJCREL7/8ssLCwvz+/pCQEL3wwgvq2LGjbrvtNlVWVgahSlgd6wdQ3alTp5SVlVW1Pn7wwQe66KKLNH78eN10001q37693nzzTY0fP16dO3fW008/XbWG5ubmKjMzU4MHD1a7du1M/knM5ajG/mwVFRWaPXu22rRpo/DwcKWmpurQoUNVr48ePVr5+fkmVgin69ChgxYvXuy1zePxKCIiQq+//rpJVTUuJ0+e1B133KGOHTtq6tSpkqQxY8aoQ4cOVY0+GhbzOviOHTumNm3aeF32+9NPP2ngwIEaM2aMpZtKK86PL774QoWFhbr//vvVuXPngI8TERGh3NxcffHFF5Y4cWDFrGtj53ltR3abH7CnL7/8Uv3799cjjzyioUOH6i9/+Yv279+vgoICPfvss3ruuedUWFio7777ToWFherdu7fuvvtuJScn68EHH1RmZqbGjx+vZcuWqUkTZz/wzdGNfU5OjvLz81VSUlJ16caECROqXh89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Wy1btvTafrrR79Onj1asWGFGaX6zetYS89oIW7du1YgRI7RgwQJdf/31VdunT5+ugwcPWvpGkFaeHzfccIP279/fIM+e/+KLL7RhwwbdcMMNDVBZYKycdU3sPK/PZuX14zS7zQ/Yy+k72vvyUaS6mvrTunfvrv3791d7dLHTmP7Av+zsbGVnZ1f9e5cuXTR16lS/j/PAAw/ogQce8Ot7QkNDNX/+fM2fP7/G1wsKCjR69Gi/a4G19ejRQ9u3bze7jFqd6zI8uz1T3Q5ZDxw4UNu3b1deXp5eeeUVffnll/r1r3+t9PR03XzzzdXuCGxVdsiaeR18PXv21I8//lhte/PmzfXdd9+ZUJHvrDw/brzxRsXExOjRRx/V8OHD6/W89EcffVRNmzZVWlpaA1boHytnXRM7z+uzWXn9OM1u8wP20rFjR3355ZfVPo59tp9//lnvvfdenU29JN15550aP358vdbmxsD0xv5Mbrdbe/bs8Tpjn5aWppKSEp08eVIlJSV68803Davnggsu0NixYw0bD4A5OnTooKysLGVlZcnlcmnDhg1mlwTAQpo2baqcnBxNnjxZzzzzjO6+++6AjvPGG2/of//3f5WVldWgd9kHALs477zzfDpb36RJE7355ps677zzam3qpV+eNMKaarHGfuvWrQoPD1e3bt2qti1ZsqTBjh8fH69bb73V5/2zsrIabGwAAGBfkyZN0po1a3TfffcpNjbW70vpN2zYoAkTJqhv3766//77g1QlADQedrlq0iosdb3CwIED5Xa7g/ZYAn8bezRO/t6FF4Eja+OQtXHI2plcLpdWrlypxMREjR07Vg8//LBOnTpV5/dVVlbqueee09VXX6127drprbfeUtOmTQ2oGFbE+gEgWCzV2ANG4DNixiFr45C1ccjaucLDw6s+85mdna3evXtr0aJFKi8vr7bviRMntHz5ciUlJWnGjBkaPHiwPvroI3Xo0MGEymEVrB8AgoXGHo5z5513ml2CY5C1ccjaOGTtbC1bttTLL7+sgoICtWjRQtOnT1erVq108cUX69prr5Uk9e7dWxEREZowYYLcbrf+53/+R++88w6PCQPrB4CgsdRn7AEjFBUVmV2CY5C1ccjaOGQNSRo5cqRGjBihTz75RO+99542bdqkffv2SZI6d+6s66+/XkOGDNGVV14ZtI8Ywn5YPwAE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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.measure(qub[0],cb[0])\n", - "qc.measure(qub[1],cb[1])\n", - "\n", - "qc.draw(output='mpl')" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Select the QasmSimulator from the Aer provider\n", - "simulator = Aer.get_backend('qasm_simulator')\n", - "\n", - "# Execute and get counts\n", - "result = execute(qc, simulator).result()\n", - "counts = result.get_counts(qc)\n", - "plot_histogram(counts, title='Índice Buscado')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Execução em uma máquina real\n", - "\n", - "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Informe seu API_TOKEN: ········\n" - ] - } - ], - "source": [ - "import getpass\n", - "\n", - "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Máquinas disponíveis" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[,\n", - " ,\n", - " ,\n", - " ]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "IBMQ.enable_account(MY_API_TOKEN)\n", - "AccountProvider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')\n", - "AccountProvider.backends(operational=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Escolhendo uma máquina e rodando o algoritmo" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Error checking job status using websocket, retrying using HTTP.\n" - ] - } - ], - "source": [ - "backend = AccountProvider.get_backend('ibmqx4')\n", - "\n", - "job_sim = execute(qc, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(deutsch)\n", - "plot_histogram(counts, title='Índice Buscado')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Fonte e mais informações: \n", - "\n", - "[IBMQ website](https://quantum-computing.ibm.com/support/guides/quantum-algorithms)
\n", - "[Quantum Computation and Quantum Information](https://books.google.com.br/books/about/Quantum_Computation_and_Quantum_Informat.html?id=-s4DEy7o-a0C&printsec=frontcover&source=kp_read_button&redir_esc=y#v=onepage&q&f=false)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercício\n", - "\n", - " 1. Calcule os valores invertidos sobre a média de cada valor do vetor $\\left[4,5,10,3,3\\right]$\n", - " \n", - " 2. Mostre que $A^2 = A$\n", - " \n", - " 3. Mostre que $-I + 2A$ é um operador unitário, ou seja que $(-I + 2A)(-I + 2A)^{\\dagger} = I$. \n", - " \n", - " 4. O que acontece se repetirmos o exemplo porém aplicarmos _inversão de fase_ e inversão sobre a média quatro vezes?\n", - " \n", - " 5. Fazer o exemplo para uma entrada de três qubits onde $f$ \"escolhe\" a cadeia 001\n", - " 6. Crie um circuito quântico utilizando um oracle diferente. Dica:Verifique a ação de $U_f$ sobre os estados da base ( incluindo a ancila )" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 899cd83c8553a44864d8b530df512e6ba32dec7b Mon Sep 17 00:00:00 2001 From: Tiagoblima Date: Sat, 17 Aug 2019 19:02:03 -0300 Subject: [PATCH 48/49] Adicionando o algoritmo de Deutsch -Jozsa revisado --- deutsch_jozsa.ipynb | 547 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 547 insertions(+) create mode 100644 deutsch_jozsa.ipynb diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb new file mode 100644 index 0000000..5dbe9f4 --- /dev/null +++ b/deutsch_jozsa.ipynb @@ -0,0 +1,547 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# Problema de Deutsch e Deutsch-Jozsa\n", + "\n", + "## Observação dos autores\n", + "\n", + "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastante conceitos matemáticos se dá por meio da prática. Desse modo, aconselhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", + "\n", + "### Cronograma\n", + "- Antes de comecarmos\n", + "- Paralelismo Quântico\n", + "- Problema de Deutsch\n", + "- Porta Hadamard para N qubits\n", + "- Problema de Deutsch-Jozsa\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Antes de começarmos\n", + "\n", + " Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de utilizarmos *paralelismo quântico* para computarmos diferentes entradas simultaneamente.\n", + "\n", + "Para entendermos esse conceito precisamos ter em mente as seguintes definições:\n", + "\n", + " - O que é um bit quântico ou qubit e como ele pode assumir dois estados ao mesmo tempo, o que é chamado de superposição. \n", + "\n", + " - Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Avaliando uma função\n", + "\n", + " Suponha que temos uma função $f$ cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? \n", + "\n", + "Em um computador quântico este problema seria solucionado utilizando o então chamado paralelismo quântico. Em um sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro auxiliar (ancilla), cujos propósitos você poderá ver posteriormente.\n", + "\n", + " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", + " \n", + " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", + "\n", + "$$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", + " \n", + " Onde $U_f$ nada mais é que a matriz de transformação linear, os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo(ou XOR). \n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Problema de Deutsch\n", + "\n", + "Agora que temos um noção do comportamento de $U_f$ e como podemos obtê-lo podemos falar do problema de Deutsch.\n", + "\n", + "O problema de Deutsch consiste em descobrir se uma determinada função binárias com duas possíveis entradas é constante ou balanceada. Na computação clássica seria necessário testarmos metade mais um de todas as entradas. Nesse caso seria necessário testarmos apenas uma vez, porém como veremos na frente no problema de Deutsch-Jozsa essa entrada pode ser muito maior, o que teria um custo exponencial de $2^{n-1} + 1$, onde n é tamanho da entrada.\n", + "\n", + "### Conceitos Iniciais:\n", + "\n", + "Uma dada função binária é chamada de constante quando todas as suas entradas têm uma mesma saída, por outro lado a função é chamada de balanceada se metade das saídas produzidas tem um valor e a outra metade o outro.\n", + "\n", + "### Como o algoritmo funciona:\n", + "\n", + "Agora que sabemos o que é uma função constante ou balanceada, podemos então seguir para a pergunta de como descobrir se uma função binária $f:\\{ 0, 1\\} \\rightarrow \\{ 0, 1\\}$ tem todas as saídas iguais ou metade das saídas é um valor e metade a outra outro. Nesse caso, isso se resumiria no fato de para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", + "\n", + "Para isso iremos utilizar o conceito apresentado anteriormente em que nós permite avaliarmos uma função, onde nossa função é vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y\\oplus f(x)\\rangle$ onde $x$ é a entrada e $y$ é a ancilla. \n", + "\n", + "Tendo isso em mente, podemos identificar se uma função é constante se quando fizermos a medição o valor for zero com 100% de certeza e balanceada se a medição for algo diferente.\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Antes de seguirmos para nosso exemplo:**\n", + "\n", + "É importante notar que nós podemos mudar o estado do ancilla qubit de modo que o resultado da função seja representado por uma mudança no sinal do estado. Dessa forma, se mudarmos do nosso ancilla qubit de $|0\\rangle$ para o estado $|1\\rangle$ e em seguida aplicarmos a operação Hadamard iremos obter o seguinte estado:\n", + "\n", + "\n", + "$$\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$$\n", + "\n", + "\n", + "Agora se a função retornar 0 o estado irá permanecer o mesmo, porém se ela retornar 1 os estados $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$ terão os sinais trocados. Assim a aplicação da função pode ser vista como sendo: \n", + "\n", + "$$(-1)^{f(x)}\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### Passos do Algoritmo:\n", + "\n", + "#### 1º Passo:\n", + "\n", + "Incializar os registradores \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2º Passo:\n", + "\n", + "Considerando que o registrador de entrada deve se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancilla encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Esses estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", + "\n", + "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", + "\n", + "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3º Passo:\n", + "\n", + "\n", + "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", + "\n", + "$$\\begin{eqnarray}\n", + "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", + "\\end{eqnarray}$$\n", + "\n", + "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", + "\n", + "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", + "\n", + "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", + "\n", + "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4º Passo:\n", + "\n", + "\n", + "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", + "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", + "\n", + "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|00\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", + "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Porta Hadamard para N qubits\n", + "\n", + "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "\n", + "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", + "\n", + "\n", + "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", + "\n", + "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", + "\n", + "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", + "\n", + "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", + "\n", + "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", + "\n", + "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", + "\n", + "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", + "\n", + "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Problema de Deutsch Jozsa\n", + "\n", + "O algoritmo de Deutsch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Para o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "\n", + "\n", + "Porém, antes de seguirmos com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancilla nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim, a evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", + "\n", + "Desenvolvendo o último termo da igaldade ficamos com:\n", + "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", + "\n", + "Desse modo temos que se $f(x) = 0$:\n", + "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "E se $f(x) = 1$ temos:\n", + "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Portanto, podemos concluir que:\n", + "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", + "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", + "\n", + "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", + "\n", + "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "\n", + "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se as células de cada linha da matriz $H^{\\otimes N}$ e realizassem um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", + "\n", + "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", + "\n", + "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", + "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", + "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exemplo prático :\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Incializando os nossos qubits\n", + "\n", + "Agora que entendemos alguns conceitos básicos podemos dar início ao um exemplo. \n", + "\n", + "Suponha que temos uma função $f$ em que $f(0) = 1$ e $f(1) = 0$ que claramente esse é uma função balanceada.\n", + "\n", + "Sabendo disso, nós podemos criar um circuito quântico que avalie a nossa função. Esse circuito pode ser separado em alguns estados que aqui serão representados por $|\\psi_i\\rangle$. Sendo assim, podemos seguir adiante com o seguintes passos:\n", + "$|\\psi_0\\rangle = |0\\rangle|0\\rangle$" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "# Importing standard Qiskit libraries and configuring account\n", + "import numpy as np\n", + "from qiskit import QuantumRegister, ClassicalRegister\n", + "from qiskit import QuantumCircuit, execute, Aer, IBMQ\n", + "from qiskit.compiler import transpile, assemble\n", + "from qiskit.tools.jupyter import *\n", + "from qiskit.visualization import *\n", + "\n", + "\n", + "q = QuantumRegister(2)\n", + "c = ClassicalRegister(2)\n", + "qc = QuantumCircuit(q, c)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Agora sabendo disso aplicaremos o operador X (Not) para mudar o estado do ancilla qubit e em \n", + "seguida iremos aplicar o operador H (Hadamard) em ambos os estados.\n", + "\n", + "$|\\psi_1\\rangle = |0\\rangle X|0\\rangle \\rightarrow |0\\rangle|1\\rangle$\n", + "\n", + "\n", + "$|\\psi_2\\rangle = H|0\\rangle H|1\\rangle \\rightarrow \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "\n", + "$|\\psi_3\\rangle = \\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{2}\\right)$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#preparando o ancilla\n", + "qc.x(q[1])\n", + "\n", + "qc.barrier()\n", + "\n", + "qc.h(q[1])\n", + "qc.h(q[0])\n", + "\n", + "qc.barrier()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Então, aplicamos a função através do operador $U_f$ que no nosso caso pode ser representado pelo operador **X**\n", + "\n", + "\n", + "$|\\psi_4\\rangle = U_f\\left(\\frac{|00\\rangle - |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "$|\\psi_4\\rangle = \\left(\\frac{-|00\\rangle + |01\\rangle + |10\\rangle - |11\\rangle}{\\sqrt{2}}\\right)$\n", + "\n", + "$|\\psi_4\\rangle = -\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)$\n" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc.x(q[0])\n", + "qc.barrier()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Agora basta aplicarmos o Hadarmad ao estado atual e medirmos\n", + "\n", + "$|\\psi_5\\rangle = H|\\psi_4\\rangle$\n", + "\n", + "\n", + "$|\\psi_5\\rangle = -|1\\rangle|0\\rangle$" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc.h(q)\n", + "qc.measure(q, c)\n", + "qc.draw(output='mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "backend = Aer.get_backend('qasm_simulator')\n", + "job_sim = execute(qc, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(qc)\n", + "plot_histogram(counts, title='Deutsch-Jozsa State')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Execução em uma máquina real\n", + "\n", + "Para execultar em uma máquina real apenas insira seu API_TOKEN da IBM abaixo:" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Informe seu API_TOKEN: ········\n" + ] + } + ], + "source": [ + "import getpass\n", + "\n", + "MY_API_TOKEN = getpass.getpass(\"Informe seu API_TOKEN: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Máquinas disponíveis" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "IBMQ.enable_account(MY_API_TOKEN)\n", + "AccountProvider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')\n", + "AccountProvider.backends(operational=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "backend = AccountProvider.get_backend('ibmqx4')\n", + "\n", + "job_sim = execute(qc, backend)\n", + "sim_result = job_sim.result()\n", + "\n", + "counts = sim_result.get_counts(deutsch)\n", + "plot_histogram(counts, title='Índice Buscado')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 3689a31608e6fc50ac6916efac2a561100670a19 Mon Sep 17 00:00:00 2001 From: IsmaelCesar Date: Thu, 22 Aug 2019 12:52:37 -0300 Subject: [PATCH 49/49] ignoring checkpoints & Deutsch-Josza's ignoring ipynb checkpoints folders and adding some small corrections to Deutsch-Josza's algorithm file --- .gitignore | 2 + .../deutsch_jozsa-checkpoint.ipynb | 319 ------------------ deutsch_jozsa.ipynb | 32 +- 3 files changed, 18 insertions(+), 335 deletions(-) create mode 100644 .gitignore delete mode 100644 .ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..513f0cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +\.ipynb_checkpoints/ diff --git a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb deleted file mode 100644 index 129fb06..0000000 --- a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb +++ /dev/null @@ -1,319 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "# Problema de Deutch e Deutch-Jozsa\n", - "\n", - "## Observação dos autores\n", - "\n", - "É fato que a melhor forma de aprender qualquer assunto técnico que envolva bastates conceitos matemáticos é fazendo. Desse modo, aconcelhamos ao leitor a refazer os cálculos e verificar as equações aqui mostradas para melhor absorção do conteúdo.\n", - "\n", - "### Cronograma\n", - "- Paralelismo Quântico\n", - "- Problema de Deutch\n", - "- Porta Hadamard para N qubits\n", - "- Problema de Deutch-Jozsa\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Paralelismo Quântico\n", - "\n", - "Uma das principais vantagens de se utilizar um computador quântico é a possibilidade de se utilizar paralelismo quântico. \n", - "Porém você deve estar se perguntando \"Paralelismo quântico\"? \"O que é isso\"?\n", - "A partir daqui você já deve saber que um bit quântico ou qubit pode assumir dois estados ao mesmo tempo, a superposição. \n", - "Você também já deve saber que sistemas com múltiplos qubits tem o poder de representar um número exponencialmente grande de estados\n", - "(só que é exponencial no número de qubits no sistema, tá ok?).\n", - "\n", - "\n", - "Seja $f$ uma função cujo mapeamento é $f:\\{0,1\\}\\mapsto \\{0,1\\}$. Como descobrir a propriedade global do mapeamento desta função aplicando-a sobre a entrada apenas uma vez? Num computador quântico este problema seria solucionado utilizando superposição. Num sistema quântico, este problema pode ser dividido em dois registradores quânticos, um para a entrada e outro como auxiliar(ou ancila), cujos propósitos você poderá ver posteriormente.\n", - " Seja $U_f$ o operador unitário que implementa $f$. Considerando a entrada e a ancila nos estados $|x\\rangle$ e $|y\\rangle$ respectivamente. A aplicação de $U_f$ no sistema ocorreria da seguinte forma: \n", - " \n", - "$$U_f |x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", - "\n", - "\n", - "Onde $\\oplus$ trata-se do ou-exclusivo(ou XOR). Sabendo disso, considerando que os registradores de entrada e ancila encontram-se nos estados $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e $|0\\rangle$. A evolução do estado do sistema ocorreria da seguinte forma:\n", - " \n", - " \n", - "$$\\begin{eqnarray}\n", - " U_f \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)|0\\rangle = U_f \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0\\rangle + |1\\rangle|0\\rangle\\right) \n", - " = \n", - " \\frac{1}{\\sqrt{2}}\\left(|0\\rangle|0 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle\\right)\n", - " \\end{eqnarray}$$\n", - " \n", - " \n", - "Onde $0 \\oplus f(x) = f(x)$. Resultando em:\n", - "\n", - "\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|0\\rangle|f(0)\\rangle + |1\\rangle|f(1)\\rangle\\right)$$\n", - "\n", - "\n", - "Ou seja, ou seja estamos tirando proveito do pararelismo quântico para avaliar $f(x)$ para ambos os valores $0$ e $1$ ao mesmo tempo!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Problema de Deutch\n", - "\n", - "Agora que temos um noção do comportamento de $U_f$ e porque utilizar paralelismo quântico então podemos seguir para a pergunta de como descobrir a proriedade global do mapeamento da função $f$ avaliando-a apenas uma vez. Neste caso a propriedade a qual queremos avaliar é se para ambos os valores $0$ e $1$ a mesma mapeia para um valor igual, ou seja $f(0)=f(1)$, ou para cada valor existe um mapeamento diferente, ou $f(0)\\neq f(1)$.\n", - "\n", - "Considerando que o registrador de entrada se encontra no estado $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ e a ancila encontra-se no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. Estes estados podem ser facilmente alcançados aplicando a porta Hadamard em qubits nos estados $|0\\rangle$ e $|1\\rangle$. No sistema o estado se encontraria da seguinte forma: \n", - "\n", - "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", - "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", - "\n", - "Aplicando $U_f$ ao sistema como fizemos na seção anterior obtemos o seguinte resultado:\n", - "\n", - "$$\\begin{eqnarray}\n", - "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", - "\\end{eqnarray}$$\n", - "\n", - "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", - "\n", - "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", - "\n", - "A partir deste ponto é necessário fazer algumas avaliações quanto a $f(x)$. Por exemplo se $f(0)=f(1)$, O estado resultante após a aplicação de $U_f$ seria da seguinte forma:\n", - "\n", - "$$\\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Semelhantemente, o estado resultate para o caso de $f(0) \\neq f(1) $ seria da seguinte forma:\n", - "\n", - "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", - "\n", - "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", - "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)-\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Onde desenvolvendo um pouco mais o resultado resultante da aplicação $H \\otimes I$ obtemos:\n", - "\n", - "$$\\pm |1\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo ao se efetuar a medição no primeiro qubit o sitema retornaria $|0\\rangle$ com probabilidade de $1$ caso $f(0) = f(1)$ e $|1\\rangle$ caso contrário. \n", - "Portanto, conseguimos descobrir a propriadade global para os mapeamentos de $f$ plicando $f$ apenas uma vez!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Porta Hadamard para N qubits\n", - "\n", - "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", - "\n", - "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", - "\n", - "\n", - "No caso da porta Hadamard não é diferente. Porém, para facilitar nossos cálculos (e consequentemente nossas vidas) é necessário achar um padrão de qual será o estado resultante caso aplicarmos Hadamard em um estado com múltiplos qubits. Considere o caso da porta Hadamard para ser aplicada em dois qubits:\n", - "\n", - "$$\\left(\\frac{1}{\\sqrt{2}} \\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) \\otimes \\left(\\frac{1}{\\sqrt{2}}\\left[\\begin{array}{cc} 1 & 1 \\\\ 1 & -1 \\end{array}\\right]\\right) = \\frac{1}{2} \\left[\\begin{array}{cccc} 1 & 1 & 1 & 1 \\\\ 1 & -1 & 1 & -1 \\\\ 1 & 1 & -1 & -1 \\\\ 1 & -1 & -1 & 1\\end{array}\\right]$$\n", - "\n", - "Pode-se observar que a linha e a coluna que corresponde a o estado $|00\\rangle$ estão todas com valores $1$ positivos, mas enquanto as outras células? Para generalizar melhor a operação de uma composição de portas Hadamard é importante introduzir algumas propriedades. Primeiramente, sabe-se que $(-1)^0 = 1$ e $(-1)^1 = -1$.\n", - "\n", - "Neste caso as células na matriz resultante da composição de portas Hadamard podem ser resultantes de $(-1)^q$ onde o expoente $q$ pode representar uma operação binária $\\langle \\cdot,\\cdot\\rangle$. A qual efetuará o produto interno módulo $2$. Por exemplo: Sejam $x = x_0x_1\\dots x_{N-1}$ e $y = y_0y_1\\dots y_{N-1}$ duas cadeias de bits. Então $\\langle x, y \\rangle = \\left(x_0\\dot y_0 + x_1\\dot y_1 \\dots x_{N-1}\\dot y_{N-1}\\right) mod 2$. \n", - "\n", - "Isso pode ser verificado na matriz resultante da composição de duas portas Hadamard. Por exemplo na última linha terceira coluna, cujas cadeias correspondentes são $11$ e $10$. Então $\\langle 11, 10 \\rangle = \\left( 1 \\dot 1 + 1 \\dot 0 \\right) mod 2 = 1 $. Portanto $(-1)^{\\langle 11, 10 \\rangle} = -1$.\n", - "\n", - "Toda vez que adicionarmos mais uma porta Hadamard estaremos multiplicando o coeficiente da matriz por $\\frac{1}{\\sqrt{2}}$. Sabendo disso podemos desenvolver uma fórmula geral para as combinações de $n$ portas Hadamard:\n", - "\n", - "$$H^{\\otimes N}\\left[i,j\\right] = \\frac{1}{\\sqrt{2^N}}(-1)^{\\langle i, j \\rangle}$$\n", - "\n", - "Onde $i$ e $j$ representam as strings binárias correspondentes da célula na linha $i$ e coluna $j$ na matriz $H^{\\otimes N}$." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Problema de Deutch Jozsa\n", - "\n", - "o algoritmo de Deutch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Pra o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", - "\n", - "\n", - "Porém, antes de seguir com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancila nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim a evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = U_f \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\rangle - |x\\rangle|1\\rangle\\right) = \\frac{1}{\\sqrt{2}}\\left(|x\\rangle|0\\oplus f(x)\\rangle - |x\\rangle|1\\oplus f(x)\\rangle\\right)$$\n", - "\n", - "Desenvolvendo o último termo da igaldade ficamos com:\n", - "$$\\frac{1}{\\sqrt{2}}\\left(|x\\rangle|f(x)\\rangle - |x\\rangle|\\tilde{f}(x)\\rangle\\right) = |x\\rangle \\left(\\frac{|f(x)\\rangle - |\\tilde{f}(x)\\rangle}{\\sqrt{2}}\\right) $$\n", - "\n", - "Desse modo temos que se $f(x) = 0$:\n", - "$$ |x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "E se $f(x) = 1$ temos:\n", - "$$ -|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Portanto, podemos concluir que:\n", - "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Aplicando o operador $U_f$ no estado, o resultado fica da seguinte forma:\n", - "$$U_f \\left[\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\sum_{x \\in \\{0,1\\}^N } \\frac{(-1)^{f(x)}}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "O fator $\\frac{1}{\\sqrt{2^N}}$ pode ser colocado na parte mais externa e mais a esquerda do somatório sem perda de generalização. Portanto o estado ficaria como a seguir:\n", - "\n", - "$$ \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", - "\n", - "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", - "\n", - "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "Anteriormente foi explicada a generalização de um conjunto de portas Hadamard sendo aplicadas a $N$ qubits. Sabendo que $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$ é a superposição de todos os estados possíveis de $N$ qubits. Ao aplicar $H^{\\otimes N}$ novamente é como se estivéssemos as células de cada linha da matriz $H^{\\otimes N}$ e estivessemos fazendo um novo somatório com cada uma delas. Desenvolvendo o segundo termo da igualdade, o estado ficaria da seguinte forma:\n", - "\n", - "$$\\frac{1}{2^N}\\sum_{x \\in \\{0,1\\}^N }\\sum_{z \\in \\{0,1\\}^N}(-1)^{\\langle x,z\\rangle + f(x)} |z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", - "\n", - "A partir daqui, é preciso fazer algumas observações. Primeiramente, é possível ver que a amplitude do sistema para $z = 0$ é :\n", - "$$\\frac{1}{2^N} \\sum_{x \\in \\{0,1\\}^{N}} (-1)^{f(x)}$$\n", - "Tendo isso em mente, se a função for constante, o registrador de entrada retornará $|0\\rangle$ com probabilidade $1$. Enquanto que se a função for balanceada, a metade negativa do somatório anulará a metade positiva. Isso significa que o sistema retornará $|0\\rangle$ se a função for constante e qualquer outro estado caso contrário. Desse modo nós conseguimos determinar se uma função é constante ou balanceada aplicando-a no sistema apenas uma vez!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exemplo prático\n", - "\n", - "Agora nós vamos fazer um exemplo prático do algoritmo considerando a seguinte função, onde:\n", - "\n", - "f(0) = 0; f(1)=1;\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Incializando os nossos qubits\n", - "\n", - "Inicializaremos o qubit de entrada da função e o auxiliar (ancilla):\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "from qiskit import QuantumRegister, ClassicalRegister\n", - "from qiskit import QuantumCircuit, Aer, execute\n", - "from qiskit.tools.visualization import plot_histogram\n", - "\n", - "q = QuantumRegister(2)\n", - "c = ClassicalRegister(2)\n", - "qc = QuantumCircuit(q, c)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Depois disso iniciaremos a construção do circuito com um Hadamard no primeiro\n", - "e segundo qubits e depois o portão c-not que é uma representação para a nossa função." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.h(q[0])\n", - "qc.h(q[1])\n", - "\n", - "qc.cx(q[0], q[1])\n", - "\n", - "qc.h(q[0])\n", - "\n", - "qc.measure(q[0], c[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "backend = Aer.get_backend('qasm_simulator')\n", - "job_sim = execute(qc, backend)\n", - "sim_result = job_sim.result()\n", - "\n", - "counts = sim_result.get_counts(qc)\n", - "plot_histogram(counts, title='Deutsch-Jozsa State')\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "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.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/deutsch_jozsa.ipynb b/deutsch_jozsa.ipynb index 5dbe9f4..11589e7 100644 --- a/deutsch_jozsa.ipynb +++ b/deutsch_jozsa.ipynb @@ -48,7 +48,7 @@ "\n", " Nossa função pode ser vista como uma transformação linear que leva os qubits do estado $|x\\rangle|y\\rangle$ para o estado $|x\\rangle|y \\oplus f(x) \\rangle$, onde os estados $|x\\rangle$ e $|y\\rangle$ são a entrada e a ancilla respectivamente e $\\oplus$ trata-se do ou-exclusivo (ou XOR). \n", " \n", - " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operator quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", + " Nós podemos representar nossa transformação linear por sua respectiva matriz de transformação e dessa forma obtermos um operador quântico válido, considerando que essa matriz é unitária. Logo de forma geral a aplicação da função terá o seguinte comportamento: \n", "\n", "$$U_f|x\\rangle|y\\rangle = |x\\rangle|y \\oplus f(x) \\rangle$$\n", " \n", @@ -121,11 +121,11 @@ "\n", "$$\\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right) \\otimes \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuido os termos segundo a propriedade de produto tensorial, obtemos:\n", + "Onde $\\otimes$ trata-se da operação de produto tensorial. Em muitos trabalhos é comum omitir $\\otimes$ para um conjunto de qubits, pois já se sabe que a composição de múltiplos qubits no sistema vem da operação de produto tensorial. Portanto em nosso casso o $\\otimes$ será omitido também. Distribuído os termos segundo a propriedade de produto tensorial, obtemos:\n", "\n", "$$\\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)$$\n", "\n", - "Nós incializamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n" + "Nós incialisamos dois qubits um para a nossa entrada e outro para ser nosso ancilla.\n" ] }, { @@ -141,7 +141,7 @@ "U_f\\left[ \\frac{1}{2}\\left(|0\\rangle|0\\rangle - |0\\rangle|1\\rangle + |1\\rangle|0\\rangle - |1\\rangle|1\\rangle \\right)\\right] = \\frac{1}{2}\\left(|0\\rangle|0\\oplus f(0)\\rangle - |0\\rangle|1 \\oplus f(0)\\rangle + |1\\rangle|0 \\oplus f(1)\\rangle - |1\\rangle|1 \\oplus f(1)\\rangle \\right)\n", "\\end{eqnarray}$$\n", "\n", - "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", + "Sabendo que ao calcular $1\\oplus f(x)$, no caso do problema de Deutsch, nós na verdade estamos calculando a negação de $f$ então o estado resultante da aplicação de $U_f$ será da seguinte forma: \n", "\n", "$$\\frac{1}{2}\\left(|0\\rangle|f(0)\\rangle - |0\\rangle|\\tilde{f}(0)\\rangle + |1\\rangle|f(1)\\rangle - |1\\rangle|\\tilde{f}(1)\\rangle \\right)$$\n", "\n", @@ -153,7 +153,7 @@ "\n", "$$\\pm \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "A partir daqui a solução proposta por Deutch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", + "A partir daqui a solução proposta por Deutsch faz uso de interferência quântica para verificar as propriedades de mapeamento de $f$. Explicando de maneira simplificada, ao se utilizar interferência quântica estaremos construindo uma superposição em que haverão amplitudes de probabilidades que se cancelam no somatório, de modo que sobre os estados que nos interessam para se obter informações que desejamos após a medição.\n", "\n", "\n" ] @@ -165,11 +165,11 @@ "#### 4º Passo:\n", "\n", "\n", - "No algoritmo de Deutch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", + "No algoritmo de Deutsch isso é feito aplicando uma porta Hadamard no registrador de entrada. Faremos avaliações para os casos em que $f(0)=f(1)$ e $f(0)\\neq f(1)$. Para o caso onde $f(0)=f(1)$ a evolução do sistema ficaria da seguinte forma:\n", "\n", "$$H \\otimes I\\left[ \\pm \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2}}\\left( \\left(\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}\\right)+\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) \\right)\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvedo o resultado da aplicação obtem-se o seguinte estado:\n", + "Onde a aplicação $H \\otimes I$ significa que aplica-se a porta Hadamard no registrador de entrada enquanto que a ancila permanece inalterada. Desenvolvendo o resultado da aplicação obtêm-se o seguinte estado:\n", "$$\\pm |0\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) $$\n", "\n", "Similarmente para o caso onde $f(0)\\neq f(1)$ a evolução do sistema ficaria da seguinte forma:\n", @@ -192,7 +192,7 @@ "source": [ "## Porta Hadamard para N qubits\n", "\n", - "Antes de prosseguir para o algoritmo de Deutch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", + "Antes de prosseguir para o algoritmo de Deutsch-Jozsa é necessário verificar o caso da porta Hadamard para $N$ qubits. Você já deve saber que para se aplicar uma mesma porta em múltiplos qubits faz-se o uso de produto tensorial. Por exemplo, Seja $M$ operador unitário qualquer $2 \\times 2$ e deseja-se aplicá-lo a todos os qubits no estado $|0\\rangle|1\\rangle|1\\rangle$. Então a aplicação de $M$ seria da seguinte forma:\n", "\n", "$$M\\otimes M \\otimes M \\left(|0\\rangle|1\\rangle|1\\rangle\\right)$$\n", "\n", @@ -220,7 +220,7 @@ "source": [ "## Problema de Deutsch Jozsa\n", "\n", - "O algoritmo de Deutsch-Jozsa é uma extensão do algoritmo que apresentado por Deutch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Para o algoritmo de Deutch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", + "O algoritmo de Deutsch-Jozsa é uma extensão do algoritmo que apresentado por Deutsch, porém considerando entradas de múltiplos qubits. Seja uma função tal que $f : \\{0,1\\}^N \\mapsto \\{0,1\\}$. A função $f$ é considerada constante se para toda entrada $x$ a mesma para um único valor do contra domínio. Em contrapartida, a mesma é considerada balanceada se para exatamente metade dos valores $x$ , $f$ mapeia para $0$ enquanto que a outra metade é mapeada para $1$. Num computador clássico, para verificar se $f$ é constante ou balanceada, seria necessário avaliar $f$ para no mínimo $\\frac{2^{N}}{2} + 1 = 2^{N-1}+1$ valores. Para o algoritmo de Deutsch-Jozsa, é possível fazer esta verificação avaliando $f$ apenas uma vez. Fazendo uso de paralelismo quântico e interferência quântica.\n", "\n", "\n", "Porém, antes de seguirmos com a explanação do algoritmo vale a pena verificar o que a contece caso apliquemos o operador $U_f$ para uma entrada $x$ com $N$ qubits. Sejam os registradores de entrada e a ancilla nos estados $|x\\rangle$ e $\\frac{|0\\rangle + |1\\rangle}{\\sqrt{2}}$ respectivamente. Sendo assim, a evolução do sistema ficaria da seguinte forma:\n", @@ -239,7 +239,7 @@ "Portanto, podemos concluir que:\n", "$$U_f|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right) = (-1)^{f(x)}|x\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", - "Feitas nossas observações podemos continuar para o algorítmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teriamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", + "Feitas nossas observações podemos continuar para o algoritmo. Primeiramente consideramos um estado com $N$ qubits setados em zero sobre os quais fora aplicada uma porta Hadamard $H^{\\otimes N}$. Dessa forma teríamos um estado em superposição: $\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle$. Considerando a ancila no estado $\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}$. O estado inicial do sistema ficaria da seguinte forma:\n", "\n", "$$\\sum_{x \\in \\{0,1\\}^N } \\frac{1}{\\sqrt{2^N}}|x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", @@ -252,7 +252,7 @@ "\n", "A etapa que faz uso de interferência quântica exigirá um pouco mais de intuição matemática do leitor. Uma dica para facilitar a compreensão é fazer o passo a passo do algoritmo para um caso reduzido. Como por exemplo a entrada $x$ com tamanho igual a $2$.\n", "\n", - "A única diferença desta etapa para com a do algorítmo de Deutch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", + "A única diferença desta etapa para com a do algorítmo de Deutsch é que a porta a ser aplicada no registrador da entrada é uma composição de portas Hadamard $H^{\\otimes N}$ para serem aplicadas sobre $N$ qubits. A evolução do sistema ficaria da seguinte forma:\n", "\n", "$$\\left(H^{\\otimes N} \\otimes I\\right)\\left[\\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} |x\\rangle\\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)\\right] = \\frac{1}{\\sqrt{2^N}}\\sum_{x \\in \\{0,1\\}^N }(-1)^{f(x)} \\sum_{z \\in \\{0,1\\}^N} \\frac{(-1)^{\\langle x,z\\rangle}}{\\sqrt{2^N}}|z\\rangle \\left(\\frac{|0\\rangle - |1\\rangle}{\\sqrt{2}}\\right)$$\n", "\n", @@ -525,21 +525,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.14" + "pygments_lexer": "ipython3", + "version": "3.6.8" } }, "nbformat": 4,