5.2.4 Bernstein-Vazirani-Algorithmus

In den vorigen Abschnitten haben wir mithilfe der Hadamard-Transformation interessante Probleme gelöst. Gegeben einer Funktion f:{0,1}n{0,1}f\colon\{0,1\}^{n}\to\{0,1\} und dem Versprechen, dass ff entweder konstant oder balanced ist, kann der Deutsch-Jozsa-Algorithmus herausfinden, welche der beiden Fälle zutrifft.

In diesem Abschnitt werden wir ein anderes interessantes Problem besprechen, welches mit einer kleinen Veränderung des selben Algorithmus gelöst werden kann. Wie auch zuvor starten wir mit einem Versprechen über eine unbekannte Funktion ff. In diesem Fall werden wir aber nicht annehmen, dass die Funktion entweder konstant oder balanced ist, stattdessen nehmen wir, an dass sie die folgende spezielle Form hat:

f(x1,,xn)=x1a1xnan,\displaystyle f(x_{1},\dots,x_{n})=x_{1}a_{1}\oplus\ldots\oplus x_{n}a_{n}, (5.14)

wobei a1,,an{0,1}a_{1},\dots,a_{n}\in\{0,1\} ein fester Bitstring ist, der die Funktion definiert.

Wenn n=1n=1, gibt es nur zwei solche Funktionen:

  • f(x1)=0f(x_{1})=0 wenn a1=0a_{1}=0 sowie

  • f(x1)=x1f(x_{1})=x_{1} wenn a1=1a_{1}=1.

Wenn n=2n=2, dann gibt es schon vier verschiedene solcher Funktionen:

  • f(x1,x2)=0f(x_{1},x_{2})=0, wenn [a1,a2]=[0,0][a_{1},a_{2}]=[0,0],

  • f(x1,x2)=x2f(x_{1},x_{2})=x_{2}, wenn [a1,a2]=[0,1][a_{1},a_{2}]=[0,1],

Beachte, dass jede dieser Funktionen eine Summe modulo Zwei über eine Teilmenge der Variablen xix_{i} berechnet. Welche Teilmenge? Wenn ai=1a_{i}=1 gilt, dann ist die Variable xix_{i} in der Teilmenge enthalten.

Im Allgemeinen gibt es 2n2^{n} mögliche Bitstrings a1,,ana_{1},\dotsc,a_{n} und somit 2n2^{n} Funktionen ff der speziellen Form (5.14). Tatsächlich können wir uns Gl. 5.14 als Methode zum Verstecken des Bitstrings in der Funktion ff vorstellen. Wie oft muss man die Funktion auswerten um den Bitstring offenzulegen? Da

a1\displaystyle a_{1} =f(1,0,,0,0),\displaystyle=f(1,0,\dots,0,0),
a2\displaystyle a_{2} =f(0,1,,0,0),\displaystyle=f(0,1,\dots,0,0),
\displaystyle\qquad\qquad\vdots
an\displaystyle a_{n} =f(0,0,,0,1),\displaystyle=f(0,0,\dots,0,1),

können wir schlussfolgern, dass nn auswertungen von ff auf jeden Fall ausreichen. Für jeden klassischen Algorithmus entspricht das auch dem Optimum: für jede Auswertung lernt man ein Bit an Information. Da die unbekannten Bits a1,,ana_{1},\dots,a_{n} komplett unabhängig und beliebig sind und es genau nn gibt, muss man die Funktion mindestens nn-mal auswerten um alle Bits zu lernen.

Gleich werden wir sehen, dass das Problem mit einem Quantenalgorithmus viel besser gelöst werden kann. Zu Beginn berechnen wir erst einmal, wie sich das Phasen-Orakel für die Funktion aus Gl. 5.14 auf Basiszustände auswirkt:

Of|x1,,xn\displaystyle O_{f}\left|x_{1},\dots,x_{n}\right\rangle =(1)x1a1xnan|x1,,xn\displaystyle=(-1)^{x_{1}a_{1}\oplus\ldots\oplus x_{n}a_{n}}\left|x_{1},\dots,% x_{n}\right\rangle
=(1)x1a1++xnan|x1,,xn.\displaystyle=(-1)^{x_{1}a_{1}+\ldots+x_{n}a_{n}}\left|x_{1},\dots,x_{n}\right\rangle. (5.15)

