Escolhendo o número de iterações
Estabelecemos que o vetor de estado do registrador no algoritmo de Grover permanece no subespaço bidimensional gerado por e uma vez que a etapa de inicialização tenha sido executada.
O objetivo é encontrar um elemento , e esse objetivo será alcançado se conseguirmos obter o estado — pois se medirmos esse estado, teremos a garantia de obter um resultado de medição . Dado que o estado de após iterações na etapa 2 é
devemos escolher de forma que
seja o mais próximo possível de em valor absoluto, para maximizar a probabilidade de obter a partir da medição. Para qualquer ângulo , o valor oscila conforme aumenta, mas não é necessariamente periódico — não há garantia de que obteremos o mesmo valor duas vezes.
Naturalmente, além de tornar grande a probabilidade de obter um elemento a partir da medição, também gostaríamos de escolher o menor possível, porque aplicações da operação requerem consultas à função . Como queremos que seja próximo de em valor absoluto, uma forma natural de fazer isso é escolher de forma que
Isolando , obtemos
É claro que deve ser um inteiro, portanto não necessariamente conseguiremos atingir exatamente esse valor — mas o que podemos fazer é tomar o inteiro mais próximo desse valor, que é
Esse é o número recomendado de iterações para o algoritmo de Grover. À medida que prosseguirmos com a análise, veremos que a proximidade desse inteiro em relação ao valor-alvo afeta naturalmente o desempenho do algoritmo.
(A título de observação: se o valor-alvo estiver exatamente no meio entre dois inteiros, esta expressão de é o que obtemos ao arredondar para cima. Poderíamos, alternativamente, arredondar para baixo, o que faz sentido pois significa uma consulta a menos — mas isso é secundário e sem importância para o propósito desta lição.)
Lembrando que o valor do ângulo é dado pela fórmula
vemos que o número recomendado de iterações depende do número de strings em . Isso representa um desafio se não soubermos quantas soluções temos, como discutiremos mais adiante.
Busca única
Primeiro, vamos nos concentrar na situação em que existe uma única string tal que . Outra forma de dizer isso é que estamos considerando uma instância do problema de Busca única. Nesse caso, temos
que pode ser convenientemente aproximado como
quando se torna grande. Se substituirmos na expressão
obtemos
Lembrando que é não apenas o número de vezes que a operação é executada, mas também o número de consultas à função exigido pelo algoritmo, vemos que estamos no caminho certo para obter um algoritmo que requer consultas.
Agora investigaremos quão bem a escolha recomendada de funciona. A probabilidade de que a medição final resulte na solução única pode ser expressa explicitamente como
O primeiro argumento, refere-se ao número de itens sobre os quais estamos buscando, e o segundo argumento, que é neste caso, refere-se ao número de soluções. Um pouco mais adiante usaremos a mesma notação de forma mais geral, onde há múltiplas soluções.
Aqui está uma tabela das probabilidades de sucesso para valores crescentes de .
Observe que essas probabilidades não são estritamente crescentes. Em particular, temos uma anomalia interessante quando , onde obtemos uma solução com certeza. Pode-se, no entanto, provar em geral que
para todo , portanto a probabilidade de sucesso tende a no limite conforme se torna grande, como os valores acima parecem sugerir. Isso é ótimo!
Observe, porém, que mesmo um limite fraco como estabelece a utilidade do algoritmo de Grover. Para qualquer resultado de medição que obtenhamos ao executar o procedimento, sempre podemos verificar se usando uma única consulta a . E se deixarmos de obter a string única para a qual com probabilidade de no máximo ao executar o procedimento uma vez, então após execuções independentes do procedimento teremos deixado de obter essa string única com probabilidade de no máximo . Ou seja, usando consultas a , obteremos a solução única com probabilidade de pelo menos . O uso do limite mais preciso revela que a probabilidade de encontrar usando esse método é na verdade pelo menos .
Múltiplas soluções
À medida que o número de elementos em varia, o ângulo também varia, o que pode ter um efeito significativo na probabilidade de sucesso do algoritmo. Por brevidade, vamos escrever para denotar o número de soluções, e como antes assumiremos que .
Como exemplo motivador, vamos imaginar que temos soluções em vez de uma única solução, como consideramos acima. Isso significa que
que é aproximadamente o dobro do ângulo que tínhamos no caso quando é grande. Suponha que, por desconhecimento, escolhêssemos o mesmo valor de que no cenário de solução única:
O efeito será catastrófico, como a seguinte tabela de probabilidades revela.
Desta vez, a probabilidade de sucesso tende a conforme tende ao infinito. Isso acontece porque estamos efetivamente girando duas vezes mais rápido do que quando havia uma solução única, de modo que acabamos ultrapassando o alvo e pousando próximo de .
Porém, se em vez disso usarmos a escolha recomendada de , que é
para
então o desempenho será melhor. Para ser mais preciso, usar essa escolha de leva ao sucesso com alta probabilidade.
Generalizando o que foi afirmado anteriormente, pode-se provar que
onde estamos usando a notação sugerida anteriormente: denota a probabilidade de que o algoritmo de Grover executado por iterações revele uma solução quando há soluções no total dentre possibilidades.
Esse limite inferior de sobre a probabilidade de sucesso é ligeiramente peculiar, pois mais soluções implica um limite inferior pior — mas sob a suposição de que é significativamente menor que , concluímos, ainda assim, que a probabilidade de sucesso é razoavelmente alta. Como antes, o simples fato de que é razoavelmente grande implica a utilidade do algoritmo.
Também acontece que
Esse limite inferior descreve a probabilidade de que uma string selecionada uniformemente ao acaso seja uma solução — portanto o algoritmo de Grover sempre se sai pelo menos tão bem quanto um palpite aleatório. (De fato, quando , o algoritmo de Grover é um palpite aleatório.)
Agora vamos analisar o número de iterações (e portanto o número de consultas)
para
Para todo , vale que , e portanto
Isso implica que
Isso se traduz em uma economia no número de consultas conforme cresce. Em particular, o número de consultas necessário é
Número desconhecido de soluções
Se o número de soluções é desconhecido, então uma abordagem diferente é necessária, pois nessa situação não temos conhecimento de para informar nossa escolha de . Existem, de fato, múltiplas abordagens.
Uma abordagem simples é escolher
uniformemente ao acaso. Selecionar dessa forma sempre encontra uma solução (assumindo que uma exista) com probabilidade maior que 40%, embora isso não seja óbvio e requeira uma análise que não será incluída aqui. Faz sentido, no entanto, especialmente quando pensamos no quadro geométrico: girar o estado de um número aleatório de vezes dessa forma não é diferente de escolher um vetor unitário aleatório no espaço gerado por e , para o qual é provável que o coeficiente de seja razoavelmente grande. Repetindo esse procedimento e verificando o resultado da mesma forma descrita anteriormente, a probabilidade de encontrar uma solução pode ser tornada muito próxima de .
Existe um método refinado que encontra uma solução quando ela existe usando consultas, mesmo quando o número de soluções não é conhecido, e requer consultas para determinar que não há soluções quando .
A ideia básica é escolher uniformemente ao acaso do conjunto iterativamente, para valores crescentes de . Em particular, podemos começar com e aumentá-lo exponencialmente, sempre encerrando o processo assim que uma solução for encontrada e limitando de modo a não desperdiçar consultas quando não houver solução. O processo aproveita o fato de que menos consultas são necessárias quando mais soluções existem. É necessário, no entanto, algum cuidado para equilibrar a taxa de crescimento de com a probabilidade de sucesso em cada iteração. (Tomar funciona, por exemplo, como uma análise revela. Dobrar , porém, não funciona — isso acaba sendo um aumento rápido demais.)
Os casos triviais
Ao longo da análise que acabamos de realizar, assumimos que o número de soluções é diferente de zero. De fato, ao nos referirmos aos vetores
implicitamente assumimos que e são ambos não vazios. Aqui consideraremos brevemente o que acontece quando um desses conjuntos é vazio.
Antes de nos preocuparmos com uma análise, vamos observar o óbvio: se toda string é uma solução, veremos uma solução ao medir; e quando não há soluções, não veremos nenhuma. Em certo sentido, não há necessidade de ir mais fundo que isso.
Podemos, no entanto, verificar rapidamente a matemática para esses casos triviais. A situação em que um dos conjuntos e é vazio ocorre quando é constante; é vazio quando para todo e é vazio quando para todo Isso significa que
e portanto
Portanto, independentemente do número de iterações que realizarmos nesses casos, as medições sempre revelarão uma string aleatória uniforme .