Zum Hauptinhalt springen

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:

  1. Bitte erstelle ein IBM Cloud-Konto, um auf die IBM Quantum Platform zuzugreifen.
  2. Wir verwenden eine cloudbasierte Plattform, um eine Programmierumgebung einzurichten. Du kannst entweder QBraid oder Google Colab nutzen.
  3. Nach diesem Notebook werden wir uns das Quantenteleportations-Protokoll ansehen.

Weitere Links – Qiskit-Community und weiterführende Lernressourcen:

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.
ERROR: You must give at least one requirement to install (see "pip help install")
Note: 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:

  1. Richte ein IBM Cloud-Konto ein, falls du noch keines hast.
  2. Melde dich bei einem IBM Quantum Platform-Konto mit einer IBMid an oder erstelle eines.
  3. Rufe dein IBM Quantum Platform-Dashboard auf, erstelle deinen API-Token und kopiere ihn an einen sicheren Ort. (Siehe erstes Referenzbild unten.)
  4. Ersetze im folgenden Code-Block deleteThisAndPasteYourAPIKeyHere durch deinen API-Schlüssel.
  5. 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.)
  6. 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.
  7. Ersetze im folgenden Code-Block deleteThisAndPasteYourCRNHere durch 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:

  1. Das Problem in ein quantennatives Format überführen.

  2. Die Schaltkreise und Operatoren optimieren.

  3. Mit einer Qiskit-Primitive-Funktion ausführen.

  4. 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 diagram

# 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')

Quantum circuit diagram

Übung: Grundlegende Quantenschaltkreise in Qiskit bauen

Erstelle einen Schaltkreis für den Bell-Zustand 00+112\frac{|00\rangle + |11\rangle}{\sqrt{2}}

# 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')

Quantum circuit diagram

Der Anfangszustand des Quantenschaltkreises ist der 00\ket{00}-Zustand.

Der Endzustand ist:

# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')

2200+2211\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle

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 nn Bits (oder Qubits) als Zeichenkette angezeigt oder interpretiert wird, ist Bit n1n-1 das linkeste und Bit 00 das rechteste. Das liegt daran, dass wir Zahlen normalerweise mit der bedeutendsten Stelle links schreiben, und in Qiskit wird Bit n1n-1 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")

Quantum circuit diagram

sv2 = Statevector(qc2)
sv2.draw(output='latex')

10 |10\rangle

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')

Quantum circuit diagram

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)

Quantum circuit diagram

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 Sampler zeichnen wir die Wahrscheinlichkeitsverteilung auf, die durch Sampling des Quantenschaltkreises so oft wie die von dir angegebene Anzahl von Shots entsteht, unter Verwendung von plot_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)

Code output

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)

Code output

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

Code output