Im zweiten Schritt haben wir ausgenutzt, dass (1)a(-1)^{a} nur von aa modulo Zwei (also ob aa gerade oder ungerade ist) abhängt, weswegen es keinen Unterschied macht, ob wir die Addition modulo 2 (‘\oplus’) oder die normale Addition benutzen. Wie können wir dieses Phasen-Orakel implementiert werden? Eigentlich interessiert uns das nicht, da der Algorithmus das Orakel wie eine Black-Box benutzen wird. Aber da es eine schöne Übung ist, kannst du das in der folgenden Übungsaufgabe herausfinden.

Übungsaufgabe 5.5 (Das Phasen-Orakel implementieren (Optional)).

In dieser Aufgabe kannst du das Phasen-Orakel für Funktionen der Form (5.14) implementieren.

  1. 1.

    Wenn n=2n=2 ist, gibt es vier solcher Funktionen, wie oben besprochen. Kannst du für jede von ihnen einen Quirky-Schaltkreis bauen, der die Phasen-Orakel implementiert?

  2. 2.

    Erkläre in Worten oder mit Bildern, wie man das Phasen-Orakel im Allgemeinen bauen kann (also wenn n1n\geq 1 und die Bits a1,,an{0,1}a_{1},\dots,a_{n}\in\{0,1\} unbekannt sind).

Lösung.
  1. 1.

    Das sind die vier Funktionen und ihre Phasen-Orakel:

    • Für [a1,a2]=[0,0][a_{1},a_{2}]=[0,0], Of|x1,x2=|x1,x2O_{f}\left|x_{1},x_{2}\right\rangle=\left|x_{1},x_{2}\right\rangle, also macht das Phasen-Orakel nichts.

    • Für [a1,a2]=[0,1][a_{1},a_{2}]=[0,1], Of|x1,x2=(1)x2|x1,x2O_{f}\left|x_{1},x_{2}\right\rangle=(-1)^{x_{2}}\left|x_{1},x_{2}\right\rangle, was IZI\otimes Z entspricht.

    • Für [a1,a2]=[1,0][a_{1},a_{2}]=[1,0], Of|x1,x2=(1)x1|x1,x2O_{f}\left|x_{1},x_{2}\right\rangle=(-1)^{x_{1}}\left|x_{1},x_{2}\right\rangle, was das gleiche ist wie ZIZ\otimes I.

    • Für [a1,a2]=[1,1][a_{1},a_{2}]=[1,1], Of|x1,x2=(1)x1+x2|x1,x2=(1)x1(1)x2|x1,x2O_{f}\left|x_{1},x_{2}\right\rangle=(-1)^{x_{1}+x_{2}}\left|x_{1},x_{2}\right% \rangle=(-1)^{x_{1}}(-1)^{x_{2}}\left|x_{1},x_{2}\right\rangle, was ZZZ\otimes Z entspricht.

    Es ist klar, wie diese vier Operationen in Quirky aussehen.

  2. 2.

    Das allgemeine Muster ist damit klar. Für eine beliebige Funktion der Form (5.14) gilt:

    Of|x1,,xn=(1)x1a1++xnan|x1,,xn=(Za1Zan)|x1,,xn,\displaystyle O_{f}\left|x_{1},\dots,x_{n}\right\rangle=(-1)^{x_{1}a_{1}+% \ldots+x_{n}a_{n}}\left|x_{1},\dots,x_{n}\right\rangle=(Z^{a_{1}}\otimes\dotsb% \otimes Z^{a_{n}})\left|x_{1},\dots,x_{n}\right\rangle,

    wobei wir Z1=ZZ^{1}=Z und Z0=IZ^{0}=I schreiben. Mit anderen Worten, wir wenden ein Z-Gatter auf das jj-te Qubit nur genau dann an, wenn aj=1a_{j}=1 ist.

Nun stellen wir den Bernstein-Vazirani-Algorithmus vor, welcher den versteckten Bitstring [a1,,an][a_{1},\dots,a_{n}] mit nur eines Aufrufs des Phasen-Orakels für ff aufdecken kann:

  1. 1.

    Starte mit |00\left|0\dots 0\right\rangle.

  2. 2.

    Wende die Hadamard-Transformation HHH\otimes\dotsb\otimes H an.

  3. 3.

    Wende das Phasen-Orakel OfO_{f} der Funktion ff an.

  4. 4.

    Wende wieder die Hadamard-Transformation HHH\otimes\dotsb\otimes H an.

  5. 5.

    Messe zum Schluss alle Qubits. Das Messergbnis entspricht genau dem Bitstring [a1,,an][a_{1},\dots,a_{n}].

