Квантовое программирование на 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 (бесплатно, с шумом).
- Транспиляция переписывает цепь под топологию и родные гейты конкретной машины.