Твій перший квантовий експеримент
Вступ
У наступному відео Олівія Лейнс проведе тебе крізь матеріал цього уроку. Або ж ти можеш відкрити відео на YouTube для цього уроку в окремому вікні.
До цього моменту ти вже запустив свою першу квантову схему і вивчив основи квантових обчислень: як представляються квантові стани, як вентилі діють на ці стани, і як квантові явища — суперпозиція та заплутаність — беруть участь у цьому. Тепер час застосувати все це на практиці та вирішити першу задачу на квантовому комп'ютері.
Більш широкий ландшафт задач, придатних для квантових обчислень, ми дослідимо в наступному уроці. Зараз ми зосередимось на задачі з галузі симуляції природи: використання квантового комп'ютера як більш чистого та керованого замінника природної квантової системи. Насправді, це і було першим застосуванням, яке Річард Фейнман передбачив для квантових комп'ютерів у 1980-х роках. Як він влучно висловився: "Природа не є класичною, дідько його візьми, і якщо ти хочеш створити симуляцію природи, то краще зроби її квантово-механічною..."
У цьому уроці ми дотримаємось цього принципу, щоб змоделювати взаємодію між двома спінами, які можна уявити як крихітні магніти. Залежно від знаку їхньої взаємодії, вони можуть прагнути вирівнятися й вказувати в одному напрямку, або антивирівнятися й вказувати у протилежних напрямках. Ми зосередимось на останньому випадку, оскільки він часто призводить до більш цікавої — і більш складної — поведінки. Після того як ми зрозуміємо цю невелику двокубітну систему, ми покажемо, як ті самі ідеї масштабуються, дозволяючи квантовим комп'ютерам скористатися своїм експоненційним масштабуванням при симуляції великих спінових систем.
Два взаємодіючі магніти
Для цієї задачі ми використаємо два кубіти — по одному для кожного спіну в нашій моделі. Кожен спін може вказувати вгору (стан кубіта ), вниз (стан кубіта ) або перебувати в суперпозиції двох станів.
Якщо спіни мають антиферромагнітну взаємодію, це означає, що вони прагнуть антивирівнятися: коли один вказує вгору, інший прагне вказувати вниз, і навпаки.
Тепер припустимо, що в нашій системі також є магнітне поле, щ о вказує зліва направо. Оскільки це поле вказує впоперек до звичайного напрямку спінів вгору-вниз, воно називається поперечним полем. Це поле може перевертати спіни, що призводить до того, що конфігурація з найнижчою енергією є певною суперпозицією розміщень спінів вгору і вниз, а не якимось одним визначеним шаблоном спінів.
Усі ці ефекти можна описати за допомогою математичного об'єкта, який називається гамільтоніаном. Гамільтоніан повідомляє нам енергію системи для заданого розміщення спінів:
де — коефіцієнт, що контролює силу взаємодії між спінами, а — коефіцієнт сили зовнішнього магнітного поля. заохочує або штрафує спіни залежно від того, чи вони вирівняні або антивирівняні, а і представляють ефект перевертання спінів магнітним полем.
У фізиці системи прагнуть перейти до стану з найнижчою можливою енергією, який називається основним станом. Знаходження цього стану з найнижчою енергією є поширеною задачею, але вона вимагає методів оптимізації, що виходять за межі цього уроку.
Натомість ми поставимо простіше запитання: якщо ми підготуємо спіни в певному стані, яка енергія цього стану?
Щоб відповісти на це, ми:
- Підготуємо спіни в стані за нашим вибором
- Виміряємо енергію цього стану за допомогою наведеного вище гамільтоніана
Це саме той тип обчислення, який з'являється всередині більших квантових алгоритмів, таких як варіаційні алгоритми, які ти можеш досліджувати в наступних курсах.
Реалізація в Qiskit
Перш ніж перейти до написання коду, нам потрібно трохи підготуватись. Коли ми запускаємо квантову схему, ми завжди завершуємо вимірюванням кубітів. Але є два різних види запитань, які ми можемо поставити про результат цього вимірювання: іноді ми просто хочемо знати, в якому стані знаходиться кубіт. В інших випадках ми хочемо знати, задано квантовий стан, яке значення фізичної величини, наприклад енергії?
У Qiskit ці два типи запитань обробляються двома різними інструментами, які називаються примітивами.
Sampler відповідає на перший тип запитання. Він запускає схему багато разів і повідомляє нам, як часто ми вимірюємо кожен можливий результат, наприклад 00, 01, 10 або 11. Результат — це гістограма, що показує ймовірність кожного результату вимірювання.
Estimator відповідає на другий тип запитання. Замість гістограми він об'єднує багато вимірювань за лаштунками, щоб обчислити одне число, наприклад енергію стану відповідно до гамільтоніана, який ми надаємо.
Щоб допомогти тобі зрозуміти, коли і чому ми використовували б кожен із цих інструментів, ми пройдемось через два повних робочих процеси (які називаються "шаблонами Qiskit"), застосованих до тієї самої двокубітної системи.
Робочий процес шаблонів Qiskit
Робочий процес шаблонів Qiskit — це загальна методологія, яку ми використовуємо для вирішення квантових задач за допомогою Qiskit. Він розбиває квантову обчислювальну задачу на чотири кроки:
- Відобрази задачу на модель, яку можна представити квантовими схемами
- Оптимізуй схему для запуску на конкретному бекенді
- Виконай оптимізовану схему на вибраному бекенді
- Виконай постобробку необроблених даних вимірювань
Експеримент 1: використай Sampler для вимірювання стану
Відображення
Загалом, крок відображення — це місце, де ми з'ясовуємо, як представити реальну задачу в термінах кубітів, операторів і вимірювань. У багатьох застосуваннях це найскладніша та найбільш трудомістка частина робочого процесу — навіть прості запитання, наприклад "що представляє кожен кубіт?", не завжди мають однозначних відповідей.
Однак у цьому експерименті відображення навмисно просте. Кожен фізичний ступінь свободи відображається безпосередньо на один кубіт. Завдяки цій відповідності один-до-одного крок відображення зводиться до вибору квантового стану, який ми хочемо підготувати, та написання схеми, яка підготовлює і вимірює цей стан.
Тут ми підготуємо заплутаний стан Белла, подібний до того, який ми зробили в самому першому уроці цього курсу:
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
# Import Qiskit primitives
from qiskit import QuantumCircuit
# Make state
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.x(1)
qc.z(0)
# Measure state
qc.measure_all()
# Draw circuit
qc.draw("mpl")
Оптимізація
Перш ніж запустити нашу схему на квантовому комп'ютері (або на симуляторі, якщо ти вичерпав свій безкоштовний час на справжніх квантових комп'ютерах за місяць), нам потрібно підготувати її до виконання. Цей крок називається оптимізацією. (Зауважимо: таке вживання слова "оптимізація" може бути заплутаним. У квантових обчисленнях задачі оптимізації стосуються певного класу задач. Тут ми використовуємо слово "оптимізація" для опису обов'язкового підготовчого кроку, який проходить кожна квантова схема перед тим, як вона може бути ефективно запущена на апаратному забезпеченні.)
Під час оптимізації:
- Ми обираємо бекенд — або справжній квантовий комп'ютер, або симулятор.
- Ми призначаємо кубіти нашої схеми фізичним кубітам на пристрої.
- Ми переписуємо схему, використовуючи лише ті вентилі, які квантовий комп'ютер може фактично виконати.
- За бажанням впроваджує мо техніки пом'якшення та придушення помилок, щоб зменшити вплив шуму.
У Qiskit це обробляється автоматично транспілятором. Після вибору бекенду транспілятор виконує всю роботу, щоб підготувати твою схему до виконання, тому тобі не потрібно вручну налаштовувати вентилі або призначення кубітів. Транспілятор також пропонує різні рівні оптимізації, які можуть допомогти зменшити помилки за необхідності. Оптимізація виконується поетапно, які називаються "проходами". Тому ця оптимізація буде оброблятись за допомогою pass_manager у наведеному нижче коді. Щоб дізнатись більше про помилки та пом'якшення помилок, дивись курс Олівії Лейнс Quantum Computing in Practice.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
## Load the Qiskit Runtime service
# QiskitRuntimeService.save_account(
# channel="ibm_quantum_platform",
# token="YOUR_TOKEN_HERE",
# overwrite=True,
# set_as_default=True,
# )
# service = QiskitRuntimeService(channel="ibm_quantum_platform")
# Or load saved credentials
service = QiskitRuntimeService()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_fez
# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
qc_isa.draw("mpl")
Виконання
Тепер ми готові до виконання! Ми завантажимо Sampler, а потім надішлемо завдання до бекенду.
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
Або якщо ти використовуєш симулятор, можеш розкоментувати та запустити цю клітинку замість цього:
## Load the backend sampler
# from qiskit.primitives import BackendSamplerV2
## Load the Aer simulator and generate a noise model based on the currently-selected backend.
# from qiskit_aer import AerSimulator
# from qiskit_aer.noise import NoiseModel
# noise_model = NoiseModel.from_backend(backend)
## Define a simulator using Aer, and use it in Sampler.
# backend_sim = AerSimulator(noise_model=noise_model)
# sampler_sim = BackendSamplerV2(backend=backend_sim)
## Alternatively, load a fake backend with generic properties and define a simulator.
## backend_gen = GenericBackendV2(num_qubits=18)
## sampler_gen = BackendSamplerV2(backend=backend_gen)
job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()
Постобробка
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)
counts = {'10': 49, '01': 50, '11': 1}
Ми бачимо, що більшість лічильників припадає або на 01, або на 10, тобто коли один кубіт вимірювався як 0, інший був 1, і навпаки. Це відповідає стану Белла , який ми підготували.
Експеримент 2: використай Estimator для вимірювання енергії
Тепер, коли ми побачили, як вибирати квантовий стан, давай використаємо Estimator для обчислення енергії нашого стану Белла