Qiskit-Implementierung
In diesem Abschnitt schauen wir uns einige Qiskit-Implementierungen der in dieser Lektion eingeführten Konzepte an. Wenn du diese Implementierungen selbst ausführen möchtest – was sehr empfohlen wird –, sieh dir die Seite Install Qiskit in der IBM Quantum-Dokumentation an, um zu erfahren, wie du Qiskit einrichten kannst.
Es sollte beachtet werden, dass Qiskit kontinuierlich weiterentwickelt wird und hauptsächlich darauf ausgerichtet ist, die Leistung der Quantencomputer zu maximieren, für deren Betrieb es eingesetzt wird, die sich ebenfalls ständig weiterentwickeln. Daher unterliegt Qiskit Änderungen, die gelegentlich zu Code-Deprecation führen können. Mit diesem Gedanken im Hinterkopf werden wir in diesem Kurs immer die folgenden Befehle ausführen, bevor wir Beispiele von Qiskit-Code präsentieren, sodass klar ist, welche Version von Qiskit verwendet wurde. Ab Qiskit v1.0 ist dies eine einfache Möglichkeit zu sehen, welche Version von Qiskit aktuell installiert ist.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
from qiskit import __version__
print(__version__)
2.1.1
Wenn du dies in einer cloudbasierten Python-Umgebung ausführst, musst du möglicherweise einige der folgenden Pakete installieren:
#!pip install qiskit
#!pip install jupyter
#!pip install sympy
#!pip install matplotlib
#!pip install pylatexenc
Vektoren und Matrizen in Python
Qiskit verwendet die Programmiersprache Python. Bevor wir speziell auf Qiskit eingehen, kann es daher hilfreich sein, kurz auf Matrix- und Vektorberechnungen in Python einzugehen.
In Python können Matrix- und Vektorberechnungen mit der Klasse array aus der NumPy-Bibliothek durchgeführt werden, die Funktionalität für viele numerische und wissenschaftliche Berechnungen bietet.
Der folgende Code lädt diese Bibliothek, definiert zwei Spaltenvektoren, ket0 und ket1, die den Qubit-Zustandsvektoren und entsprechen, und gibt dann ihren Mittelwert aus.
import numpy as np
ket0 = np.array([[1], [0]])
ket1 = np.array([[0], [1]])
print(ket0 / 2 + ket1 / 2)
[[0.5]
[0.5]]
Wir können array auch zur Erstellung von Matrizen verwenden, die Operationen darstellen können.
M1 = np.array([[1, 1], [0, 0]])
M2 = np.array([[1, 0], [0, 1]])
M = M1 / 2 + M2 / 2
print(M)
[[1. 0.5]
[0. 0.5]]
Bitte beachte, dass aller Code innerhalb einer Lektion in diesem Kurs sequenziell ausgeführt werden sollte.
Daher müssen wir NumPy hier nicht erneut importieren, da es bereits importiert wurde.
Matrizenmultiplikation, einschließlich Matrix-Vektor-Multiplikation als Spezialfall, kann mit der Funktion matmul aus NumPy durchgeführt werden.
print(np.matmul(M1, ket1))
print(np.matmul(M1, M2))
print(np.matmul(M, M))
[[1]
[0]]
[[1 1]
[0 0]]
[[1. 0.75]
[0. 0.25]]
Diese Ausgabeformatierung lässt optisch etwas zu wünschen übrig.
Eine Lösung für Situationen, die eine ansprechendere Darstellung erfordern, ist die Funktion array_to_latex in Qiskit aus dem Modul qiskit.visualization.
Beachte, dass wir im folgenden Code Pythons generische display-Funktion verwenden.
Im Gegensatz dazu kann das Verhalten von print je nach ausgegebenem Inhalt variieren, wie es zum Beispiel bei Arrays aus NumPy der Fall ist.
from qiskit.visualization import array_to_latex
display(array_to_latex(np.matmul(M1, ket1)))
display(array_to_latex(np.matmul(M1, M2)))
display(array_to_latex(np.matmul(M, M)))
Zustände, Messungen und Operationen
Qiskit enthält mehrere Klassen, die es ermöglichen, Zustände, Messungen und Operationen zu erstellen und zu manipulieren – es ist also nicht nötig, alles, was für die Simulation von Quantenzuständen, Messungen und Operationen benötigt wird, in Python selbst zu programmieren. Im Folgenden sind einige Beispiele zum Einstieg aufgeführt.
Zustandsvektoren definieren und anzeigen
Die Klasse Statevector in Qiskit bietet Funktionalität zum Definieren und Manipulieren von Quantenzustandsvektoren.
Im folgenden Code wird die Klasse Statevector importiert und einige Vektoren werden definiert.
(Wir importieren auch die sqrt-Funktion aus der NumPy-Bibliothek, um eine Quadratwurzel zu berechnen.
Diese Funktion könnte alternativ als np.sqrt aufgerufen werden, sofern NumPy bereits importiert wurde, wie es oben der Fall ist; dies ist lediglich eine andere Möglichkeit, diese spezifische Funktion zu importieren und zu nutzen.)
from qiskit.quantum_info import Statevector
from numpy import sqrt
u = Statevector([1 / sqrt(2), 1 / sqrt(2)])
v = Statevector([(1 + 2.0j) / 3, -2 / 3])
w = Statevector([1 / 3, 2 / 3])
Die Klasse Statevector enthält eine draw-Methode zur Darstellung von Zustandsvektoren auf verschiedene Arten, darunter
text für Klartext, latex für gerendertes LaTeX und latex_source für LaTeX-Code, was beim Kopieren in Dokumente praktisch sein kann.
(Verwende print anstelle von display, um LaTeX-Code optimal darzustellen.)
display(u.draw("text"))
display(u.draw("latex"))
print(u.draw("latex_source"))
[0.70710678+0.j,0.70710678+0.j]