Hands-on mit Qiskit: Hello World - Qiskit Patterns
In diesem Notebook durchläufst du einen Qiskit-Patterns-Workflow und verwendest Qiskits Sampler-Primitive.
Dieses Tutorial enthält teilweise Inhalte aus der IBM Quantum-Dokumentation: Hello World.
Nützliche Links:
- Bitte erstelle ein IBM Cloud-Konto, um auf die IBM Quantum Platform zuzugreifen.
- Für Personen mit einer Universitäts-E-Mail: Hier einen Feature-Code anfordern, um den kostenlosen Testzeitraum zu verlängern.
- Für Personen ohne Universitäts-E-Mail: Anleitung zur Aktivierung deines Kontos. Aktiviere dein Konto vollständig, indem du eine Kreditkarte hinterlegst. Deine Kreditkarte wird weder in diesem Prozess noch zufällig danach belastet. Diese Aktivierung ermöglicht dir, nach Ablauf des Testzeitraums (30 Tage) weiterhin auf deine kostenlosen Ressourcen in der IBM Cloud und der IBM Quantum Platform zuzugreifen.
- Wir verwenden eine cloudbasierte Plattform, um eine Programmierumgebung einzurichten. Du kannst entweder QBraid oder Google Colab nutzen.
- Nach diesem Notebook werden wir uns das Quantenteleportations-Protokoll ansehen.
Weitere Links – Qiskit-Community und weiterführende Lernressourcen:
- Grok sphere
- IBM Quantum Composer
- IBM Quantum Learning
- Qiskit Global Summer School 2025 – Vorlesungen
- Qiskit v2.X Zertifizierung
- Qiskit Advocate-Programm
- Quantum Sommerpraktika
- Qiskit YouTube
Qiskit installieren
Du kannst eine Online-JupyterLab-Umgebung verwenden (siehe Leitfaden Online-Lab-Umgebungen) oder Qiskit lokal installieren.
Folge dem Qiskit-Installationsleitfaden Installiere das Qiskit SDK und den Qiskit Runtime Client, um die folgenden Schritte abzuschließen:
-
Installiere Qiskit einschließlich der zusätzlichen Visualisierungspakete:
pip install qiskit[visualization] -
Installiere qiskit-ibm-runtime:
pip install qiskit-ibm-runtime -
Installiere jupyter:
pip install jupyterÜberprüfe, dass die Python-Version in deiner Umgebung python>=3.10 ist, um sicherzustellen, dass sie mit der neuesten Qiskit-Version kompatibel ist:
# Added by doQumentation — required packages for this notebook
!pip install -q IPython
from platform import python_version
print(python_version())
3.13.7
Falls du Python aktualisieren musst und nicht weißt wie, lies diese Anleitung zur Aktualisierung von Python je nach Betriebssystem: How to update Python
%pip install qiskit[visualization]
%pip install qiskit-ibm-runtime
%pip install
%pip install qiskit-aer
zsh:1: no matches found: qiskit[visualization]
Note: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-ibm-runtime in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.43.0)
Requirement already satisfied: requests>=2.19 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.32.5)
Requirement already satisfied: requests-ntlm>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (1.3.0)
Requirement already satisfied: numpy>=1.13 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.3.3)
Requirement already satisfied: urllib3>=1.21.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.5.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.9.0.post0)
Requirement already satisfied: ibm-platform-services>=0.22.6 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (0.69.0)
Requirement already satisfied: pydantic>=2.5.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.12.2)
Requirement already satisfied: qiskit>=1.4.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.2.1)
Requirement already satisfied: packaging in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (25.0)
Requirement already satisfied: ibm_cloud_sdk_core<4.0.0,>=3.24.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (3.24.2)
Requirement already satisfied: PyJWT<3.0.0,>=2.10.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm_cloud_sdk_core<4.0.0,>=3.24.2->ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (2.10.1)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-ibm-runtime) (1.17.0)
Requirement already satisfied: charset_normalizer<4,>=2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.4.4)
Requirement already satisfied: idna<4,>=2.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.11)
Requirement already satisfied: certifi>=2017.4.17 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (2025.10.5)
Requirement already satisfied: annotated-types>=0.6.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.7.0)
Requirement already satisfied: pydantic-core==2.41.4 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (2.41.4)
Requirement already satisfied: typing-extensions>=4.14.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (4.15.0)
Requirement already satisfied: typing-inspection>=0.4.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.4.2)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.17.1)
Requirement already satisfied: scipy>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (1.16.2)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (5.5.0)
Requirement already satisfied: cryptography>=1.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (46.0.2)
Requirement already satisfied: pyspnego>=0.4.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (0.12.0)
Requirement already satisfied: cffi>=2.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.0.0)
Requirement already satisfied: pycparser in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cffi>=2.0.0->cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.23)
Note: you may need to restart the kernel to use updated packages.
[31mERROR: You must give at least one requirement to install (see "pip help install")[0m[31m
[0mNote: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-aer in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.17.2)
Requirement already satisfied: qiskit>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.2.1)
Requirement already satisfied: numpy>=1.16.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.3.3)
Requirement already satisfied: scipy>=1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (1.16.2)
Requirement already satisfied: psutil>=5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (7.1.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-aer) (1.17.0)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.17.1)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (5.5.0)
Requirement already satisfied: typing-extensions in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (4.15.0)
Note: you may need to restart the kernel to use updated packages.
Die notwendigen Importe vornehmen
Nehmen wir die notwendigen Importe für dieses Tutorial vor.
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
import qiskit_ibm_runtime
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.quantum_info import SparsePauliOp
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector, plot_state_qsphere
from IPython.display import display, Latex
Dein IBM Quantum Platform-Konto einrichten
Um Quantenschaltkreise auf echter Hardware auszuführen, benötigst du ein IBM Cloud-Konto.
Folge den Anweisungen in diesem Leitfaden Richte dein IBM Cloud-Konto ein, um die folgenden Schritte abzuschließen:
- Richte ein IBM Cloud-Konto ein, falls du noch keines hast.
- Melde dich bei einem IBM Quantum Platform-Konto mit einer IBMid an oder erstelle eines.
- Rufe dein IBM Quantum Platform-Dashboard auf, erstelle deinen API-Token und kopiere ihn an einen sicheren Ort. (Siehe erstes Referenzbild unten.)
- Ersetze im folgenden Code-Block
deleteThisAndPasteYourAPIKeyHeredurch deinen API-Schlüssel. - Gehe zur Seite „Instanzen" im ☰-Hauptmenü und erstelle deine Instanz. Wenn du kein Mitglied einer Netzwerkinstitution bist, wähle den offenen Plan. (Siehe zweites Referenzbild unten.)
- Kopiere nach der Erstellung der Instanz den zugehörigen CRN-Code. (CRN steht für Cloud Resource Names.) Möglicherweise musst du die Seite aktualisieren, um die Instanz zu sehen.
- Ersetze im folgenden Code-Block
deleteThisAndPasteYourCRNHeredurch deinen CRN-Code.
Hinweis: Behandle deinen API-Schlüssel wie ein sicheres Passwort. Weitere Informationen zur Verwendung deines API-Schlüssels in sicheren und nicht vertrauenswürdigen Umgebungen findest du im Leitfaden Richte dein IBM Cloud-Konto ein.
#@title personals
your_api_key = "YOUR_API_KEY"
your_crn = "YOUR_CRN"
from qiskit_ibm_runtime import QiskitRuntimeService
# Save your API key to access real devices
your_api_key = your_api_key
your_crn = your_crn
QiskitRuntimeService.save_account(
channel="ibm_cloud",
token=your_api_key,
instance=your_crn,
set_as_default=True,
overwrite=True,
)
Einen einfachen Quantenalgorithmus mit dem Qiskit-Pattern-Framework erstellen und ausführen
Das konzeptionelle Framework der Qiskit Patterns kann als die Anatomie eines Quantenalgorithmus betrachtet werden.
Die vier Schritte zum Schreiben eines Quantenprogramms mit Qiskit Patterns sind:
-
Das Problem in ein quantennatives Format überführen.
-
Die Schaltkreise und Operatoren optimieren.
-
Mit einer Qiskit-Primitive-Funktion ausführen.
-
Die Ergebnisse analysieren.
Schritt 1. Das Problem in ein quantennatives Format überführen
In einem Quantenprogramm sind Quantenschaltkreise das native Format zur Darstellung von Quantenanweisungen, und Operatoren repr äsentieren die zu messenden Observablen. Beim Erstellen eines Schaltkreises erstellst du normalerweise ein neues QuantumCircuit-Objekt und fügst ihm dann nacheinander Anweisungen hinzu.
Demonstration: Grundlegende Quantenschaltkreise in Qiskit bauen
Lass uns einige einfache Schaltkreise mit Qiskit bauen.
# Simple quantum circuit with two qubits and two classical bits
# Create quantum circuit with 2 qubits and 2 classical bits
qc = QuantumCircuit(2)
# Add gates to your circuit
qc.x(0)
qc.s(1)
# Draw the output using MatPlotLib
qc.draw(output='mpl')
# Quantum circuit with a Quantum Register named 'qr' that has two qubits, and a Classical Register named 'cr' with two classical bits
# Create a quantum register with 2 qubits, register label is 'qr'
qreg = QuantumRegister(2)
# Create a classical register with 2 qubits, register label is 'cr'
creg = ClassicalRegister(2)
# Create a quantum circuit with registers qreg and creg
qc = QuantumCircuit(qreg, creg)
# Add gates to your registers
qc.x(qreg[0])
# Draw the quantum circuit
qc.draw(output='mpl')
Übung: Grundlegende Quantenschaltkreise in Qiskit bauen
Erstelle einen Schaltkreis für den Bell-Zustand
# Create a new circuit with two qubits
qc = QuantumCircuit(2)
# Add a Hadamard gate to qubit 0
qc.h(0)
# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0,1)
# Return a drawing of the circuit using MatPlotLib ("mpl").
qc.draw('mpl')
Der Anfangszustand des Quantenschaltkreises ist der -Zustand.
Der Endzustand ist:
# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')
Hinweis zur Bit-Nummerierung in Qiskit
Qiskit nummeriert die Bits in einer Zeichenkette von rechts nach links. Das Qiskit SDK verwendet die LSb-0-Bit-Nummerierung. Wenn eine Liste von Bits (oder Qubits) als Zeichenkette angezeigt oder interpretiert wird, ist Bit das linkeste und Bit das rechteste. Das liegt daran, dass wir Zahlen normalerweise mit der bedeutendsten Stelle links schreiben, und in Qiskit wird Bit als das bedeutendste Bit interpretiert. Weitere Details findest du unter Bit-Reihenfolge im Qiskit SDK.
#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)
qc2.draw("mpl")
sv2 = Statevector(qc2)
sv2.draw(output='latex')
Brauchen wir Messungs-Gates?
Beim Erstellen von Quantenschaltkreisen musst du auch bedenken, welche Art von Daten nach der Ausführung zurückgegeben werden sollen. Qiskit bietet zwei Möglichkeiten, Daten zurückzugeben: Du kannst den Erwartungswert einer Observablen oder eine Wahrscheinlichkeitsverteilung für eine Menge von Qubits erhalten, die du messen möchtest. Bereite deine Arbeitslast so vor, dass dein Schaltkreis mit Qiskit Primitives auf eine dieser beiden Arten gemessen wird.
Sampler-Primitive – gibt eine Wahrscheinlichkeitsverteilung für eine Menge von Qubits zurück, die du messen möchtest. Bsp.:
Estimator-Primitive – gibt den Erwartungswert einer Observablen zurück. Bsp.:
Wir werden heute den Sampler verwenden, daher müssen wir Messungs-Gates zu unserem Schaltkreis hinzufügen.
# Use measure_all, which adds a barrier, applies measurement gates on all qubits, creates a classical register called `meas`
qc.measure_all()
qc.draw('mpl')
Schritt 2. Die Schaltkreise für die Zielhardware optimieren
Bei der Ausführung von Schaltkreisen auf einem Gerät ist es wichtig, die Menge der Anweisungen im Schaltkreis zu optimieren und die Gesamttiefe (grob gesagt die Anzahl der Anweisungen) des Schaltkreises zu minimieren. So erhältst du die bestmöglichen Ergebnisse, indem du die Auswirkungen von Fehlern und Rauschen reduzierst. Zudem müssen die Anweisungen des Schaltkreises der Instruction Set Architecture (ISA) eines Backend-Geräts entsprechen und die Basis-Gates und Qubit-Konnektivität des Geräts berücksichtigen.
Der folgende Code instanziiert einen Simulator, an den ein Job übermittelt werden soll, und transformiert den Schaltkreis und die Observablen so, dass sie zur ISA dieses Backends passen. Beachte, dass wir später ein echtes Gerät verwenden werden.
# option:
from qiskit_ibm_runtime.fake_provider import FakeTorino
backend = FakeTorino()
print(
f"Name: {backend.name}\n"
f"Version: {backend.version}\n"
f"Native gate set: {backend.operation_names}\n"
)
#to view other properties you can use properties()
# refer to https://docs.quantum.ibm.com/guides/get-qpu-information
Name: fake_torino
Version: 2
Native gate set: ['for_loop', 'delay', 'cz', 'id', 'sx', 'measure', 'reset', 'switch_case', 'if_else', 'rz', 'x']
# Convert to an ISA circuit
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
isa_circuit_sampler = pm.run(qc)
isa_circuit_sampler.draw("mpl", idle_wires=False)

