Quantencomputer programmieren: Nur eine Phase?

Seite 2: Quantum Fourier Transformation

Inhaltsverzeichnis

Rotieren mehrere Qubits nun abgestimmt mit individuellen Frequenzen, entsteht eine Quantum Fourier Transformation. Eine Fourier Transformation ist somit das Darstellen eines Eingabewertes in eine kombinierte Überlagerung von Frequenzen. Für Quantencomputer heißt das, Qubits aus der Amplitudenebene abgestimmt in die Phasenebene zu überführen. Beispielsweise den Eingabezustand 6:

Einzelne Qubits wie

erledigt einfach das Hadamard-Gatter:

QFT in Bildern. Eine Zahl lässt sich binär als Kombination von 0 und 1 (Nordpol und Südpol) abbilden und in eine Kombination aus Phasen überführen. Dabei gibt die Zahl vor, wie oft jedes Qubit um seinen individuellen Winkel weiterrotiert. QFT macht aus einer Eingabezahl eine Anzahl an Rotationsschritten, die in einem bestimmten Phasenzustand enden.

Mehrere Qubits müssen beim Rotieren (so wie Stellen beim Zählen) aufeinander abgestimmt werden. Die Rotationen sind daher nicht nur am Target-Qubit auszuführen, sondern an ein zweites Qubit geknüpft. Das gilt als kontrolliertes CU₁ oder CP-Gatter (Controlled Phase Rotation). Es stellt sich ebenfalls als Matrix dar, besitzt allerdings einen höheren Matrizenrang als Gatter für einzelne Qubits:

Nun ist es erforderlich, diese mathematischen Matrizen als konkrete Programmieranweisungen zu formulieren. Die hier genutzten Zutaten sind das Hadamard-Gatter für die Quantum Fourier Transformation (QFT) einzelner Qubits und CP-Gatter mit individuellen Phasenänderungen als Verknüpfung von Rotationsschritten. Es soll daraus im Folgenden ein QFT-Schaltkreis für drei Qubits mit dem von IBM entwickelten Open-Source-SDK Qiskit entstehen. Seit 2016 arbeitet IBM an der Erstellung einer großen und dynamischen Landschaft zum einfachen und freien Ansteuern von Quantencomputern direkt über die Cloud.

Zunächst importiert man Qiskit:

import qiskit
from numpy import pi

Dann sind zu definieren:

1. ein Quantenschaltkreis mit drei Qubits im Quantenregister über QFTcircuit = QuantumCircuit(3). Drei klassische Bits sind für spätere Messungen enthalten.

2. der Eingabezustand für die Fourier Transformation mit init_state als Liste, um später mit verschiedenen Eingabezuständen zu experimentieren. Drei Qubits können den Eingabezustand von 000 bis 111 abdecken. Eine klassische 0 entspricht standardmäßig dem Anfangszustand |0⟩ eines Qubits. Ein X-Gatter erlaubt das Rotieren von |0⟩ zu |1⟩ und das Abbilden einer klassischen 1 am Anfang. Es funktioniert in Amplitudenebene analog zum Z-Gatter in Phasenebene. Gatter werden als Funktion auf den Schaltkreis mit Position des Target-Qubits eingegeben: QFTcircuit.x(qubit).

3. rekursiv für jedes Qubit ein Hadamard-Gatter, um von der Amplitudenebene in die Phasenebene zu wechseln mit QFTcircuit.h(qubit). Das entspricht bereits dem Anwenden einer π-Phase, wenn das Qubit als Ausgangszustand |1⟩ abbildet.

4. rekursiv für jedes Qubit eine Abfolge an CP₁-Gattern mit unterschiedlichen Phasen zu den Kontrollen mit QFTcircuit.cp(phase, control, target). Wie in der obigen Abbildung ist auch hier Qubit q das wichtigste. Es springt um den geringsten Winkel π/2ⁿ, sollte das irrelevanteste Qubit qn eine |1⟩ abbilden. Man kann sich das wie Zählen vorstellen: qn stellt die "Einerstelle" dar und ändert sich am häufigsten, q wächst nur langsam als träge "Hunderterstelle". Mit QFTcircuit.draw() lässt sich der Quantenschaltkreis zeichnen: