Praktyczne ćwiczenia z Qiskit: Hello World – Qiskit Patterns
W tym notebooku przejdziesz przez przepływ pracy Qiskit Patterns i skorzystasz z prymitywu Sampler platformy Qiskit.
Ten samouczek częściowo opiera się na treściach z IBM Quantum Documentation: Hello World.
Przydatne linki:
- Utwórz konto IBM Cloud, aby uzyskać dostęp do IBM Quantum Platform.
- Dla osób z uczelnianym adresem e-mail: uzyskaj kod funkcji, który przedłuży bezpłatny okres próbny.
- Dla osób bez uczelnianego adresu e-mail: instrukcje aktywacji konta. Aktywuj konto w pełni, rejestrując kartę kredytową. Twoja karta kredytowa nie zostanie obciążona podczas tego procesu ani losowo po rejestracji. Aktywacja umożliwi ci dalszy dostęp do bezpłatnych zasobów w IBM Cloud i IBM Quantum Platform po zakończeniu okresu próbnego (30 dni).
- Użyjemy platformy chmurowej do skonfigurowania środowiska programistycznego. Możesz skorzystać z QBraid lub Google Colab.
- Po ukończeniu tego notebooka zapoznamy się z protokołem teleportacji kwantowej.
Więcej linków – społeczność Qiskit i dodatkowe zasoby edukacyjne:
- Grok sphere
- IBM Quantum Composer
- IBM Quantum Learning
- Wykłady Qiskit Global Summer School 2025
- Certyfikacja Qiskit v2.X
- Program ambasadorów Qiskit
- Letnie staże w dziedzinie obliczeń kwantowych
- Qiskit YouTube
Instalacja Qiskit
Możesz skorzystać z internetowego środowiska jupyter lab (zob. przewodnik Online lab environments) lub zainstalować Qiskit lokalnie.
Postępuj zgodnie z przewodnikiem instalacji Qiskit Install the Qiskit SDK and the Qiskit Runtime client, wykonując następujące kroki:
-
Zainstaluj Qiskit wraz z dodatkowymi pakietami wizualizacji:
pip install qiskit[visualization] -
Zainstaluj qiskit-ibm-runtime:
pip install qiskit-ibm-runtime -
Zainstaluj jupyter:
pip install jupyterSprawdź, czy wersja Pythona używana w twoim środowisku to python>=3.10, aby upewnić się, że jest kompatybilna z najnowszą wersją Qiskit:
# Added by doQumentation — required packages for this notebook
!pip install -q IPython
from platform import python_version
print(python_version())
3.13.7
Jeśli musisz zaktualizować Pythona i nie wiesz jak to zrobić, zapoznaj się z tym przewodnikiem dotyczącym aktualizacji Pythona w zależności od systemu operacyjnego: 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.
Wykonaj niezbędne importy
Wykonajmy niezbędne importy do tego samouczka.
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
Konfiguracja konta IBM Quantum Platform
Aby uruchamiać obwody kwantowe na prawdziwym sprzęcie, potrzebujesz konta IBM Cloud.
Postępuj zgodnie z instrukcjami zawartymi w tym przewodniku Set up your IBM Cloud account, wykonując następujące kroki:
- Utwórz konto IBM Cloud, jeśli jeszcze go nie masz.
- Zaloguj się lub utwórz konto IBM Quantum Platform za pomocą IBMid.
- Wejdź na pulpit nawigacyjny IBM Quantum Platform, utwórz swój token API i skopiuj go w bezpieczne miejsce. (Patrz pierwszy obraz referencyjny poniżej.)
- W komórce kodu znajdującej się za obrazami referencyjnymi zastąp
deleteThisAndPasteYourAPIKeyHereswoim kluczem API. - Wejdź na stronę Instances z menu głównego ☰ i utwórz swoją instancję. Jeśli nie należysz do żadnej instytucji sieciowej, wybierz plan otwarty. (Patrz drugi obraz referencyjny poniżej.)
- Po utworzeniu instancji skopiuj przypisany do niej kod CRN. (CRN to skrót od Cloud Resource Names) Może być konieczne odświeżenie strony, aby zobaczyć instancję.
- W komórce kodu znajdującej się za obrazami referencyjnymi zastąp
deleteThisAndPasteYourCRNHereswoim kodem CRN.
Uwaga: Traktuj swój klucz API jak bezpieczne hasło. Więcej informacji na temat korzystania z klucza API w środowiskach bezpiecznych i niezaufanych znajdziesz w przewodniku Set up your IBM Cloud account.
#@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,
)
Tworzenie i uruchamianie prostego algorytmu kwantowego z użyciem frameworka wzorców Qiskit
Koncepcyjny framework wzorców Qiskit można traktować jak anatomię algorytmu kwantowego.
Cztery kroki tworzenia programu kwantowego z użyciem wzorców Qiskit to:
-
Odwzoruj problem w formacie natywnym dla obliczeń kwantowych.
-
Zoptymalizuj Circuit i operatory.
-
Wykonaj obliczenia przy użyciu funkcji prymitywnej Qiskit.
-
Przeanalizuj wyniki.
Krok 1. Odwzorowanie problemu w formacie natywnym dla obliczeń kwantowych
W programie kwantowym Circuit kwantowe stanowią natywny format reprezentowania instrukcji kwantowych, a operatory opisują obserwable do zmierzenia. Tworząc Circuit, zazwyczaj tworzysz nowy obiekt QuantumCircuit, a następnie dodajesz do niego kolejne instrukcje.
Demonstracja: Budowanie podstawowych Circuit kwantowych w Qiskit
Spróbujmy zbudować kilka prostych Circuit w Qiskit.
# 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')
Ćwiczenie: Budowanie podstawowych Circuit kwantowych w Qiskit
Utwórz Circuit dla stanu Bella
# 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')
Stan początkowy Circuit kwantowego to stan .
Stan końcowy to:
# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')
Uwaga na temat numerowania bitów w Qiskit
Qiskit numeruje bity w ciągu od prawej do lewej. Qiskit SDK używa numerowania bitów LSb 0. Podczas wyświetlania lub interpretowania listy bitów (lub Qubitów) jako ciągu, bit jest bitem skrajnie lewym, a bit jest bitem skrajnie prawym. Wynika to z faktu, że zazwyczaj zapisujemy liczby z najbardziej znaczącą cyfrą po lewej stronie, a w Qiskit bit jest interpretowany jako bit najbardziej znaczący. Więcej szczegółów znajdziesz w temacie Kolejność bitów w Qiskit SDK.
#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)
qc2.draw("mpl")
sv2 = Statevector(qc2)
sv2.draw(output='latex')
Czy potrzebujemy Gate pomiarowych?
Tworząc Circuit kwantowe, musisz również uwzględnić, jaki rodzaj danych chcesz otrzymać po wykonaniu obliczeń. Qiskit oferuje dwa sposoby zwracania danych: możesz uzyskać wartość oczekiwaną obserwabla lub rozkład prawdopodobieństwa dla wybranego zestawu Qubitów. Przygotuj swoje zadanie do mierzenia Circuit w jeden z tych dwóch sposobów za pomocą prymitywów Qiskit.
Samplerprimitive - zwraca rozkład prawdopodobieństwa dla zestawu Qubitów, które zdecydujesz się zmierzyć. Np.:
Estimatorprimitive - zwraca wartość oczekiwaną obserwabla. Np.:
Dzisiaj będziemy używać Sampler, więc musimy dodać Gate pomiarowe do naszego Circuit.
# 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')
Krok 2. Optymalizacja układów dla docelowego sprzętu
Podczas wykonywania układów na urządzeniu ważne jest, aby zoptymalizować zestaw instrukcji zawartych w układzie i zminimalizować jego całkowitą głębokość (w przybliżeniu liczbę instrukcji). Zapewnia to jak najlepsze wyniki poprzez zmniejszenie wpływu błędów i szumów. Ponadto instrukcje układu muszą być zgodne z architekturą zestawu instrukcji (ISA) urządzenia Backend i uwzględniać jego bramki bazowe oraz łączność kubitów.
Poniższy kod tworzy instancję symulatora, do którego zostanie przesłane zadanie, oraz przekształca układ i obserwable tak, aby odpowiadały ISA tego Backendu. Zauważ, że prawdziwe urządzenie użyjemy później.
# 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)

Krok 3. Wykonanie z użyciem prymitywów Qiskit
Komputery kwantowe mogą dawać losowe wyniki, dlatego zazwyczaj zbierasz próbę wyjść, uruchamiając układ wiele razy. Możesz oszacować wartość obserwabla, korzystając z klasy Estimator. Sampler może być użyty do pobierania danych z komputera kwantowego. Obiekty te posiadają metodę run(), która wykonuje wybrany zestaw układów, obserwabli i parametrów (jeśli dotyczy), korzystając z 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()
Krok 4. Przetwarzanie końcowe wyników
Ten krok obejmuje przetwarzanie końcowe twoich wyników. Możesz przekazać te wyniki do innego przepływu pracy w celu dalszej analizy lub przygotować wykres kluczowych wartości i danych. Ogólnie rzecz biorąc, ten krok jest specyficzny dla twojego problemu.
- Dla
Samplerrysujemy rozkład prawdopodobieństwa uzyskany przez próbkowanie układu kwantowego tyle razy, ile wynosi określona liczba strzałów, używającplot_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)

Uruchamianie programu na prawdziwym urządzeniu
Jeśli chcesz uruchomić ten kod na prawdziwym urządzeniu, możesz użyć poniższego kodu.
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)

Pobieranie wyników z ukończonego zadania
Poniższa komórka pokazuje, jak możesz pobrać wyniki z ukończonego zadania.
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
