Квантовое программирование на Qiskit

От математики к коду: как описывают квантовую цепь на практике и где её запускают.

Qiskit — открытый Python-фреймворк IBM для описания, симуляции и запуска квантовых цепей на симуляторах и реальном квантовом железе.

Как выглядит цепь в коде

Идея проста: создаёшь регистр кубитов, добавляешь гейты, измеряешь, запускаешь. Ниже — классический «Hello, Quantum»: приготовить пару Белла и измерить. Этот код использует библиотеку Qiskit, которой нет в браузерном Python, поэтому он дан для чтения (без кнопки «Запустить»). Запускать его нужно локально или в облаке IBM Quantum.

from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator

# 2 кубита, 2 классических бита под результаты измерений
qc = QuantumCircuit(2, 2)
qc.h(0)            # Адамар на кубит 0 -> суперпозиция
qc.cx(0, 1)        # CNOT: запутываем кубит 1 с кубитом 0
qc.measure([0, 1], [0, 1])

sim = AerSimulator()
result = sim.run(qc, shots=1000).result()
print(result.get_counts())
# Ожидаемо около {'00': ~500, '11': ~500} - пара Белла

Текстовая «диаграмма» этой цепи, которую Qiskit умеет печатать:

  q0: --[ H ]--*------[M]--
               |
  q1: ---------X------[M]--
  c : ===============/2====
  [M] - измерение,  /2 - два классических бита

Симулятор или реальное железо

У Qiskit два режима. Симулятор (Aer) считает цепь на вашем обычном компьютере — точно, но до ~30 кубитов из-за экспоненциального роста. Реальное железо — через облако IBM Quantum: регистрируешься, получаешь токен, и цепь ставится в очередь на настоящий сверхпроводящий процессор. IBM даёт бесплатный доступ к небольшим машинам — любой студент может запустить пару Белла на физических кубитах и увидеть, как шум добавляет редкие «неправильные» исходы 01 и 10, которых в идеале быть не должно.

# Запуск на реальном железе (упрощённо, нужен бесплатный аккаунт IBM Quantum)
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2

service = QiskitRuntimeService(channel='ibm_quantum', token='ВАШ_ТОКЕН')
backend = service.least_busy(operational=True, simulator=False)
sampler = SamplerV2(backend)
job = sampler.run([qc], shots=1000)
print(job.result())   # на реальном железе появятся шумовые 01/10

Как работает под капотом

Перед запуском на железе Qiskit транспилирует цепь: переписывает её под конкретный процессор. Реальная машина умеет лишь ограниченный набор «родных» гейтов и связывает не любые пары кубитов (топология чипа), поэтому абстрактный CNOT между далёкими кубитами превращается в цепочку реальных операций и SWAP-ов. Чем длиннее транспилированная цепь, тем больше накопится шума — поэтому оптимизация транспиляции напрямую влияет на качество результата. Это инженерный мост между красивой математикой курса и физической реальностью.

Частые ошибки

  • Ждать на реальном железе идеального {'00','11'}. Шум обязательно добавит редкие 01/10.
  • Запускать на симуляторе цепь из 40+ кубитов — упрётесь в память.
  • Забыть про measure: без измерения вы не получите классических результатов.

Итог

  • Цепь в Qiskit — это регистр кубитов, добавленные гейты и измерения.
  • Запускать можно на симуляторе (точно, до ~30 кубитов) или на реальном железе IBM (бесплатно, с шумом).
  • Транспиляция переписывает цепь под топологию и родные гейты конкретной машины.
Проверьте себя
1. Что делает строка qc.cx(0, 1) в Qiskit?
AИзмеряет кубиты
BПрименяет CNOT с управляющим 0 и целью 1
CСбрасывает кубит
DДобавляет Адамар
2. Чем симулятор отличается от реального железа в Qiskit?
AНичем
BСимулятор точен, но ограничен ~30 кубитами; железо зашумлено, но настоящее
CСимулятор медленнее
DЖелезо точнее
3. Зачем нужна транспиляция цепи перед запуском на железе?
AДля красоты
BПереписать цепь под родные гейты и топологию конкретного процессора
CЧтобы ускорить Python
DДля измерения