Quantencomputer programmieren: Nur eine Phase?

Subroutinen wie QFT machen sich die Phasenebene von Qubits zunutze, um Probleme effizient zu lösen – wenn man diese gut für Quantencomputer zu formulieren weiß.

In Pocket speichern vorlesen Druckansicht 6 Kommentare lesen
Elementary,Particles,Series.,Interplay,Of,Abstract,Fractal,Forms,On,The

(Bild: agsandrew/Shutterstock.com)

Lesezeit: 13 Min.
Von
  • Alexandra Waldherr
Inhaltsverzeichnis

Wer in die Quantenprogrammierung einsteigt, stolpert schnell über das Gefühl eines "Baukastenprinzips", da man eine Auswahl an Quantengattern vorfindet, die sich auf Qubits zum Bauen von Quantenschaltkreisen anwenden lassen. Dazu zählen das Hadamard-Gatter und die Pauli-Gatter. Es stellt sich jedoch für Einsteiger die Frage, welche Abfolgen und Kombinationen an Gattern sinnvolle Algorithmen hervorbringen.

Hier kristallisieren sich derzeit immer mehr "Quantensubroutinen" als größere, nützliche Bausteine für Algorithmen heraus. Sie enthalten kombinierte, definierte Quantengatterabfolgen. Eine dieser Quantensubroutinen ist Quantum Fourier Transformation (QFT). Damit lassen sich Qubits von einer Computational Basis in eine Phase Basis überführen. Einfach vorgestellt, überführt man digitale Einsen und Nullen in eine andere Formulierung, die der Quantencomputer effizienter verarbeitet.

Nachfolgend soll zunächst der theoretische Hintergrund betrachtet werden. Anschließend wird konkret ein Quantenzustand mit der Quantenprogrammiersprache Qiskit transformiert. Am Ende folgt ein Vergleich, wie sich Quantensubroutinen alternativ mit den Programmiersprachen Cirq oder Q# implementieren lassen.

Qiskit, Circ und Q# im Vergleich

Qiskit

Qiskit ist das prominenteste Quantenframework, Cirq und Q# stellen Alternativen dar. Das von IBM entwickelte Open-Source-SDK basiert auf Python. Die Dokumentation und die Open-Source-Community stellen Wissen und Hilfe zur Verfügung. Es gibt freien Zugang zu Simulatoren und echten Quantensystemen über IBMQ Experience.

Weiterführende Links:

Cirq

Cirq basiert auf Python und stammt aus dem Hause Google. Es besitzt als Spezialisierungen OpenFermion (für chemische Simulationen) und TensorFlow Quantum (für Quantum Machine Learning). Visualisierungen liegen weniger im Fokus, viele Datenstrukturen werden bevorzugt als Array ausgegeben.

Weiterführende Links:

Derzeit gibt es noch keine standardisierte Quantenhardware; es herrscht noch die Noisy-Intermediate-Scale-Quantum-(NISQ)-Ära. Jeder Quantencomputer ist einzigartig und Cirq zielt darauf ab, Fehlerquellen durch intensives Berücksichtigen von Hardware-Layouts beim Zuteilen von Qubits und Gattern zu berücksichtigen.

Q#

Angelehnt an C# und F# hat Microsoft die Programmiersprache Q# als Teil des Quantum Development Kit (QDK) entwickelt. Im Gegensatz zu Cirq liegt hier der Fokus auf möglichst viel Abstraktion, um mit demselben Code möglichst alle Quantencomputer anzusteuern. Q#-Dateien sind mit verschiedenen Applikationen verwendbar. Sie können bis zu 30 Qubits am eigenen Gerät simulieren oder sich mit Azure Quantum verbinden.

Weiterführende Links:

Ein Qubit q₁ kann sich zwischen 0 und 1 befinden, in der Quantenwelt gespeichert als |0⟩ oder |1⟩. Seine Amplitude in Richtung eines Zustands spiegelt sich in einer höheren Wahrscheinlichkeit wider, diesen Zustand zu messen. Konkret drücken das zwei komplexe Zahlen α und β aus:

Das Messen des Qubits gibt das Ergebnis 0 mit der Wahrscheinlichkeit |α|² aus oder 1 mit einer Wahrscheinlichkeit von |β|². Es ergibt sich 1=|α|²+|β|² aufgrund der Gesamtwahrscheinlichkeit. Der Überlagerungszustand der Quantenwelt lässt sich explizit nicht extrahieren, daher läuft ein Quantenprogramm immer mehrmals und wird statistisch ausgewertet.

