Перейти до основного вмісту

Практична робота з Qiskit: Hello World - Qiskit Patterns

У цьому зошиті ти пройдеш через робочий процес Qiskit Patterns і скористаєшся примітивом Sampler від Qiskit.

Цей посібник частково базується на матеріалах IBM Quantum Documentation: Hello World.

Корисні посилання:

  1. Будь ласка, створи обліковий запис IBM Cloud, щоб отримати доступ до IBM Quantum Platform.
    • Для тих, хто має університетську електронну адресу: отримай код функції тут, щоб продовжити безкоштовний пробний період.
    • Для тих, хто не має університетської електронної адреси: інструкції з активації облікового запису. Повністю активуй свій обліковий запис, зареєструвавши кредитну картку. Твоя кредитна картка не буде списана в цьому процесі й не буде списуватися випадковим чином після реєстрації. Ця активація дозволяє тобі продовжувати безкоштовно користуватися ресурсами IBM Cloud і платформою IBM Quantum після завершення пробного періоду (30 днів).
  2. Ми будемо використовувати хмарну платформу для налаштування середовища розробки. Ти можеш скористатися QBraid або Google Colab.
  3. Після цього зошита ми розглянемо протокол квантової телепортації.

Додаткові посилання — спільнота Qiskit та ресурси для подальшого навчання:

Встановлення Qiskit

Ти можеш скористатися онлайн-середовищем jupyter lab (дивись посібник Онлайн-лабораторні середовища) або встановити Qiskit локально.

Дотримуйся посібника з встановлення Qiskit Встановлення Qiskit SDK та клієнта Qiskit Runtime, щоб виконати наступні кроки:

  • Встанови Qiskit разом із додатковими пакетами для візуалізації: pip install qiskit[visualization]

  • Встанови qiskit-ibm-runtime: pip install qiskit-ibm-runtime

  • Встанови jupyter: pip install jupyter Перевір, що версія Python, яку ти використовуєш у своєму середовищі, — python>=3.10, щоб переконатися, що вона сумісна з останньою версією Qiskit:

# Added by doQumentation — required packages for this notebook
!pip install -q IPython
from platform import python_version

print(python_version())
3.13.7

Якщо тобі потрібно оновити Python і ти не впевнений(-а), як це зробити, звернись до цього посібника з оновлення Python залежно від твоєї ОС: Як оновити 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.

Виконай необхідні імпорти

Зробімо необхідні імпорти для цього посібника.

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

Налаштування облікового запису IBM Quantum Platform

Щоб виконувати квантові схеми на реальному залізі, тобі знадобиться обліковий запис IBM Cloud.

Дотримуйся інструкцій у цьому посібнику Налаштування облікового запису IBM Cloud, щоб виконати наступні кроки:

  1. Створи обліковий запис IBM Cloud, якщо у тебе його ще немає.
  2. Увійди або створи обліковий запис IBM Quantum Platform за допомогою IBMid.
  3. Відкрий панель IBM Quantum Platform, створи свій API-токен і збережи його у надійному місці. (Дивись перше довідкове зображення нижче.)
  4. У комірці коду після довідкових зображень замінь deleteThisAndPasteYourAPIKeyHere на свій API-ключ.
  5. Перейди на сторінку Instances у головному меню ☰ та створи свій екземпляр. Якщо ти не є частиною мережевої установи, обери відкритий план. (Дивись друге довідкове зображення нижче.)
  6. Після створення екземпляра скопіюй пов'язаний із ним CRN-код. (CRN розшифровується як Cloud Resource Names) Можливо, тобі доведеться оновити сторінку, щоб побачити екземпляр.
  7. У комірці коду після довідкових зображень замінь deleteThisAndPasteYourCRNHere на свій CRN-код.

Примітка: Стався до свого API-ключа як до захищеного пароля. Зверни до посібника Налаштування облікового запису IBM Cloud для отримання додаткової інформації про використання API-ключа в безпечних і ненадійних середовищах.

#@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,
)

Створення та запуск простого квантового алгоритму за допомогою фреймворку Qiskit pattern

Концептуальний фреймворк Qiskit pattern можна вважати анатомією квантового алгоритму.