Der Algorithmus ist identisch zu dem Deutsch-Jozsa-Algorithmus aus Abschnitt 5.2.3, bis auf den letzten Schritt, welcher noch einfacher ist.

Hausaufgabe 5.3 (Bernstein-Vazirani ausführen).

Die orangene Orakel Box in Quirky implementiert das Phasen-Orakel für eine Funktion der Form (5.14) mit n=4n=4. Implementiere den Bernstein-Vazirani-Algorithmus in Quirky und nutze ihn um den versteckten Bitstring [a1,a2,a3,a4][a_{1},a_{2},a_{3},a_{4}] aufzudecken.

Hack.

Quirky zeigt folgendes Ergebnis:

[Uncaptioned image]

Damit ist der versteckte Bitstring [a1,a2,a3,a4]=[1,1,0,1][a_{1},a_{2},a_{3},a_{4}]=[1,1,0,1] (fahre mit dem Mauszeiger über den grünen ‘100%’-Eintrag um zu sehen, welchem Ergebnis er entspricht).

Warum funktioniert dieser Algorithmus? Jetzt bist du mit der Analyse dran!

Übungsaufgabe 5.6 (Bernstein-Vazirani überprüfen).

Die Funktion f(x1,x2)=x2f(x_{1},x_{2})=x_{2} entspricht dem Bitstring [a1,a2]=[0,1][a_{1},a_{2}]=[0,1], wie wir oben gesehen hatten.

Zeige, dass bei dem Ausführen des Bernstein-Vazirani-Algorithmus auf dieser Funktion das Messergebnis tatsächlich immer [a1,a2]=[0,1][a_{1},a_{2}]=[0,1] ist. Überprüfe das nicht einfach mit Quirky sondern schreibe den Zustand nach jedem Schritt selbst auf.

Lösung. In Schritt 1 starten wir mit:
|00\displaystyle\left|00\right\rangle
In Schritt 2 wenden wir HHH\otimes H an und erhalten:
12(|0+|1)12(|0+|1)\displaystyle\frac{1}{\sqrt{2}}\left(\left|0\right\rangle+\left|1\right\rangle% \right)\otimes\frac{1}{\sqrt{2}}\left(\left|0\right\rangle+\left|1\right% \rangle\right)
=\displaystyle= 12(|00+|01+|10+|11)\displaystyle\frac{1}{2}\left(\left|00\right\rangle+\left|01\right\rangle+% \left|10\right\rangle+\left|11\right\rangle\right)
Im 3. Schritt wenden wir das Phasen-Orakel OfO_{f} für f(x1,x2)=x2f(x_{1},x_{2})=x_{2} an:
12(|00|01+|10|11)\displaystyle\frac{1}{2}\left(\left|00\right\rangle-\left|01\right\rangle+% \left|10\right\rangle-\left|11\right\rangle\right)
In Schhritt 4 wenden wir wieder HHH\otimes H an und erhalten:
12((HH)|00(HH)|01+(HH)|10(HH)|11)\displaystyle\frac{1}{2}\Bigl{(}(H\otimes H)\left|00\right\rangle-(H\otimes H)% \left|01\right\rangle+(H\otimes H)\left|10\right\rangle-(H\otimes H)\left|11% \right\rangle\Bigr{)}
=\displaystyle= 14((|00+|01+|10+|11)(|00|01+|10|11)\displaystyle\frac{1}{4}\Bigl{(}\left(\left|00\right\rangle+\left|01\right% \rangle+\left|10\right\rangle+\left|11\right\rangle\right)-\left(\left|00% \right\rangle-\left|01\right\rangle+\left|10\right\rangle-\left|11\right% \rangle\right)
+(|00+|01|10|11)(|00|01|10+|11))\displaystyle+\left(\left|00\right\rangle+\left|01\right\rangle-\left|10\right% \rangle-\left|11\right\rangle\right)-\left(\left|00\right\rangle-\left|01% \right\rangle-\left|10\right\rangle+\left|11\right\rangle\right)\Bigr{)}
=\displaystyle= |01.\displaystyle\left|01\right\rangle.
In Schritt 5 messen wir schlussendlich beide Qubits und erhalten immer das Ergebnis [0,1][0,1].

