diff --git a/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb new file mode 100644 index 0000000..24c9eeb --- /dev/null +++ b/.ipynb_checkpoints/deutsch_jozsa-checkpoint.ipynb @@ -0,0 +1,408 @@ +{ + "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": "iVBORw0KGgoAAAANSUhEUgAAAc0AAAFKCAYAAAB/8AR9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAe8ElEQVR4nO3de5ReVX3/8ffXIJIUCCQEk4nGJiI4RTqEBCwIGCCxFS9V/BWCWi6KFBQUEStYWsVW2l+KID+tRahdCFhAaK23UCAkP0FALiHQQGxKEJJCLkguihFMgG//OGfwyWQu+wmTmYfM+7XWs+Y5++yzzz4zK/msfS77RGYiSZL69orB7oAkSS8XhqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlF7mIiIjYo/B7oc0FBiaUg8i4rGIeCYino6IdRFxR0ScEhH98u8mIi6PiL/pj7aa3O9jETF9oPfbnYj4cET8V/07XhURP4yInep1Tf1+IuKEiPjx1uutZGhKfXlXZu4EvA74O+AzwDcGt0vbhoh4K3A+cGz9O24Hvj24vZJ6Z2hKBTLzF5n5PeAY4PiIeBNARLwqIi6IiGX1SOmSiBher9ts5NN5KjUiTgY+APx5RPwqIr5fr/9MRDxRj7wWR8QRdfmwiPhsRDxSr5sfEa9taHp6RDwcEWsj4h8iIkqOKyJeERHnRsTSiHgyIq6IiJH1uq/Wfev8PBcRn++jnwdExJ31yHxF3cb2Pex+f+DOzFxQ/47XZOY3M/PpXn4/Zzf8DhZFxHvr8nbgEuDAuv66vv4+0pYwNKUmZObdwOPAIXXR/wX2BPYF9gDGA39V0M6lwLeAWZm5Y2a+KyL2Ak4D9q9HXn8IPFZvciZwLHAksDPwIeDXDU2+kyqEOoCj621LnFB/DgMmATsCX637eFrdtx2Bg4G1wHf76OfzwCeB3YADgSOAj/aw77uAP4yI8yLiLRHxqt5+P/WqR6h+9yOB84CrImJcZv4UOIUqhHfMzF3q+lv095F6YmhKzVsOjKpHcx8BPlmPkp6mOt04cwvbfR54FfB7EfHKzHwsMx+p150EnJuZi7PyQGaubtj27zJzXWYuA+ZRhUSJDwAXZubPMvNXwDnAzIjYrrNCRIwB/h04vR4V9tjPzJyfmT/JzOcy8zHg68Bbu9txZt4GHAXsB/wQWB0RF0bEsJ46m5nXZebyzHwhM68FHgYO6K7uVvj7SIamtAXGA2uAMcAIYH59OnId8B91edMycwlwBvB54MmIuCYi2urVr6UaZfVkZcP3X1ONGImIhxpOrx7SzXZtwNKG5aXAdsCr6+1fCVwP/EtmXtNXPyNiz4j4QUSsjIhfUoXUbr0c8w31KHIU8MdUo96TeqofEcdFxP0Nv+839dJ+v/59JDA0paZExP5Uoflj4CngGWDvzNyl/oysT2cCrKf6T7tz27FdmtvsFUOZ+S+ZeTDVjUdJdXoR4H+A1zfb38zcu/MUaz2y62p5va9OE4DngFX18leAp4FzC/v5j8B/AW/IzJ2BzwJ9Xl+tR463AHOpghC6/H4i4nXAZVSnhkfXp2AfbGi/6++zr7+P1DRDUyoQETtHxDuBa4CrMnNhZr5A9Z/4RRGxe11vfER0Xk98ANg7IvaNiB2oRmaNVlFdR+zcx14RcXh9be9Zqv/wn69X/xPw1xHxhqj8fkSM7odDuxr4ZERMjIgdqUaG12bmcxHxZ1SnVt9fH2tJP3cCfgn8KiLeCJza044j4o8jYmZE7Fof0wH1/n5SV9nk9wP8DlUw/rze/kR+G7Cd9V/TeeNRwd9HapqhKfXu+xHxNNVI7y+AC4ETG9Z/BlgC/KQ+HTkH2AsgM/8b+EJd9jDV6LTRN6iuC66LiH+nuk74d1QjpJXA7lQjNer9fhu4iSqUvgG8lLtAO0dl/wxcCdwKPEoVgqfX646lCq3lDad4P9tHP88C3k81Or0MuLaXPqyluub4cH1MVwF/n5nfqtdv8vvJzEXAl4A7qQJyH+D2hvbmAg8BKyPiqbqsx7+PtCXCl1BLQ0tErAEOz8z7B7sv0suNI01pCImIGcAwqtGdpCZt13cVSduCiLgGeDPwkcxcP9j9kV6OPD0rSVIhT89KklTI0JQkqdCQvqY5evTonDBhwmB3Q5LUQu6///6nMrPbmaOGdGhOmDCBuXPnDnY3JEktZNSoUUt7WufpWUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNT2gaddtpp7Lnnnhx00EHdrs9Mzj77bKZMmcLBBx/MAw888OK6q6++mqlTpzJ16lSuvvrqF8vvv/9+3vKWtzBlyhTOPvtsMnOrH4fUagxNaRv0/ve/n+uuu67H9XPmzOGRRx7h3nvv5aKLLuJTn/oUAGvXrmXWrFncfPPNzJkzh1mzZrFu3ToAzjrrLC666CLuvfdeHnnkEebMmTMgxyK1EkNT2gYddNBB7Lrrrj2unz17NjNnziQi2H///fnlL3/JypUrmTt3LtOmTWPXXXdll112Ydq0adxyyy2sXLmSp59+mgMOOICIYObMmcyePXsAj0hqDYamNAStWLGC8ePHv7jc1tbGihUrWL58+Wbly5cvZ8WKFbS1tW1WXxpqDE1pCOruemRENF0uDTWGpjQEtbW18cQTT7y4vHz5csaOHcv48eM3Kx83btyLI86u9aWhxtCUhqC3v/3tXHPNNWQm99xzDzvvvDNjx47l8MMPZ968eaxbt45169Yxb948Dj/8cMaOHcuOO+7IPffcQ2ZyzTXXcOSRRw72YUgDbrvB7oCk/nfSSSdx++23s3r1avbee2/OPvtsnnvuOQBOPPFEZsyYwc0338yUKVMYPnw4X/3qVwHYddddOeusszjiiCMA+PSnP/3iDUUXXHABH/vYx3j22WeZPn0606dPH5yDkwZRDOVnrSZPnpxz584d7G5IklrIqFGj5mfm1O7WeXpWkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVKhAQ3NiDg0Ir4XEU9EREbECQXb7BMRP4qIZ+rt/iq6zBQdEe+LiEUR8Zv653u32kFIkoasgR5p7gg8CHwCeKavyhGxM3AzsArYH/g48GngzIY6BwLXAt8C9q1/XhcRb+7vzkuShrYBnXs2M2cDswEi4vKCTT4AjACOz8xngAcjoh04MyIuzGoOwDOAeZn5xXqbL0bEYXX5sf19DJKkoavVr2keCNxWB2anG4E24Hcb6tzUZbsbgYO2eu8kSUNKq7/lZCzweJeyVQ3rHq1/ruqmTrcv+4uIk4GTAcaNG8d9990HVO8XHDFiBEuWLAFg5MiRTJo0iQULFgAwbNgwOjo6WLx4MevXrwegvb2dNWvWcPGcN72kg5QkvXSfeecSli5dCsCYMWMYM2YMixYtAmD48OG0t7ezcOFCNm7cCEBHRwfLli1j7dq1AEyaNIkNGzb0uo9WD02Arq9hiW7Ku6vT7etbMvNS4FKo3nKy3377bbK+r+W99tprk+Xx48f31G9J0gAaPXo0o0eP3qSs6//h++yzzybLEydOZOLEicX7aPXTsyvZfMS4e/1zVR91uo4+JUl6SVo9NO8EDomIHRrKZgDLgcca6szost0M4I6t3jtJ0pAy0M9p7hgR+0bEvvW+J9TLE+r1fxsRtzRs8i/Ar4HLI+JNEXEUcDbQeecswMXA4RFxTkS8MSLOAQ4DvjxgByZJGhIGeqQ5FVhQf4YD59Xfv1CvHwe8vrNyZv6CatTYBtwL/APwJeDChjp3ADOB44H/BI4DjsnMu7bysUiShpiBfk7z//PbG3m6W39CN2ULgUP7aPd64PqX2D1JknrV6tc0JUlqGYamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBVqKjQj4uiIeFvD8l9FxOMRcWNEjOv/7kmS1DqaHWl+vvNLROwHfBb4f8ArgS/1X7ckSWo9zYbm64DF9ff3Av+embOAM4EjShqIiI9GxKMR8WxEzI+IQ3qpe3lEZDef9Q11pvVQ541NHpskSb1qNjSfBXaqvx8BzKm//6KhvEcRcQxwMXA+MBm4A7ghIib0sMkngHFdPj8Dvt1N3b271Hu478ORJKncdk3Wvw34UkT8GJgK/J+6fE/gfwq2PxO4PDMvq5dPj4g/Ak4FzulaOTN/QRXIAETEW4BJwJ920/aTmflU6YFIktSsZkeapwEbqMLylMxcXpe/Hbixtw0jYntgCnBTl1U3AQcV7v8jwEOZeUc36+6NiBURcUtEHFbYniRJxZoaaWbm48C7uik/o2Dz3YBhwKou5auA6X1tHBEjgT+huvmo0Qqqkeo9wPZUo9BbImJaZt7aTTsnAycDjBs3jvvuuw+AtrY2RowYwZIlSwAYOXIkkyZNYsGCBQAMGzaMjo4OFi9ezPr11SXV9vZ21qxZA+za99FLkraq1atXs3TpUgDGjBnDmDFjWLRoEQDDhw+nvb2dhQsXsnHjRgA6OjpYtmwZa9euBWDSpEls2LCh131EZjbVqYjYAXgn8Hrg65m5LiJeD6zNzDW9bNcGPAEcmpm3NZR/Djg2M3u9cSciPkZ1h25bb/up684GnsvMd/dWb/LkyTl37tzeqhT5828ampI02GYdv7Zf2hk1atT8zJza3bqmRpoRsQfVzT87ArsA1wHrqEZ6uwAn9bL5U8DzwNgu5buz+eizOx8B/rWvwKzdBcwsqCdJUrFmr2l+meoa5KuBZxrKvwf0eh0xMzcA84EZXVbNoLqLtkcR8WagA7ist3oN9qU6bStJUr9p9u7Zg4A/yMznI6KxfBnQVrD9hcCVEXE3cDtwSr3dJQARcQVAZh7XZbuPUD1C8qOuDUbEGcBjwENU1zQ/CLwHeF/pQUmSVKLZ0IRq9p+uJtDwaEhPMvPaiBgNnEv1LOWDwJGZubShnU1ExE5Up1q/kN1fgN0euAAYTzX6fQh4R2bOLjgWSZKKNRuaN1E9a/nhejkjYmfgPOCHJQ1k5teAr/Wwblo3ZU9TXUPtqb1ZwKySfUuS9FI0G5pnAvMiYjGwA3AtsAfVjTxH93PfJElqKc0+p7k8IvYFjgX2o7qR6FLgW5n5TK8bS5L0Mtf0Nc06HP+5/kiSNGT0GZoRcRTw/czcWH/vUWb+W7/1TJKkFlMy0ryeakKCJ+vvPUmqafIkSdom9RmamfmK7r5LkjTUNBWCEXFoRGwWtBExLCIO7b9uSZLUepodOc4DRnVTvku9TpKkbVazoRlU1y67Gg2sf+ndkSSpdRU9chIR36u/JnBVRPymYfUw4E30Mem6JEkvd6XPaa6ufwawlk3fcLIB+DHlbyCRJOllqSg0M/NEgIh4DLggMz0VK0kacpqdRu+8rdURSZJaXcmMQP8JvDUz10bEQrq/EQiAzPz9/uycJEmtpGSk+a9A540/vc0IJEnSNq1kRqDzuvsuSdJQ47R4kiQVKrmm2et1zEZe05QkbctK33IiSdKQ19Q1TUmShjKvaUqSVMjnNCVJKuRzmpIkFfI5TUmSCjU192yniHg90F4v/jQzH+m/LkmS1JqaCs2IGA18A3g38MJvi+MHwIcyc3WPG0uS9DLX7N2z/wTsARwC7FB/DgUm4vs0JUnbuGZPz/4hcERm3tlQdntE/Bkwp/+6JUlS62l2pPlzoLsXUP8a8NSsJGmb1mxofgH4ckSM7yyov3+pXidJ0jZrSyZsnwg8FhFP1MvjgWeB3amueUqStE1ywnZJkgo5YbskSYWcsF2SpEJNhWZEbB8R50XEf0fEsxHxfONna3VSkqRW0OxI86+B46nuln0B+DTwD1SPm3y0f7smSVJraTY0jwZOycyvA88D383MjwOfA2b0d+ckSWolzYbmq4FF9fdfAbvU3/8DeFt/dUqSpFbUbGguA9rq70uoptUDOBB4pr86JUlSK2o2NL8DHFF/vxg4LyIeBS7HiQ0kSdu4piZsz8xzGr5fHxGPAwcB/52ZP+jvzkmS1Eq26CXUnTLzJ8BP+qkvkiS1tKYnN4iI/SLiioi4t/5cGRH7bY3OSZLUSpqd3OADwD3AOGB2/Xk1cHdEfLD/uydJUuto9vTsF4G/zMzzGwsj4hzgb4Cr+qtjkiS1mmZPz44Bvt1N+XVUrwbrU0R8NCIerafhmx8Rh/RSd1pEZDefN3ap976IWBQRv6l/vrepo5IkqUCzoTkPmNZN+TTgR31tHBHHUD2qcj4wGbgDuCEiJvSx6d5Up4Q7Pw83tHkgcC3wLWDf+ud1EfHmvvojSVIzSl5CfVTD4g3A30bEVH571+wfAEcBny/Y35nA5Zl5Wb18ekT8EXAqcE7Pm/FkZj7Vw7ozgHmZ+cV6+YsRcVhdfmxBnyRJKrKlL6E+uf40+grwtZ4aiYjtgSnABV1W3UT1rGdv7o2IV1FN4fc3mTmvYd2B9b4b3Qic1kebkiQ1peQl1P31zs3dgGHAqi7lq4DpPWyzgmoUeg+wPfCnwC0RMS0zb63rjO2hzbHdNRgRLwb+uHHjuO+++wBoa2tjxIgRLFmyBICRI0cyadIkFixYAMCwYcPo6Ohg8eLFrF+/HoD29nbWrFkD7Nr30UuStqrVq1ezdOlSAMaMGcOYMWNYtKiaLn348OG0t7ezcOFCNm7cCEBHRwfLli1j7dq1AEyaNIkNGzb0uo+XNLnBFsouy9FNWVUxczGwuKHozoj4XeAs4NbGqk20eSlwKcDkyZNzv/02fcS0r+W99tprk+Xx48d3txtJ0gAbPXo0o0eP3qSs6//h++yzzybLEydOZOLEicX72JLJDd4REbdGxFMR8fOI+FFEHFmw6VNUrxPrOgLcnc1Hir25C3hDw/LKfmhTkqQ+NTu5wUlUk7Y/AnwGOBt4FPhORHyot20zcwMwn83fuzmD6i7aUvtSnbbtdGc/tClJUp+aPT37GeDMzPxqQ9k3ImI+VYD+cx/bXwhcGRF3A7cDp1C9auwSgIi4AiAzj6uXzwAeAx6iuqb5QeA9wPsa2rwYuLWeYOE7wHuBw4CDmzw2SZJ61WxoTqB64XRXN7D5XbGbycxrI2I0cC7V85YPAkdm5tKG9httX7c7nup9nQ8B78jM2Q1t3hERM6lmJDqPahR8TGbe1cyBSZLUl2ZDcxnVqc8lXcrfBizdvPrmMvNr9PBoSmZO67I8C5hV0Ob1dP9ojCRJ/abZ0LwA+Er9VpM7qO5QPZjqUZDT+7lvkiS1lGZfQv31iHgS+BTVLEAAPwWOzszv9nfnJElqJcWhGRHbUZ2GvTUzv7P1uiRJUmsqfuQkM58D/g3Yaet1R5Kk1tXs5AYPAHtsjY5IktTqmg3NzwNfioj3RMRrI2JU42cr9E+SpJbR7N2zP6x//hubzu3aOdfrsP7olCRJrajZ0Dxsq/RCkqSXgaLQjIgRwN9TTWH3SmAO8PFeXgwtSdI2p/Sa5nnACVSnZ6+mmhXoH7dSnyRJakmlp2ePAj6cmdcARMS3gNsjYlhmPr/VeidJUgspHWm+FritcyEz7waeo3pDiSRJQ0JpaA4DNnQpe47mbySSJOllqzT0ArgqIn7TULYDcFlE/LqzIDPf3Z+dkySplZSG5je7KbuqPzsiSVKrKwrNzDxxa3dEkqRW1+w0epIkDVmGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUaMBDMyI+GhGPRsSzETE/Ig7ppe5REXFTRPw8Ip6OiLsi4t1d6pwQEdnNZ4etfzSSpKFkQEMzIo4BLgbOByYDdwA3RMSEHjZ5KzAXeEddfzbwnW6C9tfAuMZPZj7b/0cgSRrKthvg/Z0JXJ6Zl9XLp0fEHwGnAud0rZyZn+hSdF5EvAN4D3DbplVz5dbosCRJnQZspBkR2wNTgJu6rLoJOKiJpnYC1nYpGx4RSyPi8Yj4QURMfgldlSSpWwM50twNGAas6lK+Cphe0kBEfAx4DXBlQ/Fi4EPAA1SB+gng9ojoyMyHu2njZOBkgHHjxnHfffcB0NbWxogRI1iyZAkAI0eOZNKkSSxYsACAYcOG0dHRweLFi1m/fj0A7e3trFmzBti1pPuSpK1o9erVLF26FIAxY8YwZswYFi1aBMDw4cNpb29n4cKFbNy4EYCOjg6WLVvG2rXVOGzSpEls2LCh131EZm7FQ2jYUUQb8ARwaGbe1lD+OeDYzHxjH9u/jyosZ2bm93qpNwy4H5iXmR/vrc3Jkyfn3LlzmziK7v35Nw1NSRpss47vehJyy4waNWp+Zk7tbt1A3gj0FPA8MLZL+e5sPvrcRENgHtdbYAJk5vPAvcAbtryrkiRtbsBCMzM3APOBGV1WzaC6i7ZbEXE0cBVwQmZe39d+IiKA3wdWbHlvJUna3EDfPXshcGVE3A3cDpwCtAGXAETEFQCZeVy9PJNqhHkWcGtEdI5SN2TmmrrO54CfAA8DOwMfpwrNUwfomCRJQ8SAhmZmXhsRo4FzqZ6nfBA4MjOX1lW6Pq95ClUfv1x/Ov0ImFZ/3wW4lOq07y+ABVTXTe/eGscgSRq6BnqkSWZ+DfhaD+um9bbcwzafBD7ZH32TJKk3zj0rSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSpkaEqSVMjQlCSpkKEpSVIhQ1OSpEKGpiRJhQxNSZIKGZqSJBUyNCVJKmRoSpJUyNCUJKmQoSlJUiFDU5KkQoamJEmFDE1JkgoZmpIkFTI0JUkqZGhKklTI0JQkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVGvDQjIiPRsSjEfFsRMyPiEP6qP/Wut6zEfGziDjlpbYpSdKWGNDQjIhjgIuB84HJwB3ADRExoYf6E4HZdb3JwN8CX4mI921pm5IkbamBHmmeCVyemZdl5k8z83RgBXBqD/VPAZZn5ul1/cuAbwJnvYQ2JUnaIgMWmhGxPTAFuKnLqpuAg3rY7MBu6t8ITI2IV25hm5IkbZGBHGnuBgwDVnUpXwWM7WGbsT3U365ub0valCRpi2w3CPvMLsvRTVlf9TvLo5c63bYZEScDJ9eLvxo1atTiXnsrDR27AU8NdiekLfVPn+y3pl7X04qBDM2ngOfZfAS4O5uPFDut7KH+c8BqqnBsqs3MvBS4tLjX0hAREfdm5tTB7ofUygbs9GxmbgDmAzO6rJpBdcdrd+4EpndT/97M3LiFbUqStEUG+vTshcCVEXE3cDvV3bFtwCUAEXEFQGYeV9e/BDgtIr4MfB14C3ACcGxpm5Ik9ZcBDc3MvDYiRgPnAuOAB4EjM3NpXWVCl/qPRsSRwEVUj5AsBz6emf/aRJuSynjZQupDZPZ2D44kSerk3LOSJBUyNCVJKmRoSpJUyNCUJKnQYMwIJKkFRMRrgD2oJgl5AVicmSsHt1dSa/PuWWkIiohTgQ8BHcB6YAnwONWEIt/NzMUR8YrMfGEQuym1HE/PSkNM/Vzz+cB3qZ5tPpDqlXsvAMdTvbP29zLzhYiInluShh5HmtIQExGnAx/MzDd3s+5gqpe9jwcOyEwncJcaONKUhp4NwE4R8SaAiHhV/W5aMvPHwAeAZ4G3DV4XpdZkaEpDz/VUp2LPiIidMvM3mbkhIl4BkJnLgHXAawazk1IrMjSlIaS+RrmGaq7mGcDyiPhGREyp10+IiA8C+wDfHryeSq3Ja5rSEBQRu1C9IOEg4L1UbxCC6h22rwCuyMzPD07vpNZlaEpDRETsDvwp8Cmql8I/Q3Ua9jbgLuCVwOuBG4GH0/8cpM0YmtIQERGXA3sD36c6RTuK6jTsnsCTwLmZedegdVB6GTA0pSGgvpb5NNW7Zm9tKJsA/AHwYWAScHRm3jdoHZVanDcCSUPD7wGPUj1uAkBWlmbmtcC7qE7V/skg9U96WTA0paHhZ1SnYC+KiDd0Pl7SKTN/QzUr0NsHo3PSy4WhKQ0BmfkM8BfAcOAK4LiIeG1E/A5ARIwA3go8OHi9lFqf1zSlIaSeBegvgXdTTdR+J/BzYDqwAjgpMxcOXg+l1mZoSkNQ/fjJO4D3UE2Z9yBwXWb+16B2TGpxhqY0xPkKMKmcoSlJUiFvBJIkqZChKUlSIUNTkqRChqYkSYUMTUmSChmakiQVMjQlSSr0v7mh0TrgQezZAAAAAElFTkSuQmCC\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 new file mode 100755 index 0000000..25abc74 --- /dev/null +++ b/.ipynb_checkpoints/grover-checkpoint.ipynb @@ -0,0 +1,749 @@ +{ + "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 +} 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, diff --git a/grover.ipynb b/grover.ipynb index e69de29..25abc74 100644 --- a/grover.ipynb +++ b/grover.ipynb @@ -0,0 +1,749 @@ +{ + "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 +} 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": "iVBORw0KGgoAAAANSUhEUgAAAa4AAAEGCAYAAAA9unEZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3X1UVHX+B/A3DIomMwwKYYlAUFSLIARoaApZOpYgJlG6poIR5bqmi7mw5RZrZoN1Eq3YDRVxF620VEA9WD7mmhBHRMLTE/Ik5hPEMD6iztzfHy7zcwJhRmbmcvH9OueeM9z7vffzAS68uU+DnSAIAoiIiCTCXuwGiIiIzMHgIiIiSWFwERGRpDC4iIhIUhhcREQkKQwuIiKSFAYXERFJCoOLiIgkhcFFRESSwuAiIiJJYXAREZGkMLiIiEhSGFxERCQpDC4iIpIUBhcREUkKg4uIiCSFwUVERJLC4CIiIklhcBERkaQwuIiISFIYXEREJCkMLiIikhQGFxERSQqDi4iIJIXBRUREksLgIiIiSWFwERGRpDC4iIhIUhhcREQkKQwuIiKSFAexGyAisqb58+ejrKxMlNpBQUHIyMi4rXXF6rsrPdsKj7iIqEcrKysTJQC6WleMvsX6WpmLR1xE1OMFBQVh3759Nq0ZGRnZ5W3Yum9L9GwLPOIiIiJJYXAREZGkMLiIiEhSGFxERCQpDC4iIpIUBhcR0R3q4sWLYrdwWxhcREQSd+TIEfz973/HU089hfvvvx9eXl4ICAjA9OnTkZmZid9++63NOj/99BMefPBBfP755yJ03DV3bHDl5OSY/cxCSEgIvvrqK+s0RGSC77//HmvWrEF2djZ++eUXsdshkX377bcIDw/HI488gnfffRcnT55EWFgYHn/8cXh7e2PPnj2YM2cOBg0ahNmzZ6OpqQnAjdCKjIzEtWvXEBAQIPJnYb5uFVw6nQ4LFy6Em5sb5HI5YmNj0dDQ0G1qx8TEIC8vzyb9EN3sxx9/xMiRIxEYGIjExES8+OKL8PPzg0qlQn19vdjt9Tj33nsv1qxZYzRPEAQoFAps2bJFpK7+n06nw1//+lc89thj+PXXX5GRkYFz586hvLwcn376KXJyclBQUICTJ0+irKwM06dPx6pVqzBkyBDDH+16vR579+7FH/7wB7E/HbN1q+BSq9XIy8tDcXGx4Ydx+vTp3aZ2TEwM8vPzbdIPUavKykqMGDECRUVFbZbt2rUL4eHhOH36tAid9UwnT57EqVOnMHToUKP5VVVVOH/+PEJDQ0Xq7AadTocXXngB7733HpKSklBRUYF58+bBxcWl3fFDhw5FVlYWiouL0adPHyQkJODy5cuSDS1AhODauHEjAgIC4OTkhHHjxiE5ORlxcXEAgKysLKSkpMDHxwfOzs5YtmwZCgsLUVNTY/W+TKk9dOhQODg44PDhw1bvh6jVokWL0NzcDL1e32aZXq/HyZMnoVarReisZyopKYFMJoO/v7/R/KNHj8Ld3R2DBw8WqbMb0tLS8Nlnn0GtVuNf//oX5HK5Ses5OTnh4sWLcHBwwOXLl63cpXXZNLjWrVuHBQsWIDMzE83NzYiKisLKlSsRHByM5uZm1NXVISQkxDDe19cXCoUC5eXlZtVRq9UIDAw0ebw5tSdOnMjThWQz586dwxdffNFuaLUSBAHZ2dloaWmxYWc9V0lJCfz8/NC3b1+j+UePHhX9aOvw4cN49913MXPmTKSkpJi8Xus1LUEQsHv3bsjlciQkJOD69etW7NZ6bBZcly5dQnJyMrKysjBq1CjIZDIkJiZCp9MhODgYWq0WAODs7Gy0nlKpNCzLzc1FeHg4wsPDsXv37lvWSk1NNSvsTKndasKECdi+fbvJ2ybqiurqauh0uk7HnT9/HmfOnLFBRz1fSUkJKisr4erqajSlp6cjLCxM1N4WLVoEV1dXLF++3OR1WkOr9ZrW6NGjsWLFCnz33XfYunWrFbu1IsFGduzYISiVSqN5NTU1AgDh1KlTQlNTkwBAOHLkiNEYhUIh5OXlCU1NTUJwcLBw5coVoaGhQQgICBCuX79+2/2sXbtWiIiIEARB6LT2zbKysoRJkybddl1TAeDEiZOFptafdVO4uLgI77zzjnDixAmjSalUCtu2bTN5OxERERbtu7KyUgAgpKWlmdzDjz/+KAwcOFC4++67hWPHjhnmX79+XfDy8hIef/xxi/fclclUNjviOnv2LO6++26jeRs2bMDAgQMxcOBAKJVKeHp6orS01LC8qqoKWq0WgYGBKC4uxqhRo+Do6IgBAwbA29sbx48ft0hvndW+WX5+PmJiYixStyOCIHDihOvXr2Pw4MGws7O75b5ib2+P0NBQ0XvtrlNERITJP3eVlZVoamqCSqWCh4eHYbpy5Qo0Go3ZpwojIiIs1nfrmZ74+HiTav/+SOvmGzFkMhlmzJiBffv24fz58xbruauTqWwWXP7+/qisrMT+/ftx9epVbNiwAWq1GkFBQYYxSUlJSE9PR3V1NbRaLVJSUqBSqeDt7Y3Gxkaju2ZcXFzQ2Nhosf46qt3q0qVL2Lt3L6KioixWl6gjMpkMycnJHf5Q6/V6LFiwwIZd9VwlJSW466672txR+O2332Lw4MFwd3cXqbMb17cGDhwILy+vTsd2FFqtHn30UQiCgCNHjlijXauyWXCFhobijTfewOTJk+Hh4YHi4mIMHz4cwcHBhjGpqamIjo5GWFgYBg0aBJ1Oh9zcXADAgAEDDA/PAUBTUxMGDBjQbq2lS5e2uSOoMx3VbrVz504EBwfD1dXVrG0TdcWrr76KF198EcCNo6tWra9ff/11TJkyRZTeepqSkhKEhYXBwcH4f+weOnRI9Bszqqqq8OCDD3Y6zpTQAoCHHnrIsF3JEUTk5eUlbNy40aSxN1/jamxsFIYMGWKxa1ymio+PF957773brkl0u/R6vZCfny+oVCpBqVQKAIRnnnlG2L17t9itdXsRERFm/6x3h7q/X/+nn34Sfvjhh07X++ijj9pc02rPlStXhO+++05oaGi4Zc3uyqHTZLMSrVaL2tpaoyOujiiVSsyfP9/wNk0ffPABZDKZFTtsy8vLy/DMGZEt2dnZITo6GtHR0YaPN2/eLHJXZEt+fn4mjZszZw6mTp2K/v37dzjO0dFR9Lskb5dowVVRUQG5XA5fX1+T15kxYwZmzJhhkfpBQUEmX+RslZaWZpHaRETW1FloSZ1owTVixIg2z0jZUlBQkNGNIUREJA3d6r0KiYiIOsPgIiIiSWFwERGRpDC4iIhIUhhcREQkKQwuIiKSFNFuhycispWysjLDmxfYsmZXH7mxdd+W6NkWGFxE1KOJ9Yu4q8+K3u66VXWn4ON5T5vXptaUQnDZCYIZ7yVPRN2CnZ2dWf8Ggu4cqelZUKcktXndk/AaFxERSQqDi4iIJIXBRUREksLgIiIiSWFwERGRpDC4iIhIUhhcREQkKQwuIiKSFAYXERFJCoOLiIgkhcFFRESSwuAiIiJJ4bvDk8H8+fNRVlYmSu2goCBkZGSIUptMJ9Y+wv2DbsYjLjIoKysT5ZeSWHXJfGJ8r7h/0O/xiIuMBAUFYd++fTataet/8EddY+t9hPsH/R6PuIiISFIYXEREJCk8VUjUzV2/fh3btm3Dnj17UFpaijNnzkAmkyEyMhIhISEYN24cxo4dC3t7/h1Kdwbu6UTdlF6vx0cffQRvb28888wzWLNmDQAgLCwMOp0Oly9fxscff4zx48fDz88P//73vyEIgshdE1kfg4uoG6qvr0dkZCTmzp2LBx54AHl5eWhubsZ///tfbNiwAQBQXFyM5uZmfPrpp+jfvz9mzpyJ6OhoNDY2itw9kXUxuIi6mdraWjz22GMoKytDTk4O9uzZg4kTJ8LBoe2ZfUdHR0yZMgVFRUXIyMjArl27EBERgYaGBhE6J7INXuMi6kZaWloQFRUFjUaDvXv3IiQkxKT17O3tMW/ePAwZMgRRUVGIjY3F3r17Rb/updVqceTIEfz444+4cuUKnJycEBgYiICAAPTp06fNeEEQsGLFCkyaNAne3t62b5gk4Y494srJyTH7+ZCQkBB89dVX1mmICMA//vEPVFRUYMOGDSaH1s2eeOIJZGZm4ptvvsGHH35ohQ47JwgCCgsLER0dDaVSicjISLzyyiuYP38+EhMTMWzYMLi4uCAhIQGHDx82Wi8tLQ1/+ctfkJWVJUrvJA3dKrh0Oh0WLlwINzc3yOVyxMbG2uyUhym1Y2JikJeXZ5N+pOLee+813DTQShAEKBQKbNmyRaSuOnb69GmkpaXhvvvug5OTE7y9vfHWW2/h9OnTovZ15swZvP/++5gxYwaefvrp295OfHw8VCoV0tLScOnSJQt22Llff/0V0dHReOqpp1BSUoKUlBRs374ddXV1aGhoQGVlJb744gvMnDkTmzZtQmhoKObOnYvz588jLS0NixcvRkJCApYsWWLTvklihG5kyZIlwgMPPCAcP35c0Gg0wuTJk4Xx48dbpdbatWuFiIgIs2qXlZUJHh4eVumnO4iIiDD6mnSmvr5eACCUlJQYza+srBQACHV1dVap2xXff/+94ObmJgBoM7m6ugrl5eU26aM977zzjgBA+OGHHzod29mP7r59+wQAwurVqy3VniAIHX+vSktLBTc3N6Fv377C8uXLhZaWlg631dzcLMybN08AYPieJCQkCDqdzuSa1FaK+pN2X/ckNj/i2rhxIwICAuDk5IRx48YhOTkZcXFxAICsrCykpKTAx8cHzs7OWLZsGQoLC1FTU2P1vkypPXToUDg4OBid3riTlZSUQCaTwd/f32j+0aNH4e7ujsGDB4vUWfuuXbuGp59++pZ33f322294+umncfXqVRt3dkN+fj7Cw8Px0EMPdXlbo0ePho+PDwoKCizQWed++eUXjB07Fn379kVpaSnmz5+P3r17d7iOQqHA8uXLMW3aNJw7dw5KpRLLly8X/bocdX823UPWrVuHBQsWIDMzE83NzYiKisLKlSsRHByM5uZm1NXVGZ3X9/X1hUKhQHl5uVl11Go1AgMDTR5vTu2JEyfydOH/lJSUwM/PD3379jWaf/ToUYSGhorU1a1t3boVJ06cgF6vb3e5Xq9HfX09tm7dauPObjxkfPToUYSHh1tke3Z2dhg+fLhN/sjS6XSYOXMm9Ho99uzZY3LwCv+7prV+/XqoVCpoNBqkpKRYuVvqCWwWXJcuXUJycjKysrIwatQoyGQyJCYmQqfTITg4GFqtFgDg7OxstJ5SqTQse/LJJ+Hq6trp+e/U1FSzws6U2q0mTJiA7du3m7ztnqykpASVlZVwdXU1mtLT0xEWFiZ2e21s27YNMpmswzEymcxmRyk3O3XqFK5cuWKRo61WDz/8MOrr661+BLlq1SocOnQIH374IXx9fU1apzW0Wq9p7dixAwsWLMAnn3yCQ4cOWbVf6gFsdU5yx44dglKpNJpXU1MjABBOnTolNDU1CQCEI0eOGI1RKBRCXl6eIAiCcOLECWHt2rXC22+/3eV+br7GZUrtVllZWcKkSZO6XL8zaOcajC0mc64luLi4CO+8845w4sQJo0mpVArbtm0zeTsRERGifb6curaP6PV64cEHHxSGDRsm6PV6k77fer1eePPNNwXA+JrWhQsXBKVSKUyZMoX7xx06mcpmR1xnz57F3XffbTRvw4YNGDhwIAYOHAilUglPT0+UlpYalldVVUGr1RpO+3l4eFilN1Nqt8rPz0dMTIxV+riZIAg2nyIiIkzur7KyEk1NTVCpVPDw8DBMV65cgUajMftUYUREhNU/vzfffNOkXhYtWmTzr71GowFw4zS3KeNN2Ufmz5+Pvn37QqfTWW0fKSoqwk8//YQ//elPsLOz6/RrK/zuSGv16tWGa1r9+vXDzJkz8eWXX7Y502GL/aOnTCnqT9p9LYXJVDYLLn9/f1RWVmL//v24evUqNmzYALVajaCgIMOYpKQkpKeno7q6GlqtFikpKVCpVDZ5ENGU2pcuXcLevXsRFRVl9X66u5KSEtx1110YOnSo0fxvv/0WgwcPhru7u0id3dqLL77Y6YV/e3t7JCYm2qij/+fs7Iz77rvPotekDh8+jKCgIKve7FBUVAQAGD9+fKdjOwqtVuPHj8e1a9eM/ogk+j2bBVdoaCjeeOMNTJ48GR4eHiguLsbw4cMRHBxsGJOamoro6GiEhYVh0KBB0Ol0yM3NNbvW0qVL29zp1hlTau/cuRPBwcFwdXU1u6eepqSkBGFhYW3ehujQoUPd8sYMAPD09Oz0qGvRokXw8vKyUUfGRo4cia+//toiz16dPXsWRUVFGDFihAU6u7WjR4/innvu6fQPFVNCCwAeeeQRAOB/PKaOCSLy8vISNm7caNY61rjGZar4+Hjhvffe63Lt7kqs52VsWVev1wsZGRlC//79jc6t9+/fX1i+fLnJ12msofXZq1WrVnU6trMf3bffflsATHsmzBy//15lZGQIycnJna63evVqAWj/Oa2bXb9+XXjuueeErVu33rImdexOeI5LtPcq1Gq1qK2tNTri6sysWbNQXFyMlpYWFBcX2/zuLy8vL8MzZyRNdnZ2mDdvHl555RXs3LkTZ8+exUsvvYRff/0Vjo6OovY2evRow5mJSZMm3faRfXV1NdRqNSZMmGDRuxTbM2/ePJPGPffcc/jtt9+wYMGCDk9dymQyfP7555Zqj3oo0YKroqICcrnc5NtnASA7O9ti9YOCghAfH2/WOmlpaRarT+JydHTExIkTAQAvvfSS6KEF3AjV7OxshISEID4+Hlu2bEGvXr3M2salS5cwbdo02NvbIzMz00qdmk8ul2PhwoVit0E9hGiPqI8YMQJardakO5Gs4XaCi8jaAgICsGLFCmzfvh3PPfdcm7vrOnLu3DlMmDABRUVFyM7OhqenpxU7JRIP31uFqJuZPXs2Vq5cifz8fAQEBCAvL++W7/YB3HjXjfXr18Pf3x8HDx5Ebm4unn32WRt2TGRb/H9cRN3Q3LlzERoaioSEBEyaNAm+vr6Ii4tDaGio4a7Hzz77DCUlJfj8889x8uRJhISEYM+ePRgyZIjI3RNZF4OLqJsKDw9HeXk5Nm/ejH/+8594//33cf36dcPyqVOnwtHREZGRkcjMzMSECRM6fUsrop6AwUXUjfXu3RtTpkzBlClTcOXKFVRUVOD06dOIjo7GkSNH4O/vb/YNHERSx+Aikog+ffoYHu4WzHh7HKKehjdnEBGRpPCIi4yUlZUhMjLS5jVvfs9K6t5svY9w/6DfY3CRgVi/HIKCgviLSSJu9/tUVXcKPp73tHltak3uH3QzBhcZZGRkiN0CdXO3u4+kpmdBnZLU5jXR7eA1LiIikhQGFxERSQqDi4iIJIXBRUREksLgIiIiSWFwERGRpDC4iIhIUhhcREQkKQwuIiKSFAYXERFJCoOLiIgkhcFFRESSwuAiIiJJYXAREZGkMLiIiEhSGFxERCQpDC4iIpIU/gdkuuO0tLSgvLwcx44dw+XLlwEAJSUlCAgIQJ8+fUTujog6w+CiO0ZRURE++ugjbNq0CVevXjVaNmzYMPTu3RtxcXGYM2cOwsPDReqSiDrDU4XU42k0GsyaNQvh4eEoKChAYmIiNm3ahJ9//hmnT58GAHzxxRd46aWXUFBQgBEjRiAhIQEajUbkzomoPTzioh6tpqYGTz75JGpqavC3v/0Nr7/+OpycnNqMi42NRWxsLNLT0/Huu+9CrVbjm2++wa5du3DfffeJ0DkR3QqPuKjHOnv2LMaMGYPffvsN+/fvx9KlS9sNrZv169cPS5YswYEDB6DRaDBmzBicOXPGRh0TkSnu2ODKyclBZGSkWeuEhITgq6++sk5DZFGCIGD27Nk4efIkCgsLMXLkSLPWDw8Px86dO3Hq1CnMnj0bgiBYqVMiMle3Ci6dToeFCxfCzc0NcrkcsbGxaGho6Da1Y2JikJeXZ5N+qGu2bduGzZs3Y/HixRg2bNhtbSM0NBSLFy/Gli1bUFBQYOEOieh2davgUqvVyMvLQ3FxMerr6wEA06dP7za1Y2JikJ+fb5N+qGsyMjLg6emJBQsWdGk7ycnJ8PLyQkZGhoU6I6Kusnlwbdy4EQEBAXBycsK4ceOQnJyMuLg4AEBWVhZSUlLg4+MDZ2dnLFu2DIWFhaipqbF6X6bUHjp0KBwcHHD48GGr90O3r7a2Fnv27MHLL78MB4eu3X/k4OCAV155BXv37kV1dbWFOiSirrBpcK1btw4LFixAZmYmmpubERUVhZUrVyI4OBjNzc2oq6tDSEiIYbyvry8UCgXKy8vNqqNWqxEYGGjyeHNqT5w4kacLu7mioiIAwFNPPWWR7Y0fPx4AUFxcbJHtEVHX2Cy4Ll26hOTkZGRlZWHUqFGQyWRITEyETqdDcHAwtFotAMDZ2dloPaVSCa1Wi8OHD2PkyJEYPXo0xowZg6qqqlvWSk1NNSvsOqt9swkTJmD79u0mb5ts7+jRo+jVqxf8/f0tsj1/f3/07t0bZWVlFtkeEXWNzZ7j2r9/P/R6vdFfwefOnQMABAcHG95qp7m52Wg9jUYDhUKBe++9F4WFhZDL5dixYwfeeust/Oc//7FIb3K5vMPaN6utrYWnp6dF6pJ1aLVayOVy9O7d2yLb69WrFxQKRZs/YohIJIKN5OTkCH5+fkbzli5dKgwcONDwsaenp7BmzRrDx8ePHxcACNXV1Ubrff3110J8fHyX+lm7dq0QERFhdu2oqChh7dq1XaptCgCcOHHidEdNJv9+tOLvXiMlJSWCvb29sG/fPqGlpUVYv369oFAohPHjxxvGLFmyRPDz8xOqqqqE5uZm4dlnnxVUKpXRdi5cuCCEhIQIFRUVXern98FlSu2LFy8K/fr1E86dO9el2mRdmZmZAtD2j45b6ewHpra2VgAgfPzxxxbo7s6Uov6k3ddkeXfC19pm17hCQ0PxxhtvYPLkyfDw8EBxcTGGDx+O4OBgw5jU1FRER0cjLCwMgwYNgk6nQ25urmH51atXERcXh0WLFnV4/WLp0qVmX9/orDYA7Ny5E8HBwXB1dTVr22RboaGhAICDBw9aZHut27n55h0iEo9N7ypcvHgxGhsbcfbsWaxYsQI///yzUXDJZDK8//77aGhowPnz57F582ZDSOh0Ovzxj3/E5MmTMWnSpA7rvP766zh27JhZvXVUu1V+fj5iYmLM2i7Z3iOPPAJvb2+sWbPGIttbvXo1vLy8DIFIROIS7QFkrVaL2tpao+DqyKZNm1BYWIjc3FxERkZi7ty5Vu6wLS8vL8MzZ9R9yWQyw7NX33zzTZe2deDAAcMzYTKZzEIdElFXiPbu8BUVFZDL5fD19TVp/JQpUzBlyhSL1Q8KCkJ8fLxZ66SlpVmsPlnXn//8Z6xatQoJCQkoKysz3DlqjgsXLiAhIQE+Pj549dVXrdAlEd0O0Y64RowYAa1WCzs7O1Hq305wkXT069cP2dnZqK2tRUxMDC5cuGDW+hcuXEBMTAxqamqQnZ2Nfv36WalTIjJXt3qvQiJLGj16NNatW4f9+/fj0UcfNfmtukpLSxEeHo59+/YhJycHERERVu6UiMzB4KIebdq0adi+fTuampowfPhwTJs2DQcOHMC1a9eMxl27dg0HDhzACy+8gOHDh6OxsRHbtm3DCy+8IFLnRHQr/A/I1OONHz8eFRUVWLx4MbKzs7FhwwY4OjrC39/fcO1LLpejpaUFCoUCc+bMwVtvvQUXFxeROyei9jC46I7g4uKC5cuXY8mSJdi2bRtKSkpQUVGBy5cvA7hxM0dYWBiioqJ4PYuom2Nw0R2lX79+eP755/H888+L3QoR3SZe4yIiIklhcBERkaQwuIiISFIYXEREJCkMLiIikhQGFxERSQqDi4iIJIXBRUREksLgIiIiSWFwERGRpDC4iIhIUhhcREQkKQwuIiKSFAYXERFJCoOLiIgkhcFFRESSwuAiIiJJYXAREZGkMLiIiEhSGFxERCQpDC4iIpIUBhcREUmKg9gNEBHR7dFoL0B74VKb+XW/nm339T1u/dGrl/R/7Uv/MyAiukNduHgZmf/Z2mb+zfNaXw9yd8Wcmc/YrDdr4qlCIiKJ8rjHDY8M8TNpbNQT4bC3s7NyR7bB4CIikrDxo8PQu5PTfwEP+uC+wffYqCPrY3AREUmYQt4PkY8G3XK5g0yGpx4fbsOOrK9bB5dOp8PChQvh5uYGuVyO2NhYNDQ09PjaRETmGBUWCKXCqf1lwwLQ31lu446sq1sHl1qtRl5eHoqLi1FfXw8AmD59eo+vTURkjl69HPB0ZNujKnm/vogcfuujManqFsF18OBBqFQquLu7Q6lUIi4uDgCQlZWFlJQU+Pj4wNnZGcuWLUNhYSFqamqs3pOYtYmIzBXwkA+8BrkbzVONHgZHx94idWQ9ogfXl19+iYkTJyIpKQl1dXU4ceIEEhMT0dzcjLq6OoSEhBjG+vr6QqFQoLy83KwaarUagYGBJo+3ZG0iIluws7ND9BMjDB8PcnfFIwGm3XEoNaIG18WLF/Hyyy9jxYoViI2NhaOjI+RyOVQqFbRaLQDA2dnZaB2lUmlYlpubi/DwcISHh2P37t23rJOammpW4JhSm4iou/G4xw0h/7s9vifd/v57oj6AvH//ftjZ2WHatGltlsnlNy4mNjc3G83XaDRQKBTQaDT44IMPcOjQIVy4cAGPP/44jhw5AplM1uW+OqttC6npWTapQ2QrN+/T3L+t75MNBWK3YDZ1SpJJ40QNroaGBri4uMCunb8KlEolPD09UVpaiqCgGxcXq6qqoNVqERgYiOLiYowaNQqOjo5wdHSEt7c3jh8/Dj+/rh8ad1bbFkz9BhJJQWp6lmGfvvk1WYder4e9vehXgqxG1M8sJCQE1dXVKCgogF6vh0ajwc6dOw3Lk5KSkJ6ejurqami1WqSkpEClUsHb2xuNjY1wcXExjHVxcUFjY6PFeuuoNhFRd9aTQwsQ+YjL398fq1evxmuvvYapU6dCLpdj1qxZUKlUAG5cm2pqakJYWBhaWlowduxY5OYx3KWyAAAE+UlEQVTmAgAGDBiApqYmw7aampowYMCAdussXboU69evx7Fjx0zuraPatsBTKdTT8FQhdcbUI3E7QRAEK/diFRqNBmPGjMGhQ4dw8eJFREREoKyszCLXuIjIsniqkCxJsu8Or1QqMX/+fERGRgIAPvjgA4YWEdEdQLLBBQAzZszAjBkzxG6DiIhsqGdfwSMioh6HwUVERJLC4CIiIklhcBERkaQwuIiISFIYXEREJCkMLiIikhQGFxERSQqDi4iIJIXBRUREksLgIiIiSWFwERGRpDC4iIhIUhhcREQkKQwuIiKSFAYXERFJCoOLiIgkhcFFRESSwuAiIiJJYXAREZGkMLiIiEhSGFxERCQpDC4iIpIUBhcREUkKg4uIiCSFwUVERJLC4CIiIklhcBERkaQwuIiISFLsBEEQxG6CiHqOupNnsH1vkdG82pNn4DXIvc1re3t7/DHmCcj73WXzPkm6HMRugIh6lsH33g1BEFD361mj+bUnz7R5PTzoYYYWmY2nConIouzs7BA1JrzTcY69e2HsqFAbdEQ9DYOLiCzOc5A7gv5wf4djnhgZAqe7+tqoI+pJunVw6XQ6LFy4EG5ubpDL5YiNjUVDQ0OPr03UEzwVMQy9HGTtLhvgosCIEH8bd0Q9RbcOLrVajby8PBQXF6O+vh4AMH369B5fm6gncFY4IWJ4ULvLJjz+KBxk7YcaUWe6RXAdPHgQKpUK7u7uUCqViIuLAwBkZWUhJSUFPj4+cHZ2xrJly1BYWIiamhqr9yRmbaKeYvTwoXCW9zOad7/XIDx8v5dIHVFPIHpwffnll5g4cSKSkpJQV1eHEydOIDExEc3Nzairq0NISIhhrK+vLxQKBcrLy82qoVarERgYaPJ4S9YmupP17uWA8RHDDB/b2dkh6olw2NnZidgVSZ2owXXx4kW8/PLLWLFiBWJjY+Ho6Ai5XA6VSgWtVgsAcHZ2NlpHqVQalj355JNwdXXFkiVLOqyTmppqVuCYUpuITBP0h/vhee/dAIBhQx/CQLf+IndEUifqc1z79++HnZ0dpk2b1maZXC4HcOPo52YajQYKhQIAkJOTg127dhmuQVmKKbWtLTU9yyZ1iGypuOwHFJf9IHYb1E2pU5JMGidqcDU0NMDFxaXd0wZKpRKenp4oLS1FUNCNC7xVVVXQarWG034eHh5W6cuU2tZm6jeQSCpOnmnAIHdXsdugHkDUU4UhISGorq5GQUEB9Ho9NBoNdu7caVielJSE9PR0VFdXQ6vVIiUlBSqVCt7e3lbvTczaRD0RQ4ssRdQjLn9/f6xevRqvvfYapk6dCrlcjlmzZkGlUgG4cW2qqakJYWFhaGlpwdixY5Gbm2t2naVLl2L9+vU4duyYyetYqvbt4qlCIrrTmHqmSfJvspuTk4P6+nosWrRI7FaIiMgGJB1cs2bNQnFxMVpaWvDwww+joKBA7JaIiMjKJB1cRER05xH9AWQiIiJzMLiIiEhSGFxERCQpDC4iIpIUBhcREUkKg4uIiCSFwUVERJLC4CIiIklhcBERkaQwuIiISFIYXEREJCkMLiIikhQGFxERSQqDi4iIJIXBRUREksLgIiIiSWFwERGRpDC4iIhIUhhcREQkKQwuIiKSFAYXERFJCoOLiIgkhcFFRESSwuAiIiJJYXAREZGkMLiIiEhSGFxERCQpDC4iIpKU/wOYgEElgkDa/gAAAABJRU5ErkJggg==\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 -}