Przejdź do głównej treści

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:

  1. 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).
  2. Użyjemy platformy chmurowej do skonfigurowania środowiska programistycznego. Możesz skorzystać z QBraid lub Google Colab.
  3. Po ukończeniu tego notebooka zapoznamy się z protokołem teleportacji kwantowej.

Więcej linków – społeczność Qiskit i dodatkowe zasoby edukacyjne:

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 jupyter Sprawdź, 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.
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.

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:

  1. Utwórz konto IBM Cloud, jeśli jeszcze go nie masz.
  2. Zaloguj się lub utwórz konto IBM Quantum Platform za pomocą IBMid.
  3. 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.)
  4. W komórce kodu znajdującej się za obrazami referencyjnymi zastąp deleteThisAndPasteYourAPIKeyHere swoim kluczem API.
  5. 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.)
  6. 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ę.
  7. W komórce kodu znajdującej się za obrazami referencyjnymi zastąp deleteThisAndPasteYourCRNHere swoim 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:

  1. Odwzoruj problem w formacie natywnym dla obliczeń kwantowych.

  2. Zoptymalizuj Circuit i operatory.

  3. Wykonaj obliczenia przy użyciu funkcji prymitywnej Qiskit.

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

Ćwiczenie: Budowanie podstawowych Circuit kwantowych w Qiskit

Utwórz Circuit dla stanu Bella 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

Stan początkowy Circuit kwantowego to stan 00\ket{00}.

Stan końcowy to:

# 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

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 nn bitów (lub Qubitów) jako ciągu, bit n1n−1 jest bitem skrajnie lewym, a bit 00 jest bitem skrajnie prawym. Wynika to z faktu, że zazwyczaj zapisujemy liczby z najbardziej znaczącą cyfrą po lewej stronie, a w Qiskit bit n1n−1 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")

Quantum circuit diagram

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

10 |10\rangle

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.

  • Sampler primitive - zwraca rozkład prawdopodobieństwa dla zestawu Qubitów, które zdecydujesz się zmierzyć. Np.:
  • Estimator primitive - 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')

Quantum circuit diagram

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)

Diagram układu kwantowego

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 Sampler rysujemy rozkład prawdopodobieństwa uzyskany przez próbkowanie układu kwantowego tyle razy, ile wynosi określona liczba strzałów, używając 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)

Wyjście kodu

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)

Wyjście kodu

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

Wyjście kodu