O algoritmo de Grover é usado, entre outras coisas, para pesquisar um item em uma lista não ordenada de itens de comprimento . Embora haja muitas perguntas aqui sobre esse tópico, ainda não entendi o ponto.
Pesquisando em uma lista, da maneira clássica
Normalmente, eu projetaria uma função de pesquisa dessa maneira
Portanto, dou a lista e o item desejado como entradas e recebo a posição do item na lista como saída. Eu acho que entendi que as informações sobre \ mathbf {y} estão incorporadas no algoritmo através do oracle gate O , então nossa função se torna
\ mathrm {search} _ \ mathbf {y} ([\ mathbf {x} _1, \ mathbf {x} _2, ..., \ mathbf {x} _n]) = i \ in \ mathbb {N} \ quad \ text {tal que} \ mathbf {x} _i = \ mathbf {y}
Vamos fazer um exemplo prático. Considere pesquisar o ás de espadas 1 \ spadesuit
A lista de comprimento é .
O elemento desejado é . Eu deveria obter . Cada placa pode ser codificada com bits, a lista possui 8 elementos, portanto precisamos de 6 \ times 8 = 48 bits para codificar a lista. Nesse caso, o oráculo O implementará a função:
Entretanto, a entrada do algoritmo de Grover não é um estado de qubits.
(Nota: a imagem do baralho embaralhado é tirada daqui )
Grover e seu oráculo
Várias fontes (por exemplo, aqui - explicadas graficamente) dizem que a entrada do algoritmo é diferente: a entrada é um estado retirado do espaço de pesquisa onde é o número de elementos da lista. Cada número corresponde à posição de um elemento na lista.
A entrada de agora é um vetor de qubit , que deve ser uma superposição de todos os itens no espaço de pesquisa .
Nós sabemos
- corresponde a ;
- corresponde a ;
- corresponde a ;
- corresponde a que é o elemento desejado;
- e assim por diante...
Nesse caso, temos
Mas, neste caso, nosso oráculo teria que implementar a função
Construir o oráculo exige que saibamos que está na posição 5. Qual é o sentido de executar o algoritmo se já tivermos pesquisado o elemento para construir o oráculo?
fonte
Respostas:
Se você tiver 8 itens na lista (como no exemplo do seu cartão), a entrada do oracle é de 3 (qu) bits. O número de cartões no baralho (52) é irrelevante, você precisa de 3 bits apenas para codificar 8 cartões.
Você pode pensar que 3 bits codificam a posição na lista do cartão que você está procurando; então você não sabe a posição, mas o oráculo sabe. Portanto, se você estiver pesquisando o ás de espadas, o oráculo saberá que o ás de espadas é a sexta carta (ou a quinta contando a partir de zero) e implementa a função
PS: É melhor pensar no algoritmo de Grover de maneira diferente: você tem um oracle implementando uma função booleana que gera para uma única combinação de bits de entrada, caso contrário, gera zero, e sua tarefa é encontrar a combinação. O problema tem a mesma complexidade da pesquisa em uma lista ou banco de dados não classificado, é por isso que o algoritmo de Grover é geralmente descrito como pesquisa em um banco de dados não classificado. Mas aplicar o algoritmo a uma pesquisa no banco de dados do mundo real realmente levanta questões que estão além do próprio algoritmo. O algoritmo de Grover está apenas procurando o que o oráculo sabe.1
fonte
Embora talvez seja mais fácil pensar na função do oráculo como já tendo calculado todos esses valores, não é isso que está fazendo. No caso descrito, o oracle possui 8 entradas possíveis (ou seja, codificadas em 3 (qu) bits), e o oracle faz todo o cálculo necessário em tempo real . Portanto, no momento em que você tenta avaliar o oráculo por algum valor , o oráculo procura (nesse caso) a carta que o valor de xx x corresponde a e, em seguida, verifica se esse cartão é o cartão marcado. A idéia é que cada vez que você chama o oráculo, ele passa por esse processo uma vez. No geral, você avalia a função várias vezes que é igual ao número de vezes que chama o oráculo. O objetivo de qualquer algoritmo de busca é chamar esse oráculo o menor número de vezes possível.
Caso isso pareça um pouco circular (dada uma entrada , encontre qual cartão corresponde), lembre-se de que sua tabela de consulta para qual x corresponde a qual cartão pode ser solicitadax x que é uma pergunta de pesquisa diferente, mais simples e muito mais rápida.
As principais diferenças em seu exemplo em comparação com um cenário de uso mais realista são:
O espaço de pesquisa geralmente é enorme. Não existe uma perspectiva realista de pré-computar todos os valores. Na verdade, é exatamente isso que estamos tentando evitar.
Normalmente, na verdade não dizemos 'encontre o ás de espadas'. Em vez disso, há um que não é trivial para avaliar para testar se x é o item 'marcado' ou não. O fato de o oráculo levar muito tempo para avaliar, mesmo para uma única entrada, é o que torna o oráculo a parte mais cara a ser implementada (e todos os outros portões são fornecidos gratuitamente) e por que você precisa minimizar o número de chamadas .f(x) x
Então, realmente, a maneira como uma pesquisa clássica funcionaria no seu problema é: escolha um aleatoriamente. Avalie y = f ( x ) . Se y = 1 , retorne x , caso contrário, repita. Enquanto o efeito líquido de f ( x ) é 'é a entrada x 0 , a entrada marcada?', Esse não é o cálculo real que ele faz.x y=f(x) y=1 x f(x) x0
fonte
A questão é, em última análise: "Qual é o sentido de executar o algoritmo se já pesquisamos o elemento para construir o oráculo?"
Enquanto alguém pré-construiu o oráculo, pode não ter sido a pessoa que o usou.
Perguntamos ao oráculo: qual é a resposta que ele já tem para a pergunta que já tem? Até Mateus e Omar perguntariam o "oráculo para um símbolo de alfabeto particular" durante o tempo de execução, quais são as posições de seu símbolo na string que ele já compilou? O oráculo dará a resposta para a nossa consulta após apenas uma consulta, mas nesta história, ele não pode, por exemplo, simplesmente escrever a resposta como uma sequência binária e enviá-la para nós através de um canal de comunicação clássico. Esconderá sua resposta em uma superposição para que possamos extraí-la.
Deixei que a fantasia ou a metáfora fuja nesta próxima parte: não ouvimos a resposta da primeira vez e precisamos pedir ao oráculo que repita a mesma resposta repetidamente até ter certeza do que o oráculo disse: exceto que começamos a alucinar da desinformação no processo de difusão, se pedirmos muitas vezes.
fonte
Dado o oráculo que você forneceu, a pesquisa é realmente inútil. No entanto, esse oráculo perde o objetivo do algoritmo de Grover, porque procurar uma carta em um baralho de cartas não é uma busca não estruturada, porque, como você afirmou, você já conhece a ordem. Portanto, sua pesquisa está estruturada. A razão pela qual esse oráculo é usado é que ele demonstra como o Grover pode ser aplicado sem ter que discutir um oráculo que tornaria Grover útil, porque esse oráculo seria mais complicado do que valioso. Portanto, um oráculo melhor para demonstrar a utilidade de Grover pode ser algo como:
O que esse oráculo implica é que você tem uma pesquisa de 8 qubit, na qual você pega os quatro primeiros qubits e os adiciona aos quatro qubits seguintes e vira M se a adição fizer 10 (1010 em binário). A diferença entre esse oráculo e o que você forneceu é que esse oráculo testa um padrão (os operandos somam 10) enquanto o seu testa a igualdade (esse é o índice 5). Esse oráculo é muito mais difícil de construir, mas aproveita o verdadeiro poder do Grover, que é, em essência, uma busca por força bruta em que seu oráculo define o espaço de busca.
fonte