ToolDingo

Квантовий комп'ютерний симулятор

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

Шумова модель

Реальні квантові комп’ютери не обчислюють ідеально: кубіти надзвичайно чутливі й утрачають частину інформації через декогерентність під час небажаної взаємодії з довкіллям — теплом, електромагнітними полями чи сусідніми кубітами. Операції вентилів теж не бувають абсолютно точними, а помилка можлива навіть під час остаточного зчитування. За замовчуванням цей симулятор обчислює ідеальну схему; тут можна ввімкнути типові моделі помилок і безпосередньо спостерігати їхній вплив на результати.

Застосовується до кожної симуляції на цій сторінці — як до операцій високого рівня, так і до схем, написаних вручну.
%
Для кожного вентиля й задіяного кубіта або для кожного зчитаного біта в моделі зчитування. Виберіть значення для сценарію, який хочете дослідити.

Код програми

Опишіть обчислення за допомогою quantum.add, quantum.subtract, quantum.multiply, quantum.divide або quantum.random. Ctrl+Enter запускає симуляцію. Повна довідка доступна за кнопкою «Документація».

Документація

Опишіть обчислення в редакторі — на його основі автоматично буде згенеровано й змодельовано справжню квантову схему. Максимум 4000 символів. Ctrl+Enter запускає симуляцію.

ФормулаОписЛіміти
quantum.add({ a, b })Додати два числаРезультат: максимум 4 біти (0–15)
quantum.subtract({ a, b })Відніманняa ≥ b, максимум 4 біти
quantum.multiply({ a, b })МноженняМножники 0–7 (3 біти)
quantum.divide({ a, b })Ділення (частка + остача)b ≥ 1; суворе обмеження: bits(a)+bits(b)+bits(a÷b)+1 ≤ 10
quantum.random({ bits })Справжнє квантове випадкове числобіти 1–10

Виберіть приклад

Код схеми

Максимум 4000 символів. Доступні методи QuantumCircuit: x, y, z, h, s, sdg, t, tdg, rx, ry, rz, cnot, cz, ccnot (псевдонім toffoli), swap, measureAll і run. Ctrl+Enter запускає симуляцію.

Виберіть приклад

Основи: як це працює?

Схема квантової установки: керувальний комп’ютер спрямовує кілька лазерних променів через оптичний стіл до кубіта у вакуумній камері.
Від класичного керувального комп’ютера через лазери й оптику до фізичного кубіта.

Від програми до фізичного кубіта

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

Кубіт і базисні стани

Класичний біт дорівнює або 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 }) за допомогою вентиля Адамара переводить кожен біт у рівноймовірну суперпозицію, а остаточне значення принципово непередбачувано визначається лише під час вимірювання. На справжньому квантовому обладнанні це фізична випадковість; симулятор відтворює її за допомогою генератора псевдовипадкових чисел браузера.

Симулятор проти реального квантового обладнання

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

Поширені запитання

Це справжній квантовий комп'ютер?
Ні. Це класичний симулятор вектора стану, який точно обчислює математику невеликої квантової схеми до 10 кубітів за допомогою арифметики з рухомою комою у вашому браузері. Справжнє квантове обладнання використовує фізичні кубіти й працює принципово інакше.
Де розташований q0 у бітовому рядку на кшталт "10"?
q0 завжди є найстаршим, тобто крайнім лівим бітом. Для двох кубітів x(0) створює стан |10⟩, а не |01⟩.
Що означає «запуски»?
Запуски — це кількість симульованих повторних вимірювань (від 1 до 10 000). Кожен запуск випадково вибирає результат відповідно до точного розподілу ймовірностей вектора стану. Самі точні ймовірності не залежать від випадкової вибірки й показуються окремо.
Чому деякі приклади показують повідомлення про помилку?
Поточна версія підтримує рівно одну схему з одним викликом run() після measureAll(). Некоректні індекси кубітів, вентилі після measureAll(), неправильні кути чи кількість запусків і синтаксичні помилки відхиляються зі зрозумілим повідомленням.
Що роблять вентилі Адамара, X і CNOT?
X міняє місцями |0⟩ і |1⟩. Вентиль Адамара перетворює базисний стан на рівноймовірну суперпозицію. CNOT перемикає цільовий кубіт лише тоді, коли керувальний дорівнює |1⟩, і разом із суперпозицією може створювати заплутаність.
Як створюється заплутаність?
В одному з прикладів вентиль Адамара застосовується до першого кубіта, а потім CNOT — до другого. Після цього кубіти вже не можна описувати незалежно, а вимірювання дає корельовані результати |00⟩ або |11⟩.