Qiskit-Implementierung
In der vorherigen Lektion haben wir einen ersten Blick auf die Klassen Statevector und Operator in Qiskit geworfen und sie verwendet, um Operationen und Messungen auf einzelnen Qubits zu simulieren.
In diesem Abschnitt nutzen wir diese Klassen, um das Verhalten mehrerer Qubits zu untersuchen.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit import __version__
print(__version__)
2.1.1
Wir beginnen damit, die Klassen Statevector und Operator sowie die Quadratwurzelfunktion aus NumPy zu importieren.
Von nun an kümmern wir uns generell zu Beginn jeder Lektion um alle nötigen Importe.
from qiskit.quantum_info import Statevector, Operator
from numpy import sqrt
Tensorprodukte
Die Klasse Statevector hat eine tensor-Methode, die das Tensorprodukt dieses Statevector mit einem anderen zurückgibt, der als Argument übergeben wird.
Das Argument wird als der rechte Tensorfaktor interpretiert.
Im folgenden Beispiel erstellen wir zwei Zustandsvektoren für und und nutzen die tensor-Methode, um einen neuen Vektor zu erzeugen.
Beachte, dass wir hier die Methode from_label verwenden, um die Zustände und zu definieren, anstatt sie manuell anzugeben.
zero = Statevector.from_label("0")
one = Statevector.from_label("1")
psi = zero.tensor(one)
display(psi.draw("latex"))
Weitere erlaubte Labels sind "+" und "-" für die Plus- und Minuszustände sowie "r" und "l" (kurz für „right" und „left") für die Zustände
Hierbei stammen „+", „-" bzw. „right" und „left" aus dem Kontext des quantenmechanischen Spins, bei dem eine Spin-Komponente in einem Experiment nach links oder rechts zeigen kann; es geht nicht um das rechts- oder linksstehende Qubit in Systemen mit mehreren Qubits. Hier ist ein Beispiel für das Tensorprodukt von und
plus = Statevector.from_label("+")
minus_i = Statevector.from_label("l")
phi = plus.tensor(minus_i)
display(phi.draw("latex"))
Alternativ kann der ^-Operator für Tensorprodukte verwendet werden, der erwartungsgemäß dieselben Ergebnisse liefert.
display((plus ^ minus_i).draw("latex"))
Die Klasse Operator hat ebenfalls eine tensor-Methode (sowie eine from_label-Methode), wie die folgenden Beispiele zeigen.
H = Operator.from_label("H")
Id = Operator.from_label("I")
X = Operator.from_label("X")
display(H.tensor(Id).draw("latex"))
display(H.tensor(Id).tensor(X).draw("latex"))
Wie bei den Vektoren ist auch hier der ^-Operator äquivalent.
display((H ^ Id ^ X).draw("latex"))
Zusammengesetzte Zustände können mit zusammengesetzten Operationen entwickelt werden, genau wie man es erwartet – genauso wie wir es für Einzelsysteme in der vorherigen Lektion gesehen haben. Der folgende Code berechnet zum Beispiel den Zustand für (der bereits oben definiert wurde).
display(phi.evolve(H ^ Id).draw("latex"))
Hier ist Code, der eine -Operation definiert und für berechnet. Es handelt sich um eine -Operation, bei der das linke Qubit das Kontroll-Qubit und das rechte Qubit das Ziel-Qubit ist. Das Ergebnis ist der Bell-Zustand
CX = Operator([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]])
psi = plus.tensor(zero)
display(psi.evolve(CX).draw("latex"))
Partielle Messungen
In der vorherigen Lektion haben wir die measure-Methode genutzt, um eine Messung eines Quantenzustandsvektors zu simulieren.
Diese Methode gibt zwei Werte zurück: das simulierte Messergebnis und den neuen Statevector nach dieser Messung.
Standardmäßig misst measure alle Qubits im Zustandsvektor.
Alternativ kann eine Liste von ganzen Zahlen als Argument übergeben werden, wodurch nur die Qubits mit diesen Indizes gemessen werden.
Um dies zu demonstrieren, erstellt der folgende Code den Zustand
und misst Qubit Nummer 0, also das rechtsstehende Qubit. (Qiskit nummeriert Qubits beginnend bei 0, von rechts nach links. Auf diese Nummerierungskonvention kommen wir in der nächsten Lektion zurück.)
w = Statevector([0, 1, 1, 0, 1, 0, 0, 0] / sqrt(3))
display(w.draw("latex"))
result, state = w.measure([0])
print(f"Measured: {result}\nState after measurement:")
display(state.draw("latex"))
result, state = w.measure([0, 1])
print(f"Measured: {result}\nState after measurement:")
display(state.draw("latex"))
Measured: 0
State after measurement:
Measured: 00
State after measurement: