Skip to content
Start/Blog/Quantenteleportation in Qiskit: Eine praktische Anleitung
AlgorithmsQiskitFundamentals

Quantenteleportation in Qiskit: Eine praktische Anleitung

Baue das Quantenteleportations-Protokoll von Grund auf in Qiskit: Bell-Paar, Bell-Basis-Messung und klassisch gesteuerte Korrektur, mit lauffähigem Code und einem nüchternen Blick darauf, was das Protokoll leistet und was nicht.

FreeQuantumComputing
·· 9 min read

Quantenteleportation überträgt den exakten Zustand eines Qubits von einem Ort zum anderen, ohne das Qubit selbst physisch zu transportieren. Das Protokoll benötigt drei Qubits, ein gemeinsam genutztes verschränktes Paar und zwei klassische Bits, und du baust das Ganze in unter dreißig Zeilen Qiskit-Code.

Der Name sorgt für die meiste Verwirrung rund um dieses Protokoll, also klären wir das, bevor wir Code anfassen.

Was Teleportation nicht ist

Das Protokoll bewegt keine Materie. Nichts am physischen Teilchen des Qubits verlagert sich irgendwohin. Was sich bewegt, ist Information: Das Qubit des Empfängers endet das Protokoll in genau dem Quantenzustand, in dem das Qubit des Senders begonnen hat.

Das Protokoll erlaubt keine Kommunikation schneller als Licht. Das Qubit des Empfängers ist unbrauchbarer Datenmüll, bis zwei klassische Bits vom Sender eintreffen, und diese Übertragung ist wie jedes andere klassische Signal an die Lichtgeschwindigkeit gebunden. Die Natur ist hier vorsichtig: Verschränkung allein korreliert Ergebnisse, trägt aber niemals von sich aus ein steuerbares Signal.

Das Protokoll kopiert das Qubit auch nicht. Das No-Cloning-Theorem verbietet, dass jemals eine perfekte Kopie eines unbekannten Quantenzustands neben dem Original existiert, und die Teleportation hält sich strikt daran: Der Akt der Zustandsübertragung zerstört die Kopie des Senders. Am Ende gibt es genau ein Qubit, das den Zustand trägt, und das Qubit des Empfängers ist nicht dasjenige, mit dem du gestartet bist.

Das Protokoll in drei Schritten

  1. Verschränkung im Voraus teilen. Sender und Empfänger halten je eine Hälfte eines Bell-Paares, verteilt bevor überhaupt bekannt ist, welcher Zustand teleportiert werden soll.
  2. Der Sender führt eine gemeinsame (Bell-Basis-)Messung an seiner Hälfte des Paares zusammen mit dem zu teleportierenden Qubit durch. Das erzeugt eines von vier zufälligen Zwei-Bit-Ergebnissen und zerstört dabei als Nebeneffekt den ursprünglichen Zustand des Qubits.
  3. Der Sender schickt diese zwei klassischen Bits an den Empfänger, der eines von vier passenden Gattern (Identität, X, Z oder XZ) auf seine Hälfte des Paares anwendet. Diese Korrektur rekonstruiert den exakten ursprünglichen Zustand, unabhängig davon, welches der vier Zufallsergebnisse in Schritt 2 aufgetreten ist.

Die Zufälligkeit in Schritt 2 ist real und unvermeidbar, und die Korrektur in Schritt 3 hebt sie deterministisch wieder auf. Diese Aufhebung ist der ganze Sinn des Protokolls, und dieser Schritt ist auch der Teil, den man am leichtesten falsch macht, mehr dazu weiter unten.

Die Schaltung in Qiskit aufbauen

Drei Qubits: q0 hält den zu teleportierenden Zustand, q1 ist die Hälfte des Senders am verschränkten Paar, q2 ist die Hälfte des Empfängers.

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile
from qiskit_aer import AerSimulator

theta = 0.9  # arbitrary angle, stands in for "an unknown state"

qr = QuantumRegister(3, "q")
cr = ClassicalRegister(2, "c")
result_reg = ClassicalRegister(1, "result")
qc = QuantumCircuit(qr, cr, result_reg)

# Step 0: prepare the state to teleport on q0. In a real protocol
# this state is unknown. Ry(theta) here only gives us something
# concrete to verify against later.
qc.ry(theta, 0)
qc.barrier()

Schritt 1: Das verschränkte Paar verteilen

qc.h(1)
qc.cx(1, 2)
qc.barrier()

Die übliche Konstruktion eines Bell-Zustands: ein Hadamard-Gatter gefolgt von einem CNOT. q1 und q2 sind jetzt maximal verschränkt, und in einer echten Installation wären sie bereits getrennt: q1 beim Sender, q2 beim Empfänger, bevor der Rest des Protokolls läuft.

Schritt 2: Bell-Basis-Messung

qc.cx(0, 1)
qc.h(0)
qc.measure(0, cr[0])
qc.measure(1, cr[1])
qc.barrier()