Anstatt |0⟩+|1⟩ können mehrere n Qubits eine Überlagerung aus 2ⁿ Zuständen darstellen. Das vergrößert exponentiell den Computational Space. Zwei Qubits speichern bereits vier Variablen (α, β, γ, δ) und drei Qubits bereits acht:

Das wird schnell unübersichtlich. Eine gängige Vektorschreibweise fasst daher die Koeffizienten kompakter zusammen:

Die Frage "Wie kann man nun mit Qubits rechnen?" wird zu: "Wie kann man die Einträge dieser Vektoren beeinflussen?" Das funktioniert durch Multiplikation mit einer Matrix – nichts anderes macht also ein Quantengatter. Manche Gatter verändern die Wahrscheinlichkeit, 0 oder 1 zu messen, beispielsweise das X-Gatter. Andere Gatter beeinflussen nicht die Amplitude beziehungsweise Wahrscheinlichkeit, sondern die Phase eines Qubits, beispielsweise das Z-Gatter.

Es ist hilfreich, sich Matrizen beziehungsweise Quantengatter als Rotation eines Qubits auf der Bloch-Sphäre visuell vorzustellen.

Auf der Bloch-Sphäre (oder "Bloch-Globus") lässt sich jedem möglichen Qubitzustand ein Punkt auf der Oberfläche zuordnen. α gibt den nördlichen Breitengrad an, β den südlichen. Klassische 0- und 1-Zustände sind nur an den Polen anzutreffen. Die spitzen Klammern |0⟩ oder |1⟩ weisen darauf hin, dass es sich um einen Quantenzustand handelt.

Jedem möglichen Qubit-Zustand lässt sich hier ein Punkt auf der Oberfläche zuordnen. An den Polen finden sich |0⟩ und |1⟩. Sie entsprechen den zwei messbaren "normalen" Bit-Zuständen 0 und 1. Alle anderen Zustände sind eine Überlagerung α|0⟩ + β |1⟩, auch Superposition genannt.

Je nördlicher ein Quantenzustand, desto mehr überwiegt α und desto wahrscheinlicher misst man 0. Andersherum gilt: Überwiegt β, befindet man sich näher am Südpol und misst häufiger 1.

Quantengatter nehmen nun Quantenzustände und rotieren sie innerhalb der Bloch-Sphäre an einen anderen Ort. Ein sehr bekanntes Quantengatter ist das Hadamard-Gatter mit folgender Matrix:

Diese Matrix macht Folgendes mit den Polvektoren |0⟩ und |1⟩: Der Ausgangszustand |0⟩ rotiert zur Äquatorebene nach vorne. Der Ausgangszustand |1⟩ rotiert zur Äquatorebene rückwärts. Das Minus in der Hadamard-Matrix macht den Unterschied:

Die mit |+⟩ und |-⟩ bezeichneten Endzustände sind wichtige Ausgangspunkte für weitere Gatter. Das Berechnen der Wahrscheinlichkeiten|α|² und |β|² zeigt, dass beide Endzustände dieselbe 50:50-Chance auf 0 oder 1 haben, obwohl sie auf gegenüberliegenden Seiten der Bloch-Sphäre liegen.

Eine Transformation von Amplitude zu Phasenausrichtung hat stattgefunden: von Computational Basis an den Polen, charakterisiert durch |0⟩ und |1⟩, in die Phasenebene mit |+⟩ und |-⟩. In dieser Phasenebene kann man nun mit dem Z-Gate um den Äquator reisen.

Die Phasenebene ist durch |+⟩ und |-⟩ charakterisiert, die Amplitudenebene durch |0⟩ und |1⟩. Über das H-Gate lässt sich |0⟩ zu |+⟩ und |1⟩ zu |-⟩ mappen.

Das Z-Gate ist wie eine Identitätsmatrix und verändert nur das Vorzeichen, also die Phase. Das lässt sich als halbe Rotation um den Äquator einzeichnen.

Andere Phasenänderungen lassen sich über das U₁-Gate individuell definieren:

Setzt man für λ=π ein, ergibt sich aus Eulers Identität -1. Der Winkel π ist deckungsgleich mit einer halben Kreisrotation, man erhält die Matrix des Z-Gates zurück.

Für andere Winkel ergibt sich beispielsweise:

Rotationen von π, π/2 und π/4 in der Bloch-Sphäre beziehungsweise in einem "Uhrenformat" dargestellt: Bei 0 Uhr beginnt der Zustand |+⟩ und mit jeder Applikation des U₁-Gatters bewegt sich der Zustandsvektor schrittweise um den individuellen Winkel weiter.