Qubits, Quantengatter und Quantenschaltkreise – aus der Informatikperspektive: Teil 3 Das CNOT-Gatter und Verschränkung
Übersicht
Kontext
Dieses Material ist Teil der dreiteiligen Unterrichtseinheit „Qubits, Quantengatter und Quantenschaltkreise – aus der Informatikperspektive“. Teil 3 führt das CNOT-Gatter ein und zeigt, wie es arbeitet und mit zuvor eingeführten Konzepten interagiert. Ein zentraler Schwerpunkt liegt auf der Erzeugung von Verschränkung durch die Verwendung eines Hadamard-Gatters, gefolgt von einem CNOT-Gatter. Dieser abschließende Abschnitt umfasst außerdem 12 aufbauende Übungen, die die Konzepte aus allen drei Teilen festigen.
Die Aufgaben stehen als Download als docx und PDF zur Verfügung.
1. Das CNOT‑Gatter – ein Gatter, das auf zwei Qubits wirkt
Einige Quantengatter wirken auf mehr als ein Qubit, zum Beispiel das CNOT‑Gatter (auch „kontrolliertes NOT‑Gatter“ genannt). Es wendet das Pauli‑X‑Gatter (auch NOT‑Gatter genannt) genau dann auf ein Qubit an, wenn sich ein anderes Qubit, das sogenannte Kontroll‑Qubit, im Zustand befindet.
Die Matrix des CNOT‑Gatters ist:
.
Nehmen wir an, das erste Qubit, das Kontroll‑Qubit, befindet sich im Zustand , und das zweite Qubit ebenfalls im Zustand . Die Kombination dieser beiden Qubits kann in der Bra‑Ket‑Notation durch dargestellt werden. Der entsprechende Vektor ist (siehe Teil 1: Qubits und ihre Darstellungsweisen).
Man erkennt, dass das zweite Qubit genau dann „umgedreht“ wird, wenn sich das erste Qubit im Zustand befindet.
2. Mit einem Hadamard‑ und einem CNOT‑Gatter zwei Qubits verschränken
Mit dem CNOT‑Gatter lassen sich zwei Qubits verschränken. Das Vorgehen ist wie folgt:
- Man startet mit zwei Qubits im Zustand .
Auf das erste Qubit wird ein Hadamard‑Gatter angewendet (siehe Abschnitt „Das Hadamard‑Gatter“ in Teil 2):
.
Das erste Qubit befindet sich nun in einem Superpositionszustand, während das zweite Qubit im Zustand bleibt.
Der Zustand dieses Zwei‑Qubit‑Systems kann daher geschrieben werden als .Oder in Vektornotation: .
Nun wird auf diesen Zustand ein CNOT‑Gatter angewendet:
Dies ist der Zustand zweier verschränkter Qubits. Warum? Schauen wir uns das nun genauer an.
Im Allgemeinen kann man die Zustände zweier Qubits (in einem beliebigen Zustand) als Kronecker‑Produkt zweier Vektoren schreiben – jeder Vektor repräsentiert ein Qubit:
, wobei , , und jeweils oder sind.
Berechnet man das Kronecker‑Produkt, erhält man:
.
Betrachten wir nun beispielsweise den Superpositionszustand , der ein System aus zwei Qubits beschreibt. Der Zustand kann in Vektornotation geschrieben werden als:
.
Vergleicht man diesen Vektor mit dem allgemeinen Vektor, der zwei Qubits beschreibt, , so ergibt sich: und .
Für dieses Gleichungssystem gibt es keine Lösung (die ersten beiden Gleichungen sind genau dann erfüllt, wenn , die anderen beiden Gleichungen jedoch erfordern, dass entweder oder , beziehungsweise oder gleich sein muss).
Das bedeutet, dass der Zustand nicht als Kronecker‑Produkt zweier Qubit‑Zustände geschrieben werden kann: Die beiden Qubits sind verschränkt.
Zusammenfassend lässt sich sagen: Wendet man ein Hadamard‑Gatter gefolgt von einem CNOT‑Gatter auf ein Zwei‑Qubit‑System an, so werden die beiden Qubits verschränkt.

