Квантовий комп'ютерний симулятор
Запишіть невелику квантову схему в JavaScript, симулюйте її безпосередньо в браузері та перегляньте схему, ймовірності й вектор стану. Або опишіть обчислення високого рівня, наприклад додавання, і подивіться, як воно перетворюється на справжню оборотну квантову схему.
Шумова модель
Реальні квантові комп’ютери не обчислюють ідеально: кубіти надзвичайно чутливі й утрачають частину інформації через декогерентність під час небажаної взаємодії з довкіллям — теплом, електромагнітними полями чи сусідніми кубітами. Операції вентилів теж не бувають абсолютно точними, а помилка можлива навіть під час остаточного зчитування. За замовчуванням цей симулятор обчислює ідеальну схему; тут можна ввімкнути типові моделі помилок і безпосередньо спостерігати їхній вплив на результати.
Опишіть обчислення за допомогою quantum.add, quantum.subtract, quantum.multiply, quantum.divide або quantum.random. Ctrl+Enter запускає симуляцію. Повна довідка доступна за кнопкою «Документація».
Цей код автоматично згенеровано з програми вище й одразу симульовано. Ви можете відредагувати його вручну та запустити знову.
Згенеровану схему відредаговано вручну, тому групування регістрів на діаграмі приховано. Повторний запуск програми вище перезапише ці зміни.
Максимум 4000 символів. Доступні методи QuantumCircuit: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (псевдонім toffoli), swap, measureAll і run. Ctrl+Enter запускає симуляцію.
Діаграма схеми
Покроковий режим показує ймовірності та вектор стану безпосередньо після вибраного вентиля. Результати запусків нижче завжди стосуються повної схеми.
OpenQASM 2.0
OpenQASM 2.0 — поширений формат обміну квантовими схемами, який, зокрема, підтримує Qiskit. Зверніть увагу на порядок бітів: цей симулятор читає q0 як старший лівий біт, тоді як Qiskit читає q[0] як молодший. Тому виміряні бітові рядки в Qiskit виглядають дзеркально.
Імовірності
Імовірність виміряти кожен можливий бітовий рядок, точно обчислена з вектора стану. Напрямок читання: q0 — лівий старший біт.
Сфери Блоха
Стан кожного кубіта показано стрілкою на сфері Блоха: північний полюс = |0⟩, південний = |1⟩, екватор = рівноймовірна суперпозиція. Якщо стрілка помітно коротша за радіус сфери, кубіт не має власного чистого стану — він заплутаний з іншими кубітами. Стрілка також може скорочуватися через шум і втрату когерентності. Для шумної моделі сфера є наближенням: вектор Блоха усереднюється за траєкторіями шуму. У покроковому режимі вище стрілки рухаються під дією вентилів лише для безшумної схеми.
Результати запусків
Показує, скільки разів кожен бітовий рядок фактично з’явився в симульованих вимірюваннях. Якщо можливих результатів кілька, кількості випадково відхиляються від точних імовірностей.
Вектор стану
Комплексні амплітуди, що лежать в основі ймовірностей: квадрат модуля амплітуди (дійсна² + уявна²) дорівнює ймовірності відповідного стану.
| СТАН | Реальна частина | Уявна частина |
|---|
Основи: як це працює?
Від програми до фізичного кубіта
Справжній квантовий комп’ютер — це більше, ніж чіп. Класична керувальна електроніка перетворює схему на точні імпульси. У прикладі охолодження, підготовка, керування й лазери зчитування формують сигнали на оптичному столі та спрямовують їх до екранованої вакуумної камери. Там вони змінюють і вимірюють стан кубіта, після чого результат повертається до класичного комп’ютера.
Кубіт і базисні стани
Класичний біт дорівнює або 0, або 1. Кубіт, крім того, може перебувати в суперпозиції двох базисних станів |0⟩ і |1⟩. Для кількох кубітів базисні стани записуються як бітові рядки, наприклад |10⟩ для двох кубітів, причому q0 у цьому симуляторі завжди є старшим лівим бітом.
Суперпозиція
Кубіт у суперпозиції одночасно містить компоненти кількох базисних станів. Їх описують комплексні амплітуди, а квадрат модуля кожної амплітуди дорівнює ймовірності отримати відповідний стан під час вимірювання.
Сфера Блоха
Стан одного кубіта можна зобразити стрілкою у сфері: північний полюс відповідає |0⟩, південний полюс — |1⟩, а всі точки на екваторі є рівноймовірними суперпозиціями — фаза визначає напрямок стрілки вздовж екватора rx, ry, і rz обертають стрілку навколо відповідної осі, а фазові вентилі S і T — навколо осі Z. Для заплутаного кубіта стрілка скорочується до центра сфери: окремий кубіт уже не має власного чистого стану, тож заплутаність стає буквально видимою.
Вимірювання й запуски
measureAll() вимірює всі кубіти одночасно й завершує схему. Оскільки одне вимірювання дає лише один випадковий результат, схему умовно вимірюють задану кількість разів — «запусків» — за допомогою run({ shots }). Так розподіл результатів утворює гістограму. Точні ймовірності додатково обчислюються безпосередньо з вектора стану й не залежать від випадковості окремих запусків.
Вентиль Адамара
Вентилі Адамара h(q) переводить кубіт із визначеного стану (|0⟩ або |1⟩) у рівноймовірну суперпозицію |0⟩ і |1⟩ — тобто приблизно 50% / 50% під час вимірювання.
Фазові вентилі: S і T
Вентилі s(q) і t(q) не змінюють імовірності вимірювання окремого кубіта; вони змінюють лише фазу |1⟩ амплітуди — S на 90°, T на 45°. Їхній ефект проявляється разом із суперпозицією: між двома вентилями Адамара фаза визначає, як амплітуди підсилюють або гасять одна одну (інтерференція). Спряжені варіанти sdg(q) і tdg(q) діють у протилежному напрямку й скасовують S або T. Правило: два T утворюють S, а два S — Z.
CNOT і умовна заплутаність
Вентиль CNOT cnot(control, target) перевертає цільовий кубіт саме тоді, коли керувальний кубіт перебуває у стані |1⟩. Якщо керувальний кубіт до цього перебуває в суперпозиції, CNOT може створити заплутаність: два кубіти вже не можна описувати незалежно, як у прикладі стану Белла. Якщо ж керувальний кубіт перебуває у визначеному базисному стані, CNOT лише умовно перемикає біт без заплутування. Отже, не кожен CNOT автоматично створює заплутаність.
CZ: симетричний родич CNOT
Вентиль CZ cz(a, b) інвертує знак амплітуди саме тоді, коли обидва кубіти перебувають у стані |1⟩На відміну від CNOT, окремих керувального й цільового кубітів тут немає: вентиль симетрично діє на обидва, тому на схемі його показано двома з’єднаними точками. CZ і CNOT можна перетворювати один в одного: CNOT еквівалентний CZ, якщо до й після нього застосувати вентиль Адамара до цільового кубіта. CZ є важливим блоком багатьох алгоритмів, зокрема пошуку Гровера.
Стан GHZ: заплутаність трьох кубітів
Стан GHZ, названий на честь Грінбергера, Горна й Цайлінгера, поширює принцип стану Белла на три кубіти: один вентиль Адамара та два CNOT заплутують усі три, тому вимірювання дає лише |000⟩ або |111⟩ — змішаних бітових рядків не буває. Жоден кубіт більше не має власного незалежного стану; інформація міститься лише у спільній кореляції.
Алгоритм Дойча: найменша квантова перевага
Алгоритм Дойча за одним зверненням до невідомого оракула відповідає на запитання, для якого класичному комп’ютеру потрібні два звернення: функція стала чи збалансована? Вхід пропускають через оракул у стані суперпозиції, а завдяки інтерференції відповідь однозначно кодується у вхідному кубіті. Цей принцип — фазове повернення — лежить в основі багатьох квантових алгоритмів.
Пошук Гровера: посилення амплітуд
Пошук Гровера знаходить позначений елемент у невпорядкованій множині за значно меншу кількість запитів, ніж потрібно класичному алгоритму. Оракул позначає шуканий стан зміною фази (тут — за допомогою вентиля CZ), після чого оператор дифузії підсилює його амплітуду коштом усіх інших. Для двох кубітів достатньо однієї ітерації, щоб виміряти шуканий стан зі 100% імовірністю.
Оборотне додавання: від quantum.add() до схеми
Редактор програми вище перетворює quantum.add({ a, b }) на схему з вентилів X, CNOT і CCNOT (Тоффолі), яка відтворює класичне додавання цілком оборотним способом: кожен вентиль можна точно скасувати, адже жодна інформація не втрачається. Вентиль CCNOT (ccnot(c1, c2, target)) перемикає цільовий кубіт лише тоді, коли обидва керувальні кубіти перебувають у стані |1⟩ — цього достатньо як будівельного блока для оборотного відтворення будь-якої класичної схеми, зокрема повного суматора з перенесенням. Входи A і B спочатку задаються як визначені базисні стани без суперпозиції за допомогою вентилів X. Тому вся схема проходить лише через визначені стани, а кінцеве вимірювання дає один результат зі 100% імовірністю — класично правильну суму. Саме тому quantum.add() дає детермінований результат попри квантове моделювання, а не кілька можливих станів з імовірністю меншою за 100%.
Віднімання: додавання в зворотному напрямку
Оскільки кожен вентиль квантової схеми є точно оборотним, повну схему суматора можна виконати у зворотному напрямку — і додавання перетворюється на віднімання: quantum.subtract({ a, b }) використовує вентилі суматора у зворотному порядку й обчислює a − b. Це не трюк, а основний принцип оборотних обчислень: жоден крок не знищує інформацію, і кожен крок можна скасувати. У цій версії потрібно, щоб a ≥ b, інакше виник би від’ємний результат.
Множення: quantum.multiply()
Множення тут складається з тих самих оборотних блоків, що й додавання. За звичним письмовим методом множник a кілька разів додається зі зсувом відповідно до встановлених бітів множника b. Кожне часткове додавання виконує той самий оборотний суматор із послідовним перенесенням, а біт перенесення щоразу переходить до наступного біта добутку. Оскільки регістр результату має вмістити весь добуток, множники обмежено трьома бітами (0–7): лише тоді обидва множники, добуток і кубіт перенесення разом уміщуються в десять кубітів симулятора.
Ділення: quantum.divide()
Для ділення також використовуються лише оборотні блоки: quantum.divide({ a, b }) виконує письмове ділення за допомогою зміщених оборотних віднімань дільника від регістру остачі; результатом є частка і остача (a = quotient · b + remainder). Оскільки ділене, дільник, частка і кубіт запозичення мають разом уміститися в десять кубітів, ділення має найсуворіше обмеження: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 має виконуватися, а дільник b має бути не меншим за 1, адже ділення на нуль неможливе. Якщо вхідні дані не вкладаються в цей ліміт, редактор повідомляє про це й не запускає обчислення.
Справжня випадковість: quantum.random()
Класичні комп’ютери не можуть створювати справді випадкові числа: їхня «випадковість» походить із детермінованих алгоритмів і тому є псевдовипадковою. Квантовий комп’ютер може: quantum.random({ bits }) за допомогою вентиля Адамара переводить кожен біт у рівноймовірну суперпозицію, а остаточне значення принципово непередбачувано визначається лише під час вимірювання. На справжньому квантовому обладнанні це фізична випадковість; симулятор відтворює її за допомогою генератора псевдовипадкових чисел браузера.
Симулятор проти реального квантового обладнання
Цей симулятор точно обчислює стан за допомогою класичної арифметики з рухомою комою у вашому браузері. Це можливо лише тому, що тут розглядаються дуже малі схеми — не більш як десять кубітів. Справжні квантові комп’ютери використовують фізичні кубіти, схильні до помилок через шум і декогерентність, а їхня перевага проявляється у значно більших схемах, які вже неможливо практично змоделювати класичним способом. Цей засіб призначено для навчання, а не для виконання обчислень на справжньому квантовому процесорі.