Eu tenho trabalhado nesse problema também. Como iniciante e programador clássico (ou seja, eu não falo Mecânica Quântica), é difícil entender os conceitos sem exemplos completos. Eu tenho trabalhado com o exemplo Microsoft Q # Database Search . Ele simplesmente procura por um índice / chave específico no banco de dados, o que não é muito útil. Eu expandi esse exemplo para pesquisar uma lista de valores em um banco de dados e retornar a chave correspondente.
Como no seu exemplo, há um "registro de chave" de dois qubit para os índices e um registro de dois qubit separado para os valores. Há também um quinto "qubit marcado" que vem da amostra da Microsoft, para indicar quando o valor desejado é encontrado. As chaves e os valores são associados via emaranhamento. Isso é melhor demonstrado com um circuito. Clique aqui para ver o circuito Quirk real .
Note que este circuito contém apenas o oráculo. Ele não implementa todo o algoritmo de Grover.
- Os dois qubits superiores são o registro de chaves, os dois seguintes são o registro de valores e o qubit inferior é o qubit marcado.
- A primeira seção coloca o registro de chaves em uma superposição uniforme usando portas Haramard, conforme exigido pelo algoritmo de Grover.
- A segunda seção é onde as chaves são associadas aos valores via emaranhamento. Cada chave é entrelaçada com um valor correspondente no registro de valores aplicando portas X (Anti) controladas. Portanto, quando o registro da chave for 0, o registro do valor será definido como 3. Quando a chave for 1, o valor será definido como 2 e assim por diante.
- A terceira seção do circuito é o oráculo de busca. O registro de valores está emaranhado com o qubit marcado. Neste exemplo, o valor desejado é 2. Quando o registro de valor contém 2, o qubit marcado será definido como 1.
- O algoritmo de Grover analisa o registro de chaves e o qubit marcado. O oracle de pesquisa examina o registro de valores e define o qubit marcado. Isso fará com que a chave 1 seja amplificada quando o valor for 2.
É interessante notar que as chaves e os valores não são armazenados nos qubits, mas no circuito / programa. Você poderia dizer que não é realmente um banco de dados em si. É mais como uma instrução switch / case, mas que pode ser executada com uma superposição de valores.
Para mais detalhes, advertências e código Q #, consulte meu repositório GitHub .
EDIT: Algo que eu entendo melhor desde a resposta ... você precisa reverter / desfazer o circuito como parte de cada iteração. No código Q #, a chamada Adjoint StatePreparationOracle () na operação ReflectStart () lida com isso, portanto, não precisei fazer isso explicitamente. Não sei se o Qiskit tem um recurso semelhante. Se eu fiz a tradução corretamente, aqui está um circuito completo para o exemplo acima.