Schritt 3. Mit den Qiskit-Primitives ausführen
Quantencomputer können zufällige Ergebnisse erzeugen, daher sammelst du normalerweise eine Stichprobe der Ausgaben, indem du den Schaltkreis viele Male ausführst. Du kannst den Erwartungswert der Observablen mithilfe der Klasse Estimator schätzen. Sampler kann verwendet werden, um Daten von einem Quantencomputer zu erhalten. Diese Objekte besitzen eine run()-Methode, die die Auswahl von Schaltkreisen, Observablen und Parametern (falls zutreffend) ausführt, unter Verwendung eines primitive unified bloc (PUB).
# Create a sampler instance using the selected backend
sampler = Sampler(backend)
# Run the sampler primitive on ISA circuit for specified number of shots (1024)
job_sampler = sampler.run([isa_circuit_sampler], shots=1024)
# Save the result of the job
result_sampler = job_sampler.result()
Schritt 4. Nachverarbeitung der Ergebnisse
In diesem Schritt verarbeitest du deine Ergebnisse nach. Du kannst diese Ergebnisse in einen weiteren Workflow zur weiteren Analyse einspeisen oder ein Diagramm der wichtigsten Werte und Daten erstellen. Im Allgemeinen ist dieser Schritt spezifisch für dein Problem.
- Für den
Samplerzeichnen wir die Wahrscheinlichkeitsverteilung auf, die durch Sampling des Quantenschaltkreises so oft wie die von dir angegebene Anzahl von Shots entsteht, unter Verwendung vonplot_histogram.
from qiskit.visualization import plot_histogram
counts = result_sampler[0].data.meas.get_counts()
# Note: meas is the default name of the classical register when using measure_all().
# If you specify a classical register, then use the name you assign
# Plot the result
plot_histogram(counts)