CNOT und Hadamard drehen den gemeinsamen Zustand von q0 und q1 in die Bell-Basis, sodass eine gewöhnliche Messung in der Rechenbasis jetzt ausliest, in welchen der vier Bell-Zustände das Paar kollabiert ist. Dieses Ergebnis ist gleichverteilt zufällig, mit rund 25 % für jede der vier Kombinationen von cr[0] und cr[1], und genau diese Zufälligkeit auszugleichen ist die Aufgabe des nächsten Schritts.

Schritt 3: Klassisch gesteuerte Korrektur

with qc.if_test((cr[1], 1)):
    qc.x(2)
with qc.if_test((cr[0], 1)):
    qc.z(2)

Das ist eine echte klassische Bedingung mitten in der Schaltung, keine Abkürzung: q2 erhält nur dann ein X-Gatter, wenn das klassische Bit cr[1] eine 1 gemessen hat, und nur dann ein Z-Gatter, wenn cr[0] eine 1 gemessen hat. Qiskits if_test-Kontextmanager kompiliert das zu einer echten dynamischen Schaltung, demselben Mechanismus, den ein physischer Aufbau nutzen würde, um zwei klassische Bits über einen gewöhnlichen Kanal zu senden und am anderen Ende eine Korrektur anzuwenden.

Schritt 4: Überprüfen, ob das Protokoll funktioniert hat

qc.ry(-theta, 2)
qc.measure(2, result_reg[0])

sim = AerSimulator()
tqc = transpile(qc, sim)
counts = sim.run(tqc, shots=4096).result().get_counts()
print(sorted(counts.items()))

Der Verifikationstrick: die Umkehrung der ursprünglichen Rotation auf q2 anwenden und das Qubit messen. Wenn q2 tatsächlich im exakten Zustand endete, mit dem q0 gestartet ist, schickt das Rückgängigmachen dieser Rotation das Qubit zurück zu |0⟩, und das result-Bit liest 0. Die vier (cr[0], cr[1])-Ergebnisse bleiben über den Lauf hinweg ungefähr gleichmäßig verteilt, das zufällige Bell-Messergebnis verhält sich wie erwartet, während das result-Bit unabhängig davon, welches der vier Ergebnisse auftrat, 0 liest. Das ist der Lohn: Der Korrekturschritt hebt jedes zufällige Ergebnis auf, das auftritt, jedes einzelne Mal, nicht nur im Durchschnitt.

Der Fehler: Die Korrektur weglassen, "weil die Schaltung sowieso in Ordnung ist"

Beim Betrachten dieser Schaltung könnte man annehmen, der Korrekturschritt sei ein kleines Detail, da drei der vier Bell-Ergebnisse dem Identitätsfall nahezukommen scheinen. Das stimmt nicht. Lass die if_test-Blöcke weg und miss q2 direkt: Das Ergebnis kommt nur bei den rund 25 % der Durchläufe korrekt zurück, bei denen die Bell-Messung zufällig auf |00⟩ gelandet ist, und kommt in den anderen drei Vierteln der Zeit verfälscht zurück. Hier gibt es keine Teilpunkte. Die Korrektur ist keine Optimierung, die Korrektur ist der Mechanismus, der das Protokoll deterministisch macht statt zu einem nur zu einem Viertel verlässlichen Münzwurf.

Wofür Teleportation da ist

Das Protokoll selbst hat keine eigenständige Anwendung als reiner Party-Trick. Seine Bedeutung ist struktureller Natur: Das ist der Mechanismus, den Quantennetzwerke und verteiltes Quantencomputing nutzen, um den Zustand eines Qubits zwischen Knoten zu bewegen, die nur durch vorab geteilte Verschränkung und einen klassischen Kanal verbunden sind, statt durch eine direkte Quantenverbindung. Jeder Vorschlag, separate QPUs zu einer größeren logischen Maschine zu verbinden, oder Quantenrepeater, die Verschränkung über lange Glasfaserstrecken ausdehnen, baut genau auf dieser Grundoperation auf. Superdense Coding, das zwei klassische Bits mit einem übertragenen Qubit sendet, ist dieselbe Idee umgekehrt angewandt.

Ausführung auf echter Hardware

Eine Messung mitten in der Schaltung, gefolgt von einem klassisch gesteuerten Gatter, ist eine deutlich anspruchsvollere Hardware-Anforderung als eine statische Schaltung. Das System braucht schnelle, latenzarme klassische Steuerelektronik, die eine Messung ausliest und eine Korrektur zurück in dieselbe Schaltung einspeist, bevor die Qubits dekohärent werden, eine Fähigkeit, die oft "dynamische Schaltungen" genannt wird und die nicht jedes Cloud-Backend auf jeder Gerätegeneration unterstützt. Wo dynamische Schaltungen nicht verfügbar sind, ersetzen manche Implementierungen die klassischen Korrekturen durch bedingte Zwei-Qubit-Gatter und verschieben jede Messung ans Ende, was die Mathematik des Protokolls in der Simulation korrekt verifiziert, aber genau den Schritt der klassischen Kommunikation umgeht, der Teleportation für Netzwerke überhaupt erst praktisch macht. Prüfe bei Läufen auf echter Hardware, ob dein Ziel-Backend dynamische Schaltungen ausdrücklich unterstützt, bevor du davon ausgehst, dass dieser Code wie geschrieben läuft.

Nächste Schritte