A pesquisa Operacional e os Recursos Renováveis 4 a 7 de novembro de 2003, Natal-RN UM ALGORITMO QUÂNTICO (BASEADO EM ENSEMBLES) DE COMPLEXIDADE O(log 2 N) PARA UM PROBLEMA DE BUSCA EM UMA LISTA COM N ELEMENTOS Carlile Lavor Universidade do Estado do Rio de Janeiro (IME-UERJ) Rua São Francisco Xavier 524, 6º andar, bl. D 20550-900, Rio de Janeiro – RJ, Brasil e-mail: [email protected] Renato Portugal Laboratório Nacional de Computação Científica - LNCC Av. Getúlio Vargas 333, 25651-070, Petrópolis – RJ, Brasil e-mail: [email protected] Luiz M. Carvalho Universidade do Estado do Rio de Janeiro (IME-UERJ) Rua São Francisco Xavier 524, 6º andar, bl. D 20550-900, Rio de Janeiro – RJ, Brasil e-mail: [email protected] Nelson Maculan Programa de Engenharia de Sistemas e Computação – COPPE Universidade Federal do Rio de Janeiro - UFRJ C. P. 68511, 21945-970, Rio de Janeiro – RJ, Brasil e-mail: [email protected] Resumo. Os algoritmos quânticos ainda não são muito conhecidos pela comunidade de Pesquisa Operacional. Neste artigo, apresentamos o algoritmo de Brüschweiler para resolver o mesmo problema em que foi aplicado o algoritmo de Grover: tem-se uma lista não ordenada com N elementos e deseja-se localizar um elemento específico. O algoritmo de Grover tem um ganho quadrático em relação ao melhor algoritmo clássico, enquanto que o algoritmo de Brüschweiler tem um ganho exponencial sobre os dois. Além de apresentarmos um exemplo mostrando claramente os passos do algoritmo de Brüschweiler, descrevemos matematicamente suas operações para simplificar a compreensão de sua complexidade. Isso é feito usando apenas os conceitos introduzidos no artigo. Palavras-chave: Algoritmos Quânticos, Busca Quântica, Algoritmo de Brüschweiler. Abstract. Quantum algorithms are not well known in the Operations Research community. In this paper, we present Brüschweiler’s algorithm applied to solve the same problem addressed by Grover’s algorithm: find a specific element in an unstructured database with N items. Grover’s algorithm allows a quadratic speedup over the best classical algorithm, while Brüschweiler’s algorithm allows an exponential speedup over both of them. We give a detailed example explaining the steps of Brüschweiler’s algorithm and a mathematical description of its operators. This is done using only the concepts given in the paper. Keywords: Quantum Algorithms, Quantum Search, Brüschweiler’s Algorithm. 1 Introdução Além dos algoritmos quânticos propostos por Grover [3, 4, 6] e Shor [10], uma nova abordagem foi apresentada por Madi, Brüschweiler e Ernst: algoritmos baseados em ensembles quânticos [1, 7]. A diferença fundamental entre eles é que estes algoritmos não manipulam estados emaranhados [8], o que acontece com os algoritmos de Grover e Shor. Utilizamos o algoritmo de Brüschweiler [1] para resolver o mesmo problema em que foi aplicado o algoritmo de Grover: tem-se uma lista não ordenada com N elementos e deseja-se localizar um elemento específico. O melhor algoritmo clássico resolve o problema em O(N) passos, enquanto que o algoritmo de Grover requer O( N ) passos. O algoritmo de Brüschweiler, aplicado a esse problema, tem complexidade O(log 2 N). Ou seja, tem-se um ganho exponencial sobre o algoritmo clássico e o de Grover. O algoritmo de Brüschweiler é descrito em duas revistas da área de física [1, 7]. Neste artigo, descrevemos o algoritmo para a comunidade de Pesquisa Operacional, assim como reformulamos a demonstração de sua complexidade. O artigo está organizado da seguinte forma. Na seção 2, apresentamos as noções básicas para a compreeensão do artigo. Na seção 3, o algoritmo de Brüschweiler é descrito juntamente com sua complexidade. Na seção 4, o algoritmo é exemplificado com uma lista com 8 elementos. Finalmente, concluímos com a seção 5. 2 Conceitos Básicos Em computação quântica, os valores 0 e 1 de um bit são substituídos pelos vetores |0〉 e |1〉 de um qubit (quantum bit). Essa é a notação utilizada em mecânica quântica e é conhecida por notação de Dirac [8]. A diferença entre um bit e um qubit é que um qubit |ψ〉 pode também ser uma combinação linear dos vetores |0〉 e |1〉, |ψ〉 = α|0〉 + β|1〉, (1) onde α e β são números complexos. Os vetores |0〉 e |1〉 são representados por 1 0 0 1 |0〉 = e |1〉 = e formam uma base ortonormal do espaço vetorial C 2 . Essa base é chamada de base computacional e o vetor |ψ〉 é chamado de uma superposição dos vetores |0〉 e |1〉, com amplitudes α e β (em mecânica quântica, vetor é também chamado de estado; usaremos os dois termos com o mesmo significado). Da mecânica quântica, sabe-se que |α| 2 e |β| 2 são as probabilidades do qubit |ψ〉 estar nos estados |0〉 e |1〉, respectivamente [8]. Portanto, |α| 2 + |β| 2 = 1. Calculando a norma de |ψ〉, em (1), obtemos: || |ψ〉 || = (|α| 2 + |β| 2 ) 1 / 2 = 1. Ou seja, o estado de um qubit tem sempre norma 1. Como as mudanças de estado de um sistema isolado em mecânica quântica são descritas por transformações lineares [8], as matrizes associadas a essas transformações que preservam a norma são matrizes unitárias [8]. Um matriz unitária U ∈ C 2×2 pode ser definida como sendo uma matriz tal que 2069 U + U = UU + = I, onde U + é a matriz transposta conjugada de U e I é a matriz identidade. Para tratar estados com mais de um qubit, usamos o produto tensorial [8]. Para os nossos propósitos, definimos o produto tensorial A ⊗ B, entre as matrizes A ∈ C m×n e B ∈ C p×q , como (A ⊗ B) ij = (A) ij B, onde i = 1, ..., m e j = 1, ..., n. Note que a dimensão da matriz A ⊗ B é mp×nq e que o produto tensorial não é comutativo. Por exemplo, 0 1 1 0 |0〉 ⊗ |1〉 = ⊗ = 0 1 0 0 e 0 0 1 0 . |1〉 ⊗ |0〉 = ⊗ = 1 0 1 0 O produto tensorial possui as seguintes propriedades [8]: 1. z(|v〉 ⊗ |w〉) = (z|v〉) ⊗ |w〉 = |v〉 ⊗ (z|w〉), 2. (|v 1 〉 + |v 2 〉) ⊗ |w〉 = (|v 1 〉 ⊗ |w〉) + (|v 2 〉 ⊗ |w〉), 3. |v〉 ⊗ (|w 1 〉 + |w 2 〉) = (|v〉 ⊗ |w 1 〉) + (|v〉 ⊗ |w 2 〉), onde z ∈ C; |v〉, |v 1 〉, |v 2 〉 ∈ C m ; e |w〉, |w 1 〉, |w 2 〉 ∈ C n . Usaremos também a notação |v〉|w〉 e |vw〉 para o produto tensorial |v〉 ⊗ |w〉. Com o produto tensorial, representamos um estado |ψ〉 de 2 qubits como uma superposição dos estados |00〉, |01〉, |10〉 e |11〉: |ψ〉 = a|00〉 + b|01〉+ c|10〉 + d|11〉, onde |a| 2 + |b| 2 + |c| 2 + |d| 2 = 1. Usando a notação decimal, podemos simplificar a representação dos estados |00〉, |01〉, |10〉 e |11〉, substituindo-os por |0〉, |1〉, |2〉 e |3〉. 2070 De forma similar, pode-se representar um estado qualquer de n qubits. Neste caso, a base computacional, em notação decimal, é o conjunto {|0〉, ..., |N − 1〉}, onde N = 2 n . Para finalizar esta seção, apresentamos mais três definições. O dual de um vetor |ϕ〉 ∈ C n , denotado por 〈ϕ|, é o vetor transposto de |ϕ〉 com os elementos substituídos pelos seus conjugados. Ou seja, 〈ϕ| = (|ϕ〉) + . Além do produto interno 〈ϕ|ψ〉 entre dois vetores |ϕ〉, |ψ〉 ∈ C n , definido por 〈ϕ|ψ〉 = (|ϕ〉) + |ψ〉, usaremos também o produto externo |ϕ〉〈ψ|, definido por |ϕ〉〈ψ| = |ϕ〉(|ψ〉) + . Note que o produto externo também poderia ser definido como um produto tensorial: |ϕ〉〈ψ| = |ϕ〉 ⊗ 〈ψ|. (2) Por exemplo, 1 0 0 1 . 0 0 |0〉〈1| = |0〉 ⊗ 〈1| = ⊗ [0 1] = Destacamos mais uma propriedade que será útil mais adiante [8]: (|ϕ〉 ⊗ |ψ〉) + = (|ϕ〉) + ⊗ (|ψ〉) + . 3 O Algoritmo de Brüschweiler Em vez de usar vetores, uma outra maneira de descrever sistemas quânticos é através do conceito de matriz densidade [8]. Ele é conveniente para descrever sistemas quânticos cujos estados não são totalmente conhecidos. Suponha que um sistema quântico esteja em um estado |ψ i 〉 com probabilidade p i . O conjunto {(p i , |ψ i 〉) : i = 1, ..., n} é chamado de um ensemble de estados puros, ou simplesmente, um ensemble. A matriz densidade ρ associada ao sistema é definida por ρ= n ∑ i =1 p i |ψ i 〉〈ψ i |. Se um sistema está em um estado |ψ i 〉, com probabilidade p i , o estado resultante, após a aplicação de um operador unitário U, será o estado U|ψ i 〉, com a mesma probabilidade. Em termos de matriz densidade, a aplicação do operador U sobre o sistema resulta na matriz densidade UρU + . 2071 Um sistema quântico, cujo estado |ψ〉 é conhecido, é dito estar em um estado puro. Neste caso, a matriz densidade do sistema é simplesmente |ψ〉〈ψ|. Consideremos, agora, o problema em que aplicaremos o algoritmo de Brüschweiler. Vamos supor que a busca será realizada sobre a lista {0, 1, ..., N − 1}, onde N = 2 n para algum número natural n, e que a função f : {0, 1, ..., N − 1} → {0, 1}, definida por 1, se i = i0 0, se i ≠ i0 f(i) = (3) será utilizada para o reconhecimento do elemento procurado i 0 . A essência do algoritmo é aplicar uma idéia já bem conhecida em computação: a busca binária. O primeiro passo é dividir a lista em duas de mesmo tamanho, r 1− = {0, ..., N −2 } 2 e r 1+ = { N , ..., N − 1}, 2 e testar se o elemento procurado i 0 está em r 1− ou r 1+ . Para “avaliar” a função f, o algoritmo de Brüschweiler utiliza um operador unitário U f , dependente de f, definido por U f (|i〉|0〉) = |i〉|f(i)〉, (4) onde o primeiro registrador tem n qubits e o segundo tem 1 qubit. O primeiro registrador é inicializado como um ensemble {( 1 , |i〉) : i = 0, ..., N /2 N −2 }. Ou seja, tem-se um ensemble formado pelos elementos de r 1− com a mesma 2 probabilidade para cada elemento. A matriz densidade associada é dada por ∑ i∈r1− 1 |i〉〈i|. N /2 O segundo registrador é inicializado como um ensemble {1, |0〉}. Portanto, a matriz densidade associada aos dois registradores é dada por ρ=(∑ i∈r1− = 1 N /2 1 |i〉〈i|) ⊗ (|0〉〈0|)) N /2 ∑ (|i〉〈i| ⊗ |0〉〈0|). (5) i∈r1− Antes de aplicarmos o operador U f sobre a matriz densidade ρ, consideremos dois lemas. 2072 Lema 1. Sejam |a〉 e |b〉, estados da base computacional {|0〉, ..., |N − 1〉}. Então, |a〉|b〉 ⊗ 〈a|〈b| = |a〉〈a| ⊗ |b〉〈b|. Prova. Supondo que o valor 1 dos vetores |a〉 e |b〉 esteja nas posições j e k, respectivamente, o valor 1 do vetor |a〉|b〉 estará na posição j × k. Fazendo o produto tensorial entre |a〉|b〉 e 〈a|〈b|, obtemos uma matriz onde o valor 1 está na posição (j × k, j × k). Consideremos, agora, o segundo termo da igualdade acima. Com a mesma hipótese sobre a posição do valor 1 nos vetores |a〉 e |b〉, o valor 1 das matrizes |a〉〈a| e |b〉〈b| estará nas posições (j, j) e (k, k), respectivamente. Fazendo então o produto tensorial entre |a〉〈a| e |b〉〈b|, obtemos também uma matriz onde o valor 1 está na posição (j × k, j × k). Lema 2. Considere um operador unitário U ∈ C n× n e um vetor |ψ〉 ∈ C n . Então, U(|ψ〉 ⊗ 〈ψ|)U + = (U|ψ〉) ⊗ (〈ψ|U + ). Prova. Usando (2), temos: U(|ψ〉 ⊗ 〈ψ|)U + = U(|ψ〉〈ψ|)U + = (U|ψ〉)(〈ψ|U + ) = (U|ψ〉)(U|ψ〉) + = (U|ψ〉) ⊗ (U|ψ〉) + = (U|ψ〉) ⊗ (〈ψ|U + ). Dos Lemas 1 e 2, obtemos o resultado da aplicação operador U f sobre a matriz densidade ρ. Teorema. A ação do operador U f , em (4), sobre a matriz densidade ρ, em (5), é dada por U f ρU +f = 1 N /2 ∑ (|i〉〈i| ⊗ |f(i)〉〈f(i)|). i∈r1− Prova. Usando (5), temos: U f ρU +f = U f ( = 1 N /2 1 N /2 ∑ i∈r1− ∑ i∈r1− (|i〉〈i| ⊗ |0〉〈0|))U +f (U f (|i〉〈i| ⊗ |0〉〈0|)U +f ). Do Lema 1, 1 N /2 ∑ i∈r1− (U f (|i〉〈i| ⊗ |0〉〈0|)U +f ) = 1 N /2 ∑ i∈r1− (U f (|i〉|0〉 ⊗ 〈i|〈0|)U +f ). Do Lema 2, 2073 1 N /2 ∑ i∈r1− (U f (|i〉|0〉 ⊗ 〈i|〈0|)U +f ) = 1 N /2 = 1 N /2 = = = 1 N /2 ∑ ((U f (|i〉|0〉)) ⊗ ((〈i|〈0|)U +f )) ∑ ((U f (|i〉|0〉)) ⊗ (U f (〈i|〈0|) + ) + ) ∑ ((U f (|i〉|0〉)) ⊗ (U f (|i〉|0〉)) + ) ∑ (|i〉|f(i)〉 ⊗ (|i〉|f(i)〉) + ) ∑ (|i〉|f(i)〉 ⊗ 〈i|〈f(i)|). i∈r1− i∈r1− i∈r1− 1 N /2 i∈r1− 1 N /2 i∈r1− Novamente, do Lema 1, 1 N /2 ∑ (|i〉|f(i)〉 ⊗ 〈i|〈f(i)|) = i∈r1− 1 N /2 ∑ (|i〉〈i| ⊗ |f(i)〉〈f(i)|). i∈r1− Após a aplicação do operador U f , algo surpreendente aconteceu: a função f foi avaliada simultaneamente em todos os elementos do conjunto r 1− . Isto é denominado paralelismo quântico [8]. Note que o ensemble do segundo registrador é formado por todos os valores da função f sobre os elementos do conjunto r 1− . Neste ponto, calcula-se a média f desses valores de forma experimental [1, 7]. Para continuar nossa descrição matemática do algoritmo, representaremos esse cálculo por f = 1 N /2 ∑ f(i), i∈r1− que pode ser obtido (experimentalmente) em O(log 2 N) passos [1, 7]. A média será diferente de zero se, e somente se, o conjunto r 1− contiver o elemento procurado i 0 . Dessa maneira, podemos descartar a metade dos elementos da lista. O próximo passo é então particionar o conjunto que contém i 0 e aplicar novamente o operador U f . Supondo que N = 2 n , após a primeira partição, a lista terá 2 n −1 elementos. Repetindo o processo, obtemos partições com 2 n −2 , 2 n −3 , ..., 2 1 e 2 0 elementos. Portanto, para reduzir a lista a apenas um elemento (i 0 ), são necessárias n = log 2 N divisões. Ou seja, o número de aplicações do operador U f é O(log 2 N). 4 Exemplo Para exemplificar, aplicaremos o algoritmo de Brüschweiler em uma lista com 8 elementos: {0, 1, 2, 3, 4, 5, 6, 7}. Vamos supor que o elemento procurado seja o número 4. O primeiro passo do algoritmo é dividir a lista em duas de mesmo tamanho: r 1− = {0, 1, 2, 3} 2074 e r 1+ = {4, 5, 6, 7}. O primeiro registrador é inicializado como o ensemble 1 1 1 1 , |0〉), ( , |1〉), ( , |2〉), ( , |3〉)}, 4 4 4 4 {( e o segundo registrador como o ensemble {1, |0〉}. A matriz densidade associada aos dois registradores é dada por ρ= 1 ((|0〉〈0| ⊗ |0〉〈0|) + (|1〉〈1| ⊗ |0〉〈0|) + (|2〉〈2| ⊗ |0〉〈0|) + (|3〉〈3| ⊗ |0〉〈0|)). 4 Aplicando U f sobre ρ, obtemos: 1 ((|0〉〈0| ⊗ |f(0)〉〈f(0)|) + (|1〉〈1| ⊗ |f(1)〉〈f(1)|) + 4 U f ρU +f = (|2〉〈2| ⊗ |f(2)〉〈f(2)|) + (|3〉〈3| ⊗ |f(3)〉〈f(3)|)) = 1 ((|0〉〈0| ⊗ |0〉〈0|) + (|1〉〈1| ⊗ |0〉〈0|) + 4 (|2〉〈2| ⊗ |0〉〈0|) + (|3〉〈3| ⊗ |0〉〈0|)). O ensemble associado ao segundo registrador é {( 1 1 1 1 , |0〉), ( , |0〉), ( , |0〉), ( , |0〉)}. 4 4 4 4 Calculando a média , temos f = 0, o que significa que o elemento procurado está no conjunto r 1+ = {4, 5, 6, 7}. As duas novas partições são: r −2 = {4, 5} e r +2 = {6, 7}. O primeiro registrador é reinicializado como o ensemble {( 1 1 , |4〉), ( , |5〉)}, 2 2 e o segundo registrador como o ensemble {1, |0〉}. A matriz densidade associada aos dois registradores é ρ= 1 ((|4〉〈4| ⊗ |0〉〈0|) + (|5〉〈5| ⊗ |0〉〈0|)). 2 Aplicando U f sobre ρ, obtemos: 2075 1 ((|4〉〈4| ⊗ |f(4)〉〈f(4)|) + (|5〉〈5| ⊗ |f(5)〉〈f(5)|)) 2 1 = ((|4〉〈4| ⊗ |1〉〈1|) + (|5〉〈5| ⊗ |0〉〈0|)) 2 U f ρU +f = O ensemble associado ao segundo registrador é {( Calculando a média , temos f = 1 1 , |1〉), ( , |0〉)}. 2 2 1 . O conjunto que contém o elemento procurado é então o 2 conjunto r 2076 O enfoque dado trata apenas da parte teórica. Entretanto, já existem resultados experimentais que implementam o algoritmo usando técnicas de ressonâcia magnética nuclear [1, 7]. Um deficiência dos algoritmos baseados em ensembles é que o custo de armazenamento dos dados do problema é proporcional a quantidade desses dados [1, 7]. Por outro lado, os algoritmos baseados em ensembles não apresentam o problema da descoerência [8], que é uma das principais dificuldades na implementação dos algoritmos quânticos. O desenvolvimento de algoritmos quânticos ainda é uma área muito recente e pouco explorada. Entretanto, já existem aplicações em problemas de otimização [9] e em problemas envolvendo grafos [2, 5]. Trabalhos neste sentido estão em andamento. Referências [1] R. Brüschweiler, Novel strategy for database searching in spin Liouville space by NMR ensemble computing, Phys. Rev. Lett., 85 (2000), 4815-4818. [2] C. Dürr, M. Mhalla, and Y. Lei, Quantum query complexity of graph connectivity, arXiv: quant-ph/0303169, (2003). [3] L.K. Grover, A fast quantum mechanical algorithm for database search, Proc. 28th Annual ACM Symposium on the Theory of Computing (STOC), (1996), 212-219. [4] L.K. Grover, Quantum Mechanics helps in searching for a needle in a haystack, Phys. Rev. Lett., 79 (1997), 325-328. [5] M. Heiligman, Quantum algorithms for lowest weight paths and spanning trees in complete graphs, arXiv: quant-ph/0303131, (2003). [6] C. Lavor, L.R.U. Manssur e R. Portugal, Grover’s Algorithm: Quantum Database Search, arXiv: quant-ph/0301079, (2003). [7] Z.L. Madi, R. Brüschweiler, and R.R. Ernst, One- and two-dimensional ensemble quantum computing in spin Liouville space, J. Chem. Phys, 109 (1998), 10603-10611. [8] M.A. Nielsen e I.L. Chuang, Quantum Computation and Quantum Information, Cambridge University Press, Cambridge (2000). [9] V. Protopopescu, C. D’Helon, and J. Barhen, Exponentially fast solution to the global optimization problem using Brüschweiler’s ensemble search algorithm , arXiv: quantph/0301007, (2003). [10] P. Shor, Algorithms for Quantum Computation: Discrete logarithms and factoring, SIAM J. Comp., 26 (1997), 1484-1509. 2077