Muss das Orakel in Grovers Algorithmus Informationen über die gesamte Datenbank enthalten?


8

Der Grover-Algorithmus wird häufig als eine Möglichkeit beschrieben, eine Datenbank in zu durchsuchen . Um es zu benutzen, brauchen wir ein Orakeltor, das eine Funktion so dass die Antwort ist. Aber wie macht man eigentlich so ein " Datenbank-Orakel "?ff - 1 (1)O(N)ff1(1)

Angenommen, ich habe ein Array von Zahlen , das genau einmal enthält , und ich muss den Index von finden . Auf einem klassischen Computer würde ich das Array in den Speicher laden und es durchlaufen, bis ich finde .w w wawww

Wenn zum Beispiel und , erwarte ich 2 als Antwort (oder 3 in 1-Indexierung).w = 0a=[3,2,0,1,2,3]w=0

Wie kann ich dieses Array in einem Quantencomputer darstellen und ein Gate für einige zurückgibt ? xaxx

Müssen Sie insbesondere die gesamte „Datenbank“ im Quantenspeicher haben (vorausgesetzt, es gibt einige Möglichkeiten, über Quantengatter auf klassische Register zuzugreifen)?


Antworten:


5

Nein, das tut es nicht.

Das " Orakel " in Grovers Algorithmus ist eine Funktion, die bei jedem Element prüft, ob das Element ist, beispielsweise . Dazu benötigt das Orakel keine Kenntnis aller anderen Elemente , die sich in der Datenbank befinden .x k x Ziel x jxkxkxtargetxj

Es kann hilfreich sein, ein konkreteres Beispiel zu betrachten. Angenommen, Sie haben eine Datenbank mit vierstelligen Telefonnummern, wobei das te Element in dieser Datenbank bezeichnet. Sie möchten wissen, welche Position in der Datenbank dem Element . Nehmen wir an, dass das Element 10000 der Datenbank das einzige derartige Element ist, und für alle .x k k 1234 x 10000 = 1234 x k1234 k 1000020000xkk1234x10000=1234xk1234k10000

Im klassischen Fall, da die Datenbank unsortiert ist, gibt es keinen besseren Weg, als jedes einzelne Element in der Datenbank durchzugehen und jedes mit dem Ziel . Dazu benötigen Sie nur einen Algorithmus, der bei zurückgibt, wenn und andernfalls . Eine äquivalente Möglichkeit, dieses Problem zu benennen, besteht darin, zu sagen, dass wir einen Algorithmus wollen, der bei einer Liste von Paaren das Paar so zurückgibt, dass ist was wir wollen. In unserem Fall wollen wir also einen Algorithmus, der zurückgibtx k ja x k = 1234 nein { ( k , x k ) } 20000 k = 1 x k { ( k , x k ) } 20000 k = 1 ( 10000 , x 10000 = 1234 ) x k1234xkyesxk=1234no{(k,xk)}k=120000xk{(k,xk)}k=120000(10000,x10000=1234). Beachten Sie, dass dies bedeutet, dass die Funktion, die jedes Paar überprüft, nur nach Merkmalen eines Teils des Zustands , nämlich des Teils . Wäre dies nicht der Fall, wäre das Ganze sinnlos, da wir keine Informationen wiederherstellen würden.xk

Diese letzte Formulierung des Problems sollte man berücksichtigen, wenn man über Grovers Algorithmus nachdenkt.

Im Quantenfall werden die Paare zu den Quantenzuständen (oder nur wie sie normalerweise bezeichnet werden), und die Orakelfunktion überprüft nur den Teil der darin gespeicherten Informationen entspricht dem Ziel . Die Ausgabe der Prozedur ist der Status . Nun, ein Teil dieser Zustand , den wir bereits kennen , weil es in der Orakel fest einprogrammiert wurde: wissen wir , dass der zweite Teil der Informationen codiert in ist(k,xk)|ψk|k|ψk|ψ10000|ψ100001234, denn das ist es, wonach wir in erster Linie gesucht haben, und es ist die Information, die im Orakel selbst verschlüsselt wurde. Der Status auch zusätzliche Informationen , nämlich die Position in der Datenbank: . Diese Informationen wurden nicht zum Erstellen des Orakels verwendet und sind die Informationen, die wir durch Ausführen des Algorithmus erhalten.|ψ10000 10000

Beachten Sie schließlich, dass das Orakel nichts über den Inhalt der vollständigen Datenbank weiß. Es implementiert nur kohärent eine Funktion, die einen einzelnen Status mit seinem Ziel vergleicht. Die Tatsache, dass dieses Gate kohärent arbeitet, bedeutet jedoch, dass man in diese Prüffunktion eine Überlagerung vieler (möglicherweise aller) Elemente der Datenbank eingeben und eine Ausgabe erhalten kann, die einige globale Informationen über alle Elemente in der Datenbank enthält.|ψk


1

Sie würden eine Funktion so erstellen, dass zuerst auf das te Element Ihres Arrays zugreift und es dann mit vergleicht . Eine tatsächliche Implementierung kann auf das Array zugreifen, das in zusätzlichen (Parameter-) Eingabe-Qubits codiert ist, als wären sie Bits.ff(x)xw


Gibt es eine Möglichkeit, es in Schaltkreisen oder Operatormatrizen oder einer anderen konkreteren Form darzustellen? Ich bin ein wenig verwirrt darüber, wie Sie es auf eine bestimmte Eingabe zugreifen lassen.
Norrius

Da es sich bei der Eingabe um klassische Informationen handelt (Bits anstelle von Qubits, die nur als Qubits codiert sind), kann man sie einfach mit CNOTs "kopieren". Das ist keine echte Kopie, sondern eine verwickelte, aber das ist gut genug dafür. Es ist wichtig, die Kopie nicht zu berechnen (erneut mit CNOTs), da sonst der Grover-Algorithmus nicht funktioniert.
Pyramiden
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.