Abb. 1: Ein Quantenschaltkreis mit zwei Qubits, zwei Gattern und zwei Messungen. Auf das erste Qubit q0 wird ein Hadamard‑Gatter angewendet. Anschließend wird ein CNOT‑Gatter auf das Zwei‑Qubit‑System angewandt (bestehend aus q1 und dem Ergebnis der Hadamard‑Operation auf q0). Nach dieser Operation wird jedes Qubit gemessen. Die Messergebnisse werden in den klassischen Registern c0 und c1 gespeichert.
quantum_registers = QuantumRegister(2, 'q')< circuit = QuantumCircuit(quantum_registers, classical_registers)quantum_registers = QuantumRegister(2, 'q')# Wende ein Hadamard‑Gatter auf das erste Qubit an circuit.h(quantum_registers[0])# Wende ein kontrolliertes NOT‑Gatter an: Qubit 1 wird abhängig vom Zustand von Qubit 0 verändert circuit.cx(quantum_registers[0], quantum_registers[1]) # Messe beide Qubits circuit.measure(quantum_registers[0], classical_registers[0]) circuit.measure(quantum_registers[1], classical_registers[1])
classical_registers = ClassicalRegister(2, 'c')
Abb. 2: Ein Hadamard‑Gatter und ein CNOT‑Gatter werden auf zwei Qubits im Zustand angewendet – wie im Quantenschaltkreis in Abb. 1 dargestellt. Die beiden Qubits werden entweder im Zustand oder im Zustand gemessen, wobei die Wahrscheinlichkeit für jedes dieser beiden Messergebnisse jeweils 50 % beträgt.
Aufgaben
Aufgabe 1. Überprüfe alle oben aufgeführten Beispiele – bei denen ein Gatter auf ein oder zwei Qubits angewendet wird –, indem du die dazugehörigen Quantenschaltkreise erstellst. Siehe dazu Quantenschaltkreise programmieren.
Die Quantenschaltkreise müssen in der jeweiligen Entwicklungsumgebung des Quantencomputers nachgebaut werden, beispielsweise mithilfe von Drag & Drop. Die Ergebnisse werden ähnlich sein, aufgrund von Rauschen jedoch wahrscheinlich nicht identisch.
Aufgabe 2. Überprüfe alle oben aufgeführten Beispiele – bei denen ein Gatter auf ein oder zwei Qubits angewendet wird – in einer lokalen Qiskit‑Umgebung. Trage deinen API‑Token für das IBM‑Quantum‑System ein und führe die Programme aus.
Hier müssen die Quantenschaltkreise in Qiskit zusammengestellt werden. Dazu muss der Qiskit‑Code des jeweiligen Beispiels in das allgemeine Gerüst eingebettet werden.
Für das Beispiel des Identitätsgatters ergibt sich dann folgendes vollständige Programm, das auf einem IBM‑Quantum‑Computer ausgeführt werden kann (der API‑Token muss natürlich noch ergänzt werden):
# Einen Quantenschaltkreis erzeugenfrom qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit # Den Quantenschaltkreis optimierenfrom qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager # Zugriff auf IBM Quantumfrom qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
service = QiskitRuntimeService(channel="ibm_quantum", token="Füge hier deinen API‑Token ein (Profile Settings → API token)")# Wähle den am wenigsten ausgelasteten Quantencomputer als Backendbackend = service.least_busy(operational=True, simulator=False) # Erzeuge einen Sampler, der mit dem ausgewählten Backend verbunden istsampler = Sampler(backend) # Erzeuge einen Pass‑Manager zur Optimierung des Quantenschaltkreises für das gewählte Backend; Optimierungsstufe 3 ist die höchstmögliche Stufe. Niedrigere Stufen sind leichter verständlich, liefern jedoch weniger genaue Ergebnisse passmanager = generate_preset_pass_manager(3, backend=backend) quantum_registers = QuantumRegister(1, 'q')classical_registers = ClassicalRegister(1, 'c')circuit = QuantumCircuit(quantum_registers, classical_registers)# Wende das Identitätsgatter auf den Quantenschaltkreis ancircuit.id(quantum_registers[0]) # Messungcircuit.measure(quantum_registers[0], classical_registers[0])
# Erzeuge den optimierten Quantenschaltkreisoptimized_circuit = passmanager.run(circuit)
# Stelle den Quantenschaltkreis als Job in die Warteschlangejob = sampler.run([optimized_circuit], shots=1000) # Gib die Job‑ID ausprint("job id:", job.job_id()) # Warte auf die Ergebnisse; dies kann einige Zeit dauern. Die Ergebnisse sind auch auf der IBM‑Quantum‑Plattform verfügbar, falls der Job unterbrochen wird result = job.result() print(result[0].data.c.get_counts())
Die anderen Beispiele sind analog aufgebaut. Auch hier werden die Ergebnisse ähnlich, aufgrund von Rauschen jedoch wahrscheinlich nicht identisch sein.
Aufgabe 3. Wende das NOT‑Gatter auf die Superpositionszustände und an. Du kannst dazu entweder die Matrix‑Schreibweise und die Bra‑Ket‑Notation verwenden oder einen Quantenschaltkreis aufbauen bzw. Qiskit‑Code erstellen. Beschreibe das Ergebnis in eigenen Worten.
Mit anderen Worten, ein Pauli X-Gatter ändert ein Qubit in gleichwahrscheinlicher Superposition nicht.
Aufgabe 4. Nimm das Beispiel eines Hadamard‑Gatters, das auf ein Qubit angewendet wird. Erkläre, warum man sagt, dass „eine Messung den Quantenzustand eines Systems reduziert“ (oder: „der Quantenzustand kollabiert“) und warum mehrere Messungen notwendig sind, um ein „vernünftiges“ Ergebnis zu erhalten.
Ein Qubit, auf das ein Hadamard‑Gatter angewendet wurde, befindet sich in einer gleichwahrscheinlichen Superposition der Zustände und . Das bedeutet, dass beide Zustände gleichzeitig repräsentiert sind und dass eine Messung mit den möglichen Ergebnissen oder für beide Ergebnisse gleich wahrscheinlich ist. Eine einzelne Messung liefert daher entweder oder , jedoch nicht beide gleichzeitig oder einen Zwischenwert. Werden jedoch mehrere Messungen durchgeführt, wird jedes Mal ein neues Quantensystem in diese Superposition versetzt, sodass jede Messung erneut unabhängig durchgeführt wird und jeweils oder ergibt. Führt man nun viele Messungen durch (z. B. 1000), so ist im Mittel zu erwarten, dass etwa ungefähr 500‑mal und ebenfalls ungefähr 500‑mal gemessen wird (theoretisch ist es zwar auch möglich, dass 1000‑mal und kein einziges Mal gemessen wird, dies ist jedoch sehr unwahrscheinlich).
Aufgabe 5. Überprüfe, ob die beiden Qubits, die durch den Zustand beschrieben werden, verschränkt sind. Was gilt für zwei Qubits, die durch den Zustand dargestellt werden? Verwende dazu die in Teil 3 „2. Mit einem Hadamard‑ und einem CNOT‑Gatter zwei Qubits verschränken“ beschriebene Methode.
Beispiel 1:
In diesem Fall gilt und . Daraus folgt, dass , und gleich sind und gleich ist. Der Superpositionszustand kann somit geschrieben werden als:
,
was die Kombination zweier Qubit‑Zustände ist. Die beiden Qubit‑Zustände sind unabhängig voneinander, sie sind nicht verschränkt.
Beispiel 2:
In diesem Fall gilt und . Es gibt keine Lösung, die alle Gleichungen gleichzeitig erfüllt (die letzten beiden Gleichungen sind genau dann erfüllt, wenn , baber die ersten beiden Gleichungen erfordern, dass entweder oder , oder oder gleich sein muss). Das bedeutet, dass der Zustand nicht als Kronecker‑Produkt zweier Qubit‑Zustände geschrieben werden kann: Die beiden Qubits sind verschränkt.
Aufgabe 6. Verwende print(circuit), um einen der Quantenschaltkreise aus Aufgabe 1 auszugeben, einmal vor dem Optimierungsschritt und einmal danach. Beschreibe, was du bemerkst. Falls im Optimierungsschritt Quantengatter verwendet werden, die du noch nicht kennst, recherchiere, durch welche Matrix sie repräsentiert werden können und was sie bewirken.
Zunächst ist festzuhalten, dass die Optimierung den Quantenschaltkreis an die Anzahl der Qubits im Quantencomputer anpasst (wobei viele Qubits definiert, aber nicht verwendet werden). Danach können – abhängig vom Quantencomputer – ein oder mehrere Quantengatter durch äquivalente Quantengatter ersetzt werden, die auf dem Quantencomputer verfügbar sind.
Ein Quantenschaltkreis kann außerdem so verändert werden, dass er zuverlässiger ausgeführt wird. Das Ergebnis des Quantenschaltkreises bleibt dabei gleich.
Aufgabe 7. Verwende die folgenden Codezeilen, um den Quantenschaltkreis als Bild (PNG, SVG oder LaTeX) zu erzeugen und zu speichern – einmal vor dem Optimierungsschritt und einmal danach. Beschreibe, was du bemerkst. Falls im Optimierungsschritt Quantengatter verwendet werden, die du noch nicht kennst, recherchiere, welche Matrix sie repräsentieren und was sie bewirken.
# Zum Zeichnen von Quantenschaltkreisenfrom qiskit.visualization import circuit_drawer
# Verwendet Matplotlib zur Erstellung der Grafik; falls LaTeX installiert ist, kann auch "latex" verwendet werden circuit_image = circuit_drawer(circuit, output="mpl") # Speichere die Abbildung als Pixelgrafik (PNG)circuit_image.savefig("Circuit (MPL).png")# Speichere die Abbildung als Vektorgrafik (SVG)circuit_image.savefig("Circuit (MPL).svg")
Hier gelten die gleichen Ergebnisse wie bei Aufgabe 6.
Zum Beispiel wendet das folgende Programm ein CNOT‑Gatter auf zwei Qubits an, von denen eines durch das Anwenden eines Hadamard‑Gatters in eine Superposition gebracht wurde:
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuitfrom qiskit.visualization import circuit_drawer
quantum_registers = QuantumRegister(2, 'q')classical_registers = ClassicalRegister(2, 'c')circuit = QuantumCircuit(quantum_registers, classical_registers)circuit.h(quantum_registers[0])circuit.cx(quantum_registers[0], quantum_registers[1])circuit.measure(quantum_registers[0], classical_registers[0])circuit.measure(quantum_registers[1], classical_registers[1])
circuit_image = circuit_drawer(circuit, output="mpl", cregbundle=False)circuit_image.savefig("CNOT.svg")
Das Ergebnis wird in der Datei "CNOT.svg" gespeichert.
Beim Optimieren ist zunächst festzustellen, dass die Optimierung den Quantenschaltkreis an die Anzahl der Qubits im Quantencomputer anpasst (wobei viele Qubits definiert, aber nicht verwendet werden). Danach können – abhängig vom Quantencomputer – ein oder mehrere Quantengatter durch äquivalente Quantengatter ersetzt werden, die auf dem Quantencomputer verfügbar sind. Ein Quantenschaltkreis kann außerdem so verändert werden, dass er zuverlässiger ausgeführt wird, jedoch mit demselben Ergebnis. Die Ergebnisse unterscheiden sich jedoch je nach verwendetem Quantencomputer, da die Optimierung jeweils für den konkreten Quantencomputer durchgeführt wird.
Da unterschiedliche Quantencomputer unterschiedliche Sätze von Quantengattern anbieten, kann es vorkommen, dass bei der Optimierung sehr unterschiedliche Quantengatter verwendet werden. Jedes Quantengatter kann jedoch durch eine unitäre Matrix dargestellt werden. Siehe Liste der Quantengatter .
Aufgabe 8. Überprüfe die im Unterricht durchgeführten Matrizenrechnungen, also für das Pauli‑X‑Gatter, das Identitätsgatter, das Hadamard‑Gatter, das CNOT‑Gatter sowie für die Kombination aus Hadamard‑ und CNOT‑Gatter. Vergleiche die theoretischen und die gemessenen Ergebnisse, das heißt: Berechne die Quadrate der Amplituden und damit die Wahrscheinlichkeiten, mit denen das Qubit (bzw. die Qubits) in den verschiedenen Zuständen gefunden wird (werden), und vergleiche diese Wahrscheinlichkeiten mit den vom Quantencomputer ausgegebenen Ergebnissen.
Es ist unrealistisch anzunehmen, dass die Ergebnisse exakt erreicht werden. Jedoch werden sie im ähnlichen Bereich landen.
Aufgabe 9 (optional). Neben dem Pauli‑X‑Gatter gibt es auch ein Pauli‑Y‑Gatter und ein Pauli‑Z‑Gatter. Recherchiere deren Matrixdarstellungen und untersuche ihr Verhalten in einem Quantenschaltkreis.
Die Quantengatter Pauli‑Y und Pauli‑Z werden durch die folgenden Matrizen dargestellt:
und .
Die Quantengatter Pauli‑X, Pauli‑Y und Pauli‑Z repräsentieren Spiegelungen an jeweils einer der drei Achsen der Bloch‑Kugel.
Um das Verhalten dieser Gatter in einem Quantenschaltkreis zu visualisieren, verwende die Quantum Machine.
Aufgabe 10 (optional). Im Allgemeinen kann ein Quantenschaltkreis durch einen anderen äquivalenten Quantenschaltkreis ersetzt werden (innerhalb sinnvoller Näherungen). Eine Menge von Quantengattern, mit der sich jeder Quantenschaltkreis ersetzen lässt, wird als universeller Quantengattersatz bezeichnet. Informiere dich über universelle Quantengattersätze. Vergleiche die Quantenschaltkreise, die du vor und nach der Optimierung ausgeführt hast. Bestimme, welcher universelle Quantengattersatz vom Quantencomputer verwendet worden zu sein scheint.
Individuelle Antworten
Aufgabe 11 (optional). Recherchiere verschiedene technische Möglichkeiten, wie Qubits in einem Quantencomputer physikalisch realisiert werden können. Stichworte sind zum Beispiel Supraleiter und Ionenfallen.
Individuelle Antworten
Aufgabe 12 (optional). Im Jahr 1996 stellte David P. Di Vincenzo Kriterien vor, die ein Quantencomputer erfüllen muss, um funktionsfähig zu sein. Für einen funktionierenden Quantencomputer benötigt man:
Für einen funktionierenden Quantencomputer benötigt man:
- gut definierte Qubits;
- Qubits, die in gut definierten Anfangszuständen präpariert werden können;
- Qubits, die über einen ausreichend langen Zeitraum stabil sind (Dekohärenzzeit);
- ein universeller Satz von Quantengattern;
- die Möglichkeit, jedes Qubit einzeln zu messen.
Versuche die einzelnen Punkte mit dem in dieser Unterrichtseinheit Gelernten zu erklären. Wenn du nicht weiterkommst, recherchiere im Internet.
Ein gut definiertes Qubit stellt ein Quantensystem dar, das von den Gattern des Quantencomputers ma-nipuliert werden kann. Ein solches Qubit muss so initialisiert werden, dass es wiederholbar in einem be-stimmten Zustand ist. Da Qubits durch Einflüsse von außen (inklusive Messungen) verändert werden können, ist es wichtig, dass sie während eines Durchlaufs stabil bleiben und sich durch die Gatter zuver-lässig verändern lassen können. Die verfügbaren Gatter des Quantencomputers müssen so gewählt sein, dass man mit ihnen alle möglichen Quantenschaltkreise bauen kann. Zuletzt muss jedes Qubit einzeln messbar sein. Könnte man jeweils nur einige Qubits (aber nicht alle) messen, könnte man die Abhängig-keiten von Qubits untereinander (wie beispielsweise beim CNOT-Gatter) nicht darstellen.
Diese Seite teilen