In der folgenden Hausaufgabe kannst du den allgemeinen Fall analsysieren:

Hausaufgabe 5.4 ().

Zeige, dass das Ausführen von Bernstein-Vazirani auf einer Funktion der Form (5.14) mit 100% Wahrscheinlichkeit zu dem Messergebnis [a1,,an][a_{1},\dots,a_{n}] führt.

Hinweis: Da die ersten vier Schritte des Algorithmus identisch zu dem Deutsch-Jozsa-Algorithmus sind, ist der Zustand direkt vor der Messung gegeben in Gl. 5.13.

Hack.

Dem Hinweis nach ist der Zustand direkt vor der Messung der folgende:

y1,,yn{0,1}12n(x1,,xn{0,1}(1)x1y1++xnyn(1)f(x1,,xn))|y1,,yn.\displaystyle\sum_{y_{1},\dots,y_{n}\in\{0,1\}}\frac{1}{2^{n}}\left(\sum_{x_{1% },\dots,x_{n}\in\{0,1\}}(-1)^{x_{1}y_{1}+\ldots+x_{n}y_{n}}(-1)^{f(x_{1},\dots% ,x_{n})}\right)\left|y_{1},\dots,y_{n}\right\rangle.

Da die Funktion f(x1,,xn)f(x_{1},\dots,x_{n}) in diesem Problem die Form f(x1,,xn)=x1a1xnanf(x_{1},\dots,x_{n})=x_{1}a_{1}\oplus\cdots\oplus x_{n}a_{n} (wie in Gl. 5.14 definiert) hat, entspricht das

y1,,yn{0,1}12n(x1,,xn{0,1}(1)x1y1++xnyn(1)x1a1++xnan)|y1,,yn.\displaystyle\sum_{y_{1},\dots,y_{n}\in\{0,1\}}\frac{1}{2^{n}}\left(\sum_{x_{1% },\dots,x_{n}\in\{0,1\}}(-1)^{x_{1}y_{1}+\ldots+x_{n}y_{n}}(-1)^{x_{1}a_{1}+% \ldots+x_{n}a_{n}}\right)\left|y_{1},\dots,y_{n}\right\rangle.

Um die Wahrscheinlichkeit für das Messergbnis [a1,,an][a_{1},\dots,a_{n}] zu finden, müssen wir die Amplitude des Zustands |a1,,an\left|a_{1},\dots,a_{n}\right\rangle aus dem obigen Ausdruck analsysieren. Da das y1=a1y_{1}=a_{1}, …, yn=any_{n}=a_{n} entspricht, ist die Amplitude gegeben durch

12n(x1,,xn{0,1}(1)x1y1++xnyn(1)x1a1++xnan)\displaystyle\frac{1}{2^{n}}\left(\sum_{x_{1},\dots,x_{n}\in\{0,1\}}(-1)^{x_{1% }y_{1}+\ldots+x_{n}y_{n}}(-1)^{x_{1}a_{1}+\ldots+x_{n}a_{n}}\right)
=\displaystyle= 12n(x1,,xn{0,1}(1)x1a1++xnan(1)x1a1++xnan)\displaystyle\frac{1}{2^{n}}\left(\sum_{x_{1},\dots,x_{n}\in\{0,1\}}(-1)^{x_{1% }a_{1}+\ldots+x_{n}a_{n}}(-1)^{x_{1}a_{1}+\ldots+x_{n}a_{n}}\right)
=\displaystyle= 12n(x1,,xn{0,1}1)=2n2n=1.\displaystyle\frac{1}{2^{n}}\left(\sum_{x_{1},\dots,x_{n}\in\{0,1\}}1\right)=% \frac{2^{n}}{2^{n}}=1.

Im ersten Schritt haben wir ausgenutzt, dass y1=a1y_{1}=a_{1}, …, yn=any_{n}=a_{n}. Im zweiten Schritt haben wir ausgenutzt, dass (1)(1)=(+1)(+1)=1(-1)(-1)=(+1)(+1)=1.

Da die Amplitude von |a1,,an\left|a_{1},\dots,a_{n}\right\rangle somit 1 ist, können wir schlussfolgern, dass wir das Ergebnis [a1,,an][a_{1},\dots,a_{n}] mit 100% Wahrscheinlichkeit erhalten.