Quantencomputer programmieren: Nur eine Phase?
Seite 3: Auswertung und Darstellung der Ergebnisse
Es gibt zwei Möglichkeiten zur Auswertung und Darstellung der Ergebnisse. Kleine Quantenschaltkreise lassen sich über Simulatoren berechnen und die Quantenwelt visuell ausgeben. Dafür ist eine Verbindung mit dem Simulator als Backend nötig:
BasicAer.get_backend('statevector_simulator')
Dann ist der Schaltkreis mit execute()
abzuschicken und das Ergebnis mittels Qiskits Visualization Package darzustellen:
visualization.plot_bloch_multivector
# (5) Verbinden mit IBM-Simulatoren und Abschicken des Schaltkreises
backend = qiskit.BasicAer.get_backend('statevector_simulator')
job = qiskit.execute(QFTcircuit, backend).result()
BasicAer erlaubt das Ansteuern von Quantensimulatoren von IBM. Schickt man den Schaltkreis dann als Job beispielsweise an statevector_simulator
, hilft dieser, die Quantenzustände auf der Bloch-Sphäre zu visualisieren. Für statevector_simulator
sollten keine Messungen im Schaltkreis eingebaut sein, da sie Quantenzustände zerstören. Man erhielte nur die Amplitudenbasis mit |0> oder |1>, die Phase ginge verloren.
Bei einem Überlagern des Zustands
in eine gesamte Phase würde diese nur in Richtung -y zeigen. q₁ und q₂ schließen sich destruktiv aus, nur q₀ setzt sich durch. Würde man ihn aber mit
überlagern, ergäbe das eine ausgewogene Überlagerung im 45-Grad-Winkel zwischen -y und x. So funktioniert Vektoraddition beziehungsweise Quanteninterferenz.
Als zweite Möglichkeit lässt sich der Circuit direkt an einen Quantencomputer schicken. Dafür ist es nötig, im Schaltkreis die auskommentierten Messungen zu aktivieren. Sie holen die Phasenwelt zurück in die 0- und 1-Gegenwart – und siehe da, man erhält randomisierte Ergebnisse. Das stimmt (leider) auch so: Die Information in der Phasenbasis fällt beim Messen zusammen und man misst die Qubits mit einer 50:50-Chance an Nordpol oder Südpol, unabhängig davon, wo sie sich am Äquator befanden.
Die nachfolgenden Listings zeigen das Laden des IBM-Q-Accounts mit Auflistung der verfügbaren Quantencomputer. Die Grafik zeigt den Quantenschaltkreis mit Quantengattern. Man sieht, dass Messungen (schwarze Symbole) automatisch so schnell wie möglich eingebaut werden, um Quantenzustände möglichst schnell und stabil abzugreifen, bevor Dekohärenz stattfindet. Das bedeutet, dass es sehr schwierig ist, Zwischenzustände auf der heutigen Hardware länger zu halten, bevor sie in stabilere Grundzustände zerfallen. Speziell ein Quantenzustand in der Phasenebene ist fragil äußeren Einflüssen gegenüber. Es ergibt daher nicht jeder Zustand 0,125, wie es zu erwarten wäre.
from qiskit import IBMQ
provider = IBMQ.enable_account('Token von Q-Account')
provider.backends()
[<IBMQSimulator('ibmq_qasm_simulator') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQBackend('ibmq_lima') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQBackend('ibmq_belem') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQBackend('ibmq_quito') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQSimulator('simulator_statevector') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQSimulator('simulator_mps') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQSimulator('simulator_extended_stabilizer') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQSimulator('simulator_stabilizer') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQBackend('ibmq_manila') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQBackend('ibm_nairobi') from IBMQ(hub='ibm-q', group='open', project='main')>,
<IBMQBackend('ibm_oslo') from IBMQ(hub='ibm-q', group='open', project='main')>]
Weiterrotieren zu QFT† und Quantum Phase Estimation QPE
Um sich eine genaue Phasenkombination oder einen genauen Winkel ausgeben zu lassen, muss vor der Messung eine inverse Quantum Fourier Transformation stattfinden. Invertierte Quantenoperationen werden mit hochgestelltem † dargestellt.
Das funktioniert durch umgekehrte Anordnung der QFT-Gatter mit jeweils konjugierten Matrizen. Im Fall der Phasengatter genügt für Letzteres das Ändern der Vorzeichen. Sie entsprechen nun Rückwärtsrotationen:
Das Herausholen eines eindeutig messbaren Zustands aus einer Phase ist besonders interessant, wenn die Eigenschaften eines Gatters besser bekannt werden sollen, denn jedes universelle Gatter U besitzt einen Eigenwert, der sich als Phase interpretieren lässt:
Ist der Eigenvektor |Ψ⟩ bekannt, lässt sich mit QFT† der Winkel θ ausfindig machen. Das spielt für Simulationen chemisch-physikalischer Systeme eine Rolle, deren Abläufe denselben Dynamiken folgen und die sich daher für die Erforschung mithilfe von Quantencomputern eignen.
Ein unbekannter Quantenzustand |Ψ⟩ lässt sich mittels Quantum Phase Estimation abtasten. Dabei werden einzelne Phasen in ein Qubit-Register übertragen. Je mehr Qubits verwendet werden, desto genauer die Schätzung von |Ψ⟩.
Shor-Algorithmus
Kombiniert man Quantum Phase Estimation für eine Funktion mit Quantum Fourier Transformation, erhält man den Shor-Algorithmus. Dieser Algorithmus revolutionierte das Feld, da er Primfaktorenzerlegung in ein phasenverwandtes Problem und damit für Quantencomputer verständlich gemacht hat. Der Shor-Algorithmus erlaubt das Zerlegen selbst großer Zahlen, die momentan die Sicherheit der RSA-Verschlüsselung bedingen.
Gemeinsam können die zwei Subroutinen eine Periodizität in
finden.
Quantum Phase Estimation zerlegt die Funktion für einen Eingabezustand in Phasen von
bis zu
Man erkennt das typische rekursive Muster. Über QFT† wird evaluiert, zu welchen Schritten
gilt. Aus dieser Periodizität r lassen sich die Primfaktoren mit exponentiellem Speedup klassischen Computern gegenüber berechnen. Das Prädikat Speedup oder "Quantenvorteil" erhalten Quantenroutinen, die ein Problem schneller oder präziser als klassische Computer lösen.