Чотири кроки для написання квантової програми за допомогою Qiskit patterns:

  1. Відобрази задачу у квантово-рідний формат.

  2. Оптимізуй схеми та оператори.

  3. Виконай за допомогою примітивної функції Qiskit.

  4. Проаналізуй результати.

Крок 1. Відображення задачі у квантово-рідний формат

У квантовій програмі квантові схеми (Circuit) є рідним форматом для представлення квантових інструкцій, а оператори — спостережуваними, які потрібно виміряти. Під час створення Circuit ти зазвичай створюєш новий об'єкт QuantumCircuit, а потім послідовно додаєш до нього інструкції.

Демонстрація: Побудова базових квантових схем у Qiskit

Спробуємо побудувати кілька простих Circuit за допомогою 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

Вправа: Побудова базових квантових схем у Qiskit

Створи схему для стану Белла 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

Початковий стан квантової схеми — це стан 00\ket{00}.

Кінцевий стан:

# 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

Примітка щодо нумерації бітів у Qiskit

Qiskit нумерує біти в рядку справа наліво. Qiskit SDK використовує нумерацію бітів LSb 0. Під час відображення або інтерпретації списку з nn бітів (або Qubit) як рядка, біт n1n−1 є крайнім лівим бітом, а біт 00 — крайнім правим. Це пов'язано з тим, що ми зазвичай записуємо числа з найбільш значущою цифрою зліва, і в Qiskit біт n1n−1 інтерпретується як найбільш значущий біт. Докладніше дивись у темі Bit-ordering in the 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

Чи потрібні нам вентилі вимірювання?

Під час створення квантових схем потрібно також враховувати, який тип даних ти хочеш отримати після виконання. Qiskit надає два способи повернення даних: ти можеш отримати очікуване значення спостережуваного або розподіл імовірностей для набору Qubit, які ти обираєш для вимірювання. Підготуй своє завдання для вимірювання схеми одним із двох способів за допомогою примітивів Qiskit.

  • Примітив Sampler — повертає розподіл імовірностей для набору Qubit, які ти обираєш для вимірювання. Напр.:
  • Примітив Estimator — повертає очікуване значення спостережуваного. Напр.:

Сьогодні ми використовуватимемо Sampler, тому нам потрібно додати вентилі вимірювання до нашої схеми.

# 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

Крок 2. Оптимізація схем для цільового апаратного забезпечення

Під час виконання Circuit на пристрої важливо оптимізувати набір інструкцій, що містить схема, і мінімізувати загальну глибину (приблизно кількість інструкцій) схеми. Це забезпечує отримання найкращих можливих результатів шляхом зменшення впливу помилок і шуму. Крім того, інструкції схеми повинні відповідати Instruction Set Architecture (ISA) пристрою-Backend та враховувати базові Gate і з'єднання Qubit пристрою.

Наступний код створює симулятор для подачі завдань і перетворює схему та спостережувані відповідно до ISA цього Backend. Зверни увагу, що пізніше ми використаємо реальний пристрій.

# 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

Крок 3. Виконання за допомогою примітивів Qiskit

Квантові комп'ютери можуть давати випадкові результати, тому зазвичай збирають вибірку виходів, запускаючи схему багато разів. Ти можеш оцінити значення спостережуваного за допомогою класу Estimator. Sampler можна використовувати для отримання даних від квантового комп'ютера. Ці об'єкти мають метод run(), який виконує вибір Circuit, спостережуваних та параметрів (якщо застосовно), використовуючи 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()

Крок 4. Постобробка результатів

Цей крок передбачає постобробку твоїх результатів. Ти можеш передати ці результати в інший робочий процес для подальшого аналізу або підготувати графік ключових значень і даних. Загалом цей крок є специфічним для твоєї задачі.

  • Для Sampler ми будуємо розподіл імовірностей, отриманий шляхом вибірки квантової схеми стільки разів, скільки вказано в параметрі shots, використовуючи 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

Запуск програми на реальному пристрої

Якщо ти хочеш запустити цей код на реальному пристрої, можеш скористатися наступним кодом.

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

Отримання результатів завершеного завдання

Комірка нижче демонструє, як можна отримати результати завершеного завдання.

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