Em computação quântica, o algoritmo de Grover, também conhecido como algoritmo de busca quântica, é um algoritmo quântico para busca não estruturada que encontra com alta probabilidade a única entrada para uma função de caixa preta que produz um determinado valor de saída, usando apenas avaliações da função, onde é o tamanho do domínio da função. Ele foi concebido por Lov Grover em 1996.
O problema análogo na computação clássica teria uma complexidade de consulta de (isto é, a função teria de ser avaliada vezes: não existe abordagem melhor do que testar todos os valores de entrada um após o outro, o que, em média, leva passos).
Charles H. Bennett, Ethan Bernstein, Gilles Brassard e Umesh Vazirani provaram que qualquer solução quântica para o problema precisa avaliar a função vezes, logo o algoritmo de Grover é assintoticamente ótimo. Uma vez que os algoritmos clássicos para problemas NP-completos requerem um número exponencial de passos, e o algoritmo de Grover fornece, no máximo, uma aceleração quadrática sobre a solução clássica para a busca não estruturada, isso sugere que o algoritmo de Grover, por si só, não fornecerá soluções em tempo polinomial para problemas NP-completos (já que a raiz quadrada de uma função exponencial continua sendo uma função exponencial, não polinomial).
Ao contrário de outros algoritmos quânticos, que podem fornecer aceleração exponencial sobre suas contrapartes clássicas, o algoritmo de Grover fornece apenas uma aceleração quadrática. No entanto, mesmo uma aceleração quadrática é considerável quando é grande, e o algoritmo de Grover pode ser aplicado para acelerar amplas classes de algoritmos. O algoritmo de Grover poderia quebrar por força bruta uma chave criptográfica simétrica de 128 bits em aproximadamente 264 iterações, ou uma chave de 256 bits em cerca de 2128 iterações. Porém, pode não ser o caso de que o algoritmo de Grover represente um risco significativamente maior à criptografia do que os algoritmos clássicos existentes.
O algoritmo de Grover, junto com variantes como a amplificação de amplitude, pode ser usado para acelerar uma ampla gama de algoritmos. Em particular, algoritmos para problemas NP-completos que contêm buscas exaustivas como uma sub-rotina podem ser acelerados pelo algoritmo de Grover. O melhor algoritmo teórico atual, em termos de complexidade de pior caso, para o 3SAT é um desses exemplos. Problemas genéricos de satisfação de restrições também veem acelerações quadráticas com o algoritmo de Grover. Esses algoritmos não exigem que a entrada seja dada na forma de um oráculo, já que o algoritmo de Grover é aplicado com uma função explícita, por exemplo, a função que verifica se um conjunto de bits satisfaz uma instância do 3SAT. No entanto, não está claro se o algoritmo de Grover poderia acelerar os melhores algoritmos práticos para esses problemas.
O algoritmo de Grover também pode fornecer acelerações comprováveis para problemas de caixa preta na complexidade de consulta quântica, incluindo a distinção de elementos e o problema da colisão (resolvido com o algoritmo de Brassard–Høyer–Tapp). Nestes tipos de problemas, trata-se a função oráculo f como um banco de dados, e o objetivo é usar a consulta quântica a essa função o menor número de vezes possível.
O algoritmo de Grover essencialmente resolve a tarefa de inversão de função. Em termos gerais, se temos uma função que pode ser avaliada em um computador quântico, o algoritmo de Grover nos permite calcular quando recebemos . Consequentemente, o algoritmo de Grover fornece amplas acelerações assintóticas para muitos tipos de ataques de força bruta em criptografia de chave simétrica, incluindo ataques de colisão e ataques de preimagem. No entanto, esse não é necessariamente o algoritmo mais eficiente; por exemplo, o algoritmo rho de Pollard é capaz de encontrar uma colisão no SHA-2 de forma mais eficiente que o algoritmo de Grover.
O artigo original de Grover descrevia o algoritmo como um algoritmo de busca em banco de dados, e essa descrição ainda é comum. O banco de dados nessa analogia é uma tabela de todas as saídas da função, indexadas pela entrada correspondente. No entanto, esse banco de dados não é representado explicitamente. Em vez disso, um oráculo é invocado para avaliar um item pelo seu índice. Ler um banco de dados completo item por item e convertê-lo para essa representação pode demorar muito mais do que a busca de Grover em si. Para dar conta de tais efeitos, o algoritmo de Grover pode ser visto como resolvendo uma equação ou satisfazendo um problema de restrição. Nessas aplicações, o oráculo é uma forma de verificar a restrição e não está relacionado ao algoritmo de busca. Essa separação geralmente impede otimizações algorítmicas, ao passo que os algoritmos de busca convencionais frequentemente dependem dessas otimizações e evitam a busca exaustiva. Felizmente, uma implementação rápida de oráculo para o algoritmo de Grover é possível em muitos problemas de satisfação de restrições e otimização.
A principal barreira para implementar uma aceleração a partir do algoritmo de Grover é que o ganho quadrático alcançado é muito modesto para superar a grande sobrecarga dos computadores quânticos de curto prazo. Contudo, gerações futuras de computadores quânticos tolerantes a falhas, com melhor desempenho de hardware, poderão conseguir realizar essas acelerações para instâncias práticas de dados.
Como entrada para o algoritmo de Grover, suponha que tenhamos uma função . Na analogia do "banco de dados não estruturado", o domínio representa os índices de um banco de dados, e se o dado que aponta satisfaz o critério de busca. Assumimos adicionalmente que apenas um índice satisfaz , e chamamos esse índice de . Nosso objetivo é identificar .
Podemos acessar com uma sub-rotina (às vezes chamada de oráculo) na forma de um operador unitário que age da seguinte forma:
Isso utiliza o espaço de estados de dimensões, fornecido por um registrador com qubits. Isso é frequentemente escrito como:
O algoritmo de Grover retorna com probabilidade de pelo menos utilizando aplicações de . Esta probabilidade pode se tornar arbitrariamente grande rodando-se o algoritmo de Grover múltiplas vezes. Se alguém rodar o algoritmo de Grover até que seja encontrado, o número esperado de aplicações continuará sendo , uma vez que, em média, ele será executado apenas duas vezes.
Esta seção compara o oráculo acima com um oráculo .
O é diferente do oráculo quântico padrão para uma função . Este oráculo padrão, denotado aqui como , usa um sistema de qubits auxiliares (ancilla). A operação então representa uma inversão (porta NOT) no sistema principal condicionada ao valor de f(x) vindo do sistema auxiliar:
ou resumidamente,
Esses oráculos são tipicamente realizados utilizando a descomputação (uncomputation).
Se nos é dado como o nosso oráculo, então também podemos implementar , já que é equivalente a quando o qubit auxiliar está no estado :
Desta forma, o algoritmo de Grover pode ser executado independentemente de qual oráculo seja dado. Se é dado, então devemos manter um qubit adicional no estado e aplicar no lugar de .

