Quantenbits, Gates und Schaltkreise
Kifumi Numata (19 Apr 2024)
Klicke hier, um das PDF der Originalvorlesung herunterzuladen. Beachte, dass einige Code-Snippets veraltet sein könnten, da es sich um statische Bilder handelt.
Ungefähre QPU-Zeit für dieses Experiment: 5 Sekunden.
1. Einführung
Bits, Gates und Schaltkreise sind die grundlegenden Bausteine des Quantencomputings. Du wirst Quantenberechnung mit dem Schaltkreismodell unter Verwendung von Quantenbits und Gates erlernen und außerdem Superposition, Messung und Verschränkung wiederholen.
In dieser Lektion lernst du:
- Einzelne Qubit-Gates
- Bloch-Kugel
- Superposition
- Messung
- Zwei-Qubit-Gates und verschränkte Zustände
Am Ende dieser Vorlesung wirst du etwas über die Schaltkreistiefe lernen, die für Quantencomputing im Utility-Scale-Bereich entscheidend ist.
2. Berechnung als Diagramm
Wenn wir Qubits oder Bits verwenden, müssen wir sie manipulieren, um die vorhandenen Eingaben in die benötigten Ausgaben umzuwandeln. Für die einfachsten Programme mit sehr wenigen Bits ist es nützlich, diesen Prozess in einem Diagramm darzustellen, das als Schaltkreisdiagramm bekannt ist.
Die Abbildung unten links zeigt ein Beispiel eines klassischen Schaltkreises, und die Abbildung unten rechts zeigt ein Beispiel eines Quantenschaltkreises. In beiden Fällen befinden sich die Eingaben links und die Ausgaben rechts, während die Operationen durch Symbole dargestellt werden. Die für die Operationen verwendeten Symbole werden hauptsächlich aus historischen Gründen als „Gates" bezeichnet.
3. Einzelnes Qubit-Gate
3.1 Quantenzustand und Bloch-Kugel
Der Zustand eines Qubits wird als Superposition von und dargestellt. Ein beliebiger Quantenzustand wird geschrieben als
wobei und komplexe Zahlen sind, sodass .
und sind Vektoren im zweidimensionalen komplexen Vektorraum:
Daher wird ein beliebiger Quantenzustand auch dargestellt als
Daraus können wir erkennen, dass der Zustand eines Quantenbits ein Einheitsvektor in einem zweidimensionalen komplexen Innenproduktraum mit einer orthonormalen Basis aus und ist. Er ist auf 1 normiert.
|\psi\rangle =\begin\{pmatrix\} \alpha \\ \beta \end\{pmatrix\} wird auch als Zustandsvektor (Statevector) bezeichnet.
Ein einzelner Qubit-Quantenzustand wird auch dargestellt als
wobei und die Winkel der Bloch-Kugel in der folgenden Abbildung sind.
In den nächsten Code-Zellen werden wir grundlegende Berechnungen aus den Bestandteilen in Qiskit aufbauen. Wir konstruieren einen leeren Schaltkreis und fügen dann Quantenoperationen hinzu, wobei wir die Gates besprechen und ihre Auswirkungen visualisieren.
Du kannst die Zelle mit „Shift" + „Enter" ausführen. Importiere zuerst die Bibliotheken.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-aer qiskit-ibm-runtime
# Import the qiskit library
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector
from qiskit_ibm_runtime import Sampler
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.visualization import plot_histogram
Vorbereitung des Quantenschaltkreises
Wir erstellen und zeichnen einen Einzelqubit-Schaltkreis.
# Create the single-qubit quantum circuit
qc = QuantumCircuit(1)
# Draw the circuit
qc.draw("mpl")
X-Gate
Das X-Gate ist eine -Rotation um die -Achse der Bloch-Kugel. Die Anwendung des X-Gates auf ergibt , und die Anwendung des X-Gates auf ergibt , sodass es eine Operation ähnlich dem klassischen NOT-Gate ist und auch als Bit-Flip bekannt ist. Die Matrixdarstellung des X-Gates ist unten gezeigt.
qc = QuantumCircuit(1) # Prepare the single-qubit quantum circuit
# Apply a X gate to qubit 0
qc.x(0)
# Draw the circuit
qc.draw("mpl")
Bei IBM Quantum® ist der Anfangszustand auf gesetzt, sodass der obige Quantenschaltkreis in Matrixdarstellung lautet
Als Nächstes führen wir diesen Schaltkreis mit einem Zustandsvektor-Simulator aus.
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([0.+0.j, 1.+0.j],
dims=(2,))
Der vertikale Vektor wird als Zeilenvektor angezeigt, mit komplexen Zahlen (der Imaginärteil wird durch indiziert).
H-Gate
Das Hadamard-Gate ist eine -Rotation um eine Achse auf halbem Weg zwischen der - und -Achse auf der Bloch-Kugel. Die Anwendung des H-Gates auf erzeugt einen Superpositionszustand wie . Die Matrixdarstellung des H-Gates ist unten gezeigt.
qc = QuantumCircuit(1) # Create the single-qubit quantum circuit
# Apply an Hadamard gate to qubit 0
qc.h(0)
# Draw the circuit
qc.draw(output="mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([0.70710678+0.j, 0.70710678+0.j],
dims=(2,))
Das ist
Dieser Superpositionszustand ist so häufig und wichtig, dass er sein eigenes Symbol hat:
Durch Anwendung des -Gates auf den haben wir eine Superposition aus und erzeugt, bei der eine Messung in der Rechenbasis (entlang z im Bloch-Kugel-Bild) jeden Zustand mit gleicher Wahrscheinlichkeit ergibt.
-Zustand
Du hast vielleicht vermutet, dass es einen entsprechenden -Zustand gibt:
Um diesen Zustand zu erzeugen, wende zuerst ein X-Gate an, um zu erhalten, und dann ein H-Gate.
qc = QuantumCircuit(1) # Create the single-qubit quantum circuit
# Apply a X gate to qubit 0
qc.x(0)
# Apply an Hadamard gate to qubit 0
qc.h(0)
# draw the circuit
qc.draw(output="mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([ 0.70710678+0.j, -0.70710678+0.j],
dims=(2,))
Das ist
Die Anwendung des -Gates auf ergibt eine gleichmäßige Superposition aus und , aber das Vorzeichen von ist negativ.
3.2 Einzelner Qubit-Quantenzustand und unitäre Evolution
Die Wirkungen aller Gates, die wir bisher gesehen haben, waren unitär, was bedeutet, dass sie durch einen unitären Operator dargestellt werden können. Mit anderen Worten, der Ausgabezustand kann durch Anwendung einer unitären Matrix auf den Anfangszustand erhalten werden:
Eine unitäre Matrix ist eine Matrix, die folgende Bedingung erfüllt
In Bezug auf den Betrieb von Quantencomputern würden wir sagen, dass die Anwendung eines Quanten-Gates auf das Qubit den Quantenzustand entwickelt. Häufige Einzelqubit-Gates umfassen die folgenden.
Pauli-Gates:
wobei das äußere Produkt wie folgt berechnet wurde:
Weitere typische Einzelqubit-Gates:
Die Bedeutung und Verwendung dieser Gates wird im Kurs Grundlagen der Quanteninformation detaillierter beschrieben.
Übung 1
Verwende Qiskit, um Quantenschaltkreise zu erstellen, die die unten beschriebenen Zustände vorbereiten. Führe dann jeden Schaltkreis mit dem Zustandsvektor-Simulator aus und zeige den resultierenden Zustand auf der Bloch-Kugel an. Als Bonus: Versuche vorherzusagen, was der Endzustand basierend auf der Intuition über die Gates und Rotationen in der Bloch-Kugel sein sollte.
(1)
(2)
(3)
Tipps: Das Z-Gate kann wie folgt verwendet werden
qc.z(0)
Lösung:
### (1) XX|0> ###
# Create the single-qubit quantum circuit
qc = QuantumCircuit(1) ##your code goes here##
# Add a X gate to qubit 0
qc.x(0) ##your code goes here##
# Add a X gate to qubit 0
qc.x(0) ##your code goes here##
# Draw a circuit
qc.draw(output="mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([1.+0.j, 0.+0.j],
dims=(2,))
### (2) HH|0> ###
##your code goes here##
qc = QuantumCircuit(1)
qc.h(0)
qc.h(0)
qc.draw("mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([1.+0.j, 0.+0.j],
dims=(2,))
### (3) HZH|0> ###
##your code goes here##
qc = QuantumCircuit(1)
qc.h(0)
qc.z(0)
qc.h(0)
qc.draw("mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
# Draw a Bloch sphere
plot_bloch_multivector(out_vector)
Statevector([0.+0.j, 1.+0.j],
dims=(2,))
3.3 Messung
Messung ist theoretisch ein sehr kompliziertes Thema. Aber in praktischer Hinsicht zwingt eine Messung entlang (wie es alle IBM®-Quantencomputer tun) den Zustand des Qubits einfach in oder und wir beobachten das Ergebnis.
- ist die Wahrscheinlichkeit, dass wir erhalten, wenn wir messen.
- ist die Wahrscheinlichkeit, dass wir erhalten, wenn wir messen.
Also werden und als Wahrscheinlichkeitsamplituden bezeichnet. (siehe „Born-Regel")
Zum Beispiel hat eine gleiche Wahrscheinlichkeit, bei der Messung zu oder zu werden. hat eine 75%ige Chance, zu zu werden.
Qiskit Aer Simulator
Als Nächstes messen wir einen Schaltkreis, der die obige Superposition mit gleicher Wahrscheinlichkeit vorbereitet. Wir sollten die Mess-Gates hinzufügen, da der Qiskit Aer Simulator standardmäßig eine ideale (rauschfreie) Quantenhardware simuliert. Hinweis: Der Aer Simulator kann auch ein Rauschmodell basierend auf einem echten Quantencomputer anwenden. Wir werden später auf Rauschmodelle zurückkommen.
# Create a new circuit with one qubits (first argument) and one classical bits (second argument)
qc = QuantumCircuit(1, 1)
qc.h(0)
qc.measure(0, 0) # Add the measurement gate
qc.draw(output="mpl")
Wir sind nun bereit, unseren Schaltkreis auf dem Aer Simulator auszuführen. In diesem Beispiel verwenden wir die Standardeinstellung shots=1024, was bedeutet, dass wir 1024 Mal messen. Dann stellen wir diese Zähler in einem Histogramm dar.
# Run the circuit on a simulator to get the results
# Define backend
backend = AerSimulator()
# Transpile to backend
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_qc = pm.run(qc)
# Run the job
sampler = Sampler(mode=backend)
job = sampler.run([isa_qc])
result = job.result()
# Print the results
counts = result[0].data.c.get_counts()
print(counts)
# Plot the counts in a histogram
plot_histogram(counts)
{'0': 521, '1': 503}
Wir sehen, dass 0en und 1en jeweils mit einer Wahrscheinlichkeit von fast 50% gemessen wurden. Obwohl hier kein Rauschen simuliert wurde, sind die Zustände dennoch probabilistisch. Obwohl wir ungefähr eine 50-50-Verteilung erwarten, werden wir diese selten genau finden. Genauso wie 100 Münzwürfe selten genau 50 Instanzen jeder Seite ergeben würden.
4. Multi-Qubit-Gate und Verschränkung
4.1 Multi-Qubit-Quantenschaltkreis
Wir können einen Zwei-Qubit-Quantenschaltkreis mit folgendem Code erstellen. Wir werden ein H-Gate auf jedes Qubit anwenden.
# Create the two qubits quantum circuit
qc = QuantumCircuit(2)
# Apply an H gate to qubit 0
qc.h(0)
# Apply an H gate to qubit 1
qc.h(1)
# Draw the circuit
qc.draw(output="mpl")
# See the statevector
out_vector = Statevector(qc)
print(out_vector)
Statevector([0.5+0.j, 0.5+0.j, 0.5+0.j, 0.5+0.j],
dims=(2, 2))
Hinweis: Qiskit-Bit-Reihenfolge
Qiskit verwendet die Little-Endian-Notation bei der Anordnung von Qubits und Bits, was bedeutet, dass Qubit 0 das rechteste Bit in den Bitstrings ist. Beispiel: bedeutet q0 ist und q1 ist