Come viene applicato l'algoritmo Grover a un database?


12

Domanda

Voglio usare l'algoritmo Grover per cercare un elemento x un database non ordinato . Ora sorge la domanda, come posso inizializzare l'indice e il valore del database con i qubit?

Esempio

  • Diciamo che ho 4 qubit. Pertanto, è possibile mappare 24=16 valori classici.
  • Il mio database non ordinato d ha i seguenti elementi: d[Value]=[3,2,0,1] .
  • Voglio cercare x=2d=10b=|10 .
  • Il mio approccio: indicizzare il database d con d[(Index, Value)]=[(0,3),(1,2),(2,0),(3,1)] . Registra 0 e 1 per l'indice e registri 2 e 3 per il valore. Quindi applicare l'algoritmo Grover solo ai registri 2 e 3(Value) . Questo può essere realizzato? C'è un altro approccio?

Cosa ho già implementato ( su GitHub )

"Grover-Algorithm with 2-, 3-, 4-Qubits", ma ciò che fa è semplice: i bit sono inizializzati con |0 , l'oracolo segnerà la mia soluzione x (che è solo un numero come 2d=10b ), la parte Grover aumenterà la probabilità dell'elemento selezionato x e diminuire tutte le altre probabilità e poi i qubit sono leggere da essere mappato ai bit classici. Lasciamo che questo processo venga eseguito più volte in successione e quindi otteniamo una distribuzione di probabilità, dove la probabilità più alta ha il nostro elemento ricercato x .

L'output è sempre uguale a quello contrassegnato nell'oracolo. Come posso generare più informazioni dall'output, che non conosco al momento in cui ho costruito l'oracolo?

Risposte:


9

Ho lavorato anche su questo problema. Come principiante e programmatore classico (cioè, non parlo di Meccanica Quantistica), è difficile comprendere i concetti senza esempi completi. Ho lavorato con l' esempio di ricerca nel database Microsoft Q # . Cerca semplicemente un indice / chiave specifici nel database, il che non è molto utile. Ho ampliato quel campione per cercare un elenco di valori in un database e restituire la chiave corrispondente.

Come nel tuo esempio, esiste un "registro chiave" a due qubit per gli indici e un registro separato a due qubit per i valori. C'è anche un quinto "qubit contrassegnato" che proviene dall'esempio di Microsoft, per indicare quando viene trovato il valore desiderato. Le chiavi e i valori sono associati tramite entanglement. Ciò è meglio dimostrato con un circuito. Fai clic qui per vedere il circuito Quirk attuale .

Chiave / Valore Oracle Circuit

Si noti che questo circuito contiene solo l'oracolo. Non implementa tutto l'algoritmo di Grover.

  • I primi due qubit sono il registro delle chiavi, i due successivi sono il registro dei valori e il qubit inferiore è il qubit contrassegnato.
  • La prima sezione mette il registro delle chiavi in ​​una sovrapposizione uniforme usando le porte Haramard, come richiesto dall'algoritmo di Grover.
  • La seconda sezione è dove le chiavi sono associate ai valori tramite entanglement. Ogni chiave è intrecciata con un valore corrispondente nel registro valori applicando porte X (anti) controllate. Quindi, quando il registro chiavi è 0, il registro valori sarà impostato su 3. Quando la chiave è 1, il valore è impostato su 2 e così via.
  • La terza sezione del circuito è l'oracolo della ricerca. Il registro valori è impigliato con il qubit contrassegnato. In questo esempio, il valore desiderato è 2. Quando il registro valori contiene 2, il qubit contrassegnato verrà impostato su 1.
  • L'algoritmo di Grover esamina il registro delle chiavi e contrassegna qubit. L'oracolo di ricerca esamina il registro valori e imposta il qubit contrassegnato. Ciò causerà l'amplificazione della chiave 1 quando il valore è 2.

È interessante notare che le chiavi e i valori non sono memorizzati nei qubit, ma piuttosto nel circuito / programma. Si potrebbe dire che non è davvero un database in sé. È più simile a un'istruzione switch / case, ma può essere eseguita su una sovrapposizione di valori.

Per maggiori dettagli, avvertenze e codice Q #, consultare il mio repository GitHub .

EDIT: Qualcosa che capisco meglio da quando ho risposto ... devi invertire / annullare il circuito come parte di ogni iterazione. Nel codice Q #, la chiamata Adjoint StatePreparationOracle () all'interno dell'operazione ReflectStart () gestisce questo, quindi non ho dovuto farlo esplicitamente. Non so se Qiskit abbia una funzione simile. Se ho eseguito correttamente la traduzione, ecco un circuito completo per l'esempio sopra.


Grazie! Questo è esattamente quello che stavo cercando.
alex

Quindi per la parte Grover: devo solo fare le cose di amplificazione con i registri dei tasti (2 qubit in questo esempio)? Come sono collegati al qubit contrassegnato?
alex

Secondo il campione Q #, "L'algoritmo di Grover richiede riflessioni sullo stato contrassegnato e sullo stato iniziale", quindi è necessario operare sia con il qubit contrassegnato che con il registro delle chiavi. Se segui il codice nell'operazione QuantumSearch (), vedrai che ReflectMarked () viene chiamato solo con il qubit contrassegnato. ReflectZero () viene anche chiamato in seguito con una combinazione del qubit contrassegnato e del registro dei tasti. Inoltre, consulta la Modifica sopra.
Joel Leach,

3

n=4

i|i|d(i)
f(i)=2

Penso che sia meglio pensare all'algoritmo di ricerca quantistica come ad ottimizzare una funzione, invece di cercare in un elenco / database. Ecco un articolo su cui ho lavorato in cui viene utilizzata la ricerca quantistica per risolvere un problema di massimizzazione combinatoria se si desidera proseguire la propria comprensione dell'algoritmo.


Grazie per la risposta! Pertanto, l'algoritmo Grover è meno adatto per la ricerca nel database. Ho trovato una domanda correlata qui .
alex

Esiste uno pseudo codice (o codice Qiskit) per risolvere questo problema di ricerca DB?
alex

Dovrai cercare, ma dovrebbe essere facile da trovare tra i framework.
cnada,

3

È necessario convertire l'oracolo per contenere anche il database, di conseguenza, l'oracolo generale (Phase Inversion) avrà due sub-oracoli per dare un'occhiata alla figura. Circuito algoritmo di Grover generale per la ricerca nel database

Il primo sub-oracolo che deve essere preparato è il circuito di memoria, a differenza di QRAM che memorizza i dati quantistici (stato) nel suo corpo, questo circuito di memoria (array) è preparato per memorizzare solo informazioni classiche nel suo frame. Un esempio di questo tipo di circuito che memorizza una serie di binari [010, 110, 100, 011] è mostrato di seguito: esempio per un circuito di memoria Per ulteriori informazioni, leggi questo documento .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.