Os passos do algoritmo de Grover são dados a seguir:
Para o valor corretamente escolhido de , a saída será com probabilidade aproximando-se de 1 para N ≫ 1. A análise mostra que esse valor ideal para satisfaz .
Implementar as etapas deste algoritmo pode ser feito usando um número de portas lineares no número de qubits. Portanto, a complexidade de portas desse algoritmo é , ou por iteração.

Há uma interpretação geométrica do algoritmo de Grover, oriunda da observação de que o estado quântico do algoritmo de Grover permanece num subespaço bidimensional após cada passo. Considere o plano gerado por e ; equivalentemente, o plano gerado por e o ket perpendicular .
O algoritmo de Grover começa com o ket inicial , que se encontra no subespaço. O operador é uma reflexão no hiperplano ortogonal a para vetores no plano gerado por e , isto é, ele atua como uma reflexão através de . Isto pode ser visto escrevendo na forma de uma reflexão de Householder:
O operador é uma reflexão através de . Ambos os operadores e levam estados no plano gerado por e para estados no mesmo plano. Portanto, o algoritmo de Grover permanece neste plano por toda a sua execução.
É simples verificar que o operador de cada iteração de Grover gira o vetor de estado por um ângulo de . Assim, com iterações suficientes, podemos girar do estado inicial até o estado de saída desejado . O ket inicial está próximo do estado ortogonal a :
Em termos geométricos, o ângulo entre e é dado por
Nós precisamos parar quando o vetor de estado passar perto de ; depois disso, iterações subsequentes giram o vetor de estado para longe de , reduzindo a probabilidade de obter a resposta correta. A probabilidade exata de medir a resposta correta é
onde r é o número (inteiro) de iterações de Grover. O tempo mais curto em que conseguimos uma medição quase ótima é, portanto, .
Para completar a análise algébrica, precisamos descobrir o que acontece quando aplicamos repetidamente . Uma maneira natural de fazer isso é através da análise de autovalores de uma matriz. Note que durante todo o cálculo, o estado do algoritmo é uma combinação linear de e . Podemos escrever a ação de e no espaço gerado por como:
Portanto, na base (que não é ortogonal nem é base do espaço todo) a ação de aplicar seguido de é dada pela matriz
Esta matriz, por acaso, tem uma Forma de Jordan muito conveniente. Se definirmos , ela é
onde
Segue que a r-ésima potência da matriz (correspondente a r iterações) é
Usando essa forma, podemos usar identidades trigonométricas para calcular a probabilidade de observar ω após as r iterações mencionadas na seção anterior,
Alternativamente, é razoável imaginar que um tempo quase ótimo para a distinção seria quando os ângulos 2rt e −2rt estivessem o mais distantes possível, o que corresponde a , ou . O sistema estará então no estado
Um pequeno cálculo mostra agora que a observação produz a resposta correta ω com erro .
Se, em vez de 1 entrada correspondente, houver k entradas correspondentes, o mesmo algoritmo funciona, mas o número de iterações deverá ser de em vez de .
Existem diversas maneiras de lidar com a situação se k for desconhecido. Uma solução simples tem desempenho ótimo a menos de um fator constante: execute o algoritmo de Grover repetidamente para valores de k cada vez menores, por exemplo, tomando k = N, N/2, N/4, ..., e assim por diante, tomando para a iteração t até que uma entrada correspondente seja encontrada.
Com uma probabilidade suficientemente alta, uma entrada marcada será encontrada na iteração para alguma constante c. Portanto, o número total de iterações executadas é de, no máximo,
Outra abordagem se k for desconhecido é derivá-lo através do algoritmo de contagem quântica previamente.
Se (ou se o algoritmo de Grover tradicional de estado marcado único for rodado com ), o algoritmo não fornecerá amplificação. Se , aumentar k começará a elevar o número de iterações necessárias para se obter uma solução. Por outro lado, se , uma simples verificação clássica do oráculo sobre uma única escolha aleatória de entrada terá mais chances de fornecer uma solução correta do que não.
Uma versão desse algoritmo é usada para resolver o problema da colisão.
Uma modificação do algoritmo de Grover, chamada de busca parcial quântica, foi descrita por Grover e Radhakrishnan em 2004. Na busca parcial, não se tem o interesse em encontrar o endereço exato do item procurado, apenas os primeiros dígitos desse endereço. Equivalentemente, podemos pensar em "dividir" o espaço de busca em blocos e depois perguntar "em que bloco está o item procurado?". Em muitas aplicações, uma pesquisa assim rende informações suficientes se o endereço alvo contém a informação almejada. Por exemplo, usando a analogia dada por L. K. Grover, se tivermos uma lista de alunos organizada por classificação da turma, podemos estar interessados apenas em saber se um aluno está no percentil inferior 25%, 25–50%, 50–75% ou 75–100%.
Para descrever a busca parcial, consideramos um banco de dados separado em blocos, cada um com tamanho . O problema de busca parcial é mais fácil. Considere a abordagem clássica – escolheríamos um bloco aleatoriamente e, em seguida, faríamos uma pesquisa normal pelo resto dos blocos (na linguagem da teoria dos conjuntos, o complemento). Se não encontrarmos o alvo, saberemos que ele se encontra no bloco em que não pesquisamos. O número médio de iterações cai de para .
O algoritmo de Grover requer iterações. A pesquisa parcial será mais rápida por um fator numérico que depende do número de blocos . A pesquisa parcial usa iterações globais e iterações locais. O operador global de Grover é designado e o operador local de Grover é designado .
O operador global de Grover atua sobre os blocos. Basicamente, ele é dado da seguinte forma:
Os valores ótimos de e são discutidos no artigo de Grover e Radhakrishnan. Pode-se também perguntar o que acontece caso sejam aplicadas pesquisas parciais sucessivas em diferentes níveis de "resolução". Essa ideia foi detalhadamente estudada por Vladimir Korepin e Xu, que a chamaram de busca quântica binária. Eles provaram que ela não é de fato mais rápida do que realizar uma única busca parcial.
O algoritmo de Grover é ótimo a menos de fatores subconstantes. Ou seja, qualquer algoritmo que acesse o banco de dados utilizando apenas o operador Uω deverá aplicar Uω pelo menos uma fração das vezes que o algoritmo de Grover o faz. A extensão do algoritmo de Grover para k entradas correspondentes, π(N/k)1/2/4, também é ótima. Este resultado é importante para entender os limites da computação quântica.
Se o problema de busca de Grover fosse solucionável com logc N aplicações de Uω, isso implicaria que NP estaria contido em BQP, transformando problemas em NP para problemas do tipo de busca de Grover. A otimalidade do algoritmo de Grover sugere que computadores quânticos não são capazes de resolver problemas NP-Completos em tempo polinomial e, portanto, NP não está contido em BQP.
Demonstrou-se que uma classe de computadores quânticos não-locais de variáveis ocultas poderia implementar a pesquisa num banco de dados de itens em, no máximo, passos. Isso é mais rápido do que os passos levados pelo algoritmo de Grover.
|doi-access=livre (ajuda)Implemented in /qcl-0.6.4/lib/grover.qcl