Auf einem echten Gerät ausführen
Wenn du diesen Code auf einem echten Gerät ausführen möchtest, kannst du den folgenden Code verwenden.
from qiskit_ibm_runtime import QiskitRuntimeService
# View the list of backends you have access to
service = QiskitRuntimeService()
service.backends()
management.get:WARNING:2025-11-03 14:24:36,838: Loading default saved account
[<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_brisbane')>,
<IBMBackend('ibm_torino')>,
<IBMBackend('ibm_marrakesh')>]
# Get backend
backend_real = service.least_busy(simulator=False, operational=True)
#backend_real = service.backend(name="insert_backend_name") # use this if you want to choose a specific backend
sampler = Sampler(backend_real)
pm = generate_preset_pass_manager(backend=backend_real, optimization_level=3)
isa_circuit = pm.run(qc)
job = sampler.run([isa_circuit], shots=1024)
print(job.job_id)
<bound method BasePrimitiveJob.job_id of <RuntimeJobV2('d444lcg7i53s73e4n6tg', 'sampler')>>
result = job.result()
print(
f"Name: {backend_real.name}\n"
f"Version: {backend_real.version}\n"
f"Native gate set: {backend_real.operation_names}\n"
)
Name: ibm_fez
Version: 2
Native gate set: ['delay', 'cz', 'id', 'sx', 'measure', 'reset', 'if_else', 'rz', 'x']
counts = result[0].data.meas.get_counts()
plot_histogram(counts)

Ergebnisse eines abgeschlossenen Jobs abrufen
Die folgende Zelle zeigt, wie du Ergebnisse eines abgeschlossenen Jobs abrufen kannst.
service = QiskitRuntimeService()
retrieved_job = service.job('d40mquhsg33c73dhhs00')
result = retrieved_job.result()
counts = result[0].data.meas.get_counts()
plot_histogram(counts)
management.get:WARNING:2025-11-03 14:24:55,135: Loading default saved account
