He estado trabajando en este problema también. Como principiante y programador clásico (es decir, no hablo de mecánica cuántica), es difícil comprender los conceptos sin ejemplos completos. He estado trabajando con la muestra de Microsoft Q # Database Search . Simplemente busca un índice / clave específico en la base de datos, lo que no es muy útil. He ampliado esa muestra para buscar una lista de valores en una base de datos y devolver la clave correspondiente.
Como con su ejemplo, hay un "registro de clave" de dos qubits para los índices y un registro de dos qubits separado para los valores. También hay un quinto "qubit marcado" que proviene de la muestra de Microsoft, para indicar cuándo se encuentra el valor deseado. Las claves y los valores se asocian mediante enredos. Eso se demuestra mejor con un circuito. Haga clic aquí para ver el circuito Quirk real .
Tenga en cuenta que este circuito contiene solo el oráculo. No implementa todo el algoritmo de Grover.
- Los dos qubits superiores son el registro clave, los dos siguientes son el registro de valores y el qubit inferior es el qubit marcado.
- La primera sección coloca el registro de clave en una superposición uniforme utilizando puertas Haramard, como lo requiere el algoritmo de Grover.
- La segunda sección es donde las claves están asociadas con los valores a través del enredo. Cada clave se enreda con un valor correspondiente en el registro de valores mediante la aplicación de puertas X (anti) controladas. Entonces, cuando el registro de clave es 0, entonces el registro de valor se establecerá en 3. Cuando la clave es 1, el valor se establece en 2, y así sucesivamente.
- La tercera sección del circuito es el oráculo de búsqueda. El registro del valor está enredado con el qubit marcado. En este ejemplo, el valor deseado es 2. Cuando el registro de valor contiene 2, el qubit marcado se establecerá en 1.
- El algoritmo de Grover examina el registro de clave y el qubit marcado. El oráculo de búsqueda observa el registro de valores y establece el qubit marcado. Esto hará que la clave 1 se amplifique cuando el valor sea 2.
Es interesante observar que las claves y los valores no se almacenan en los qubits, sino en el circuito / programa. Se podría decir que no es realmente una base de datos per se. Es más como una declaración de cambio / caso, pero que puede ejecutarse en una superposición de valores.
Para obtener más detalles, advertencias y código Q #, consulte mi repositorio de GitHub .
EDITAR: Algo que entiendo mejor desde que respondí ... tienes que invertir / deshacer el circuito como parte de cada iteración. En el código Q #, la llamada Adjoint StatePreparationOracle () dentro de la operación ReflectStart () maneja esto, por lo que no tuve que hacerlo explícitamente. No sé si Qiskit tiene una característica similar. Si he hecho la traducción correctamente, aquí hay un circuito completo para el ejemplo anterior.