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 })Истинное квантовое случайное число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⟩ для 2 кубитов, где q0 в этом симуляторе всегда является старшим левым битом.

Суперпозиция

Кубит в суперпозиции одновременно содержит компоненты нескольких базисных состояний. Они описываются комплексными амплитудами; квадрат модуля амплитуды даёт вероятность получить соответствующее состояние при измерении.

Сфера Блоха

Состояние одного кубита можно показать стрелкой на сфере: северный полюс соответствует |0⟩, южный полюс |1⟩, а все точки экватора — равновесные суперпозиции. Фаза определяет направление стрелки вдоль экватора. Вентили поворота rx, ryи rz вращают стрелку вокруг соответствующих осей, а фазовые вентили S и T — вокруг оси Z. У запутанных кубитов стрелка сжимается к центру: отдельный кубит больше не имеет собственного чистого состояния, и запутанность становится буквально видимой.

Измерение и повторы

measureAll() одновременно измеряет все кубиты и завершает схему. Поскольку одно измерение даёт лишь один случайный результат, схема концептуально измеряется указанное число shots с помощью run({ shots }), чтобы распределение вероятностей стало видно как гистограмма. Точные вероятности дополнительно вычисляются непосредственно из вектора состояния независимо от случайности повторов.

Вентиль Адамара

Вентиль Адамара h(q) переводит кубит из определённого состояния (|0⟩ или |1⟩) в равновесную суперпозицию |0⟩ и |1⟩ , то есть примерно 50% / 50% при измерении.

Фазовые вентили S и T

Вентили s(q) и t(q) не меняют вероятности измерения одного кубита, а только поворачивают фазу амплитуды |1⟩ : S на 90°, T на 45°. Эффект проявляется вместе с суперпозицией: между двумя вентилями Адамара фаза определяет, складываются амплитуды или гасят друг друга. Варианты dagger sdg(q) и tdg(q) вращают в противоположную сторону и отменяют S и T. Правило: два T образуют S, два S образуют Z.

CNOT и условная запутанность

Вентиль CNOT cnot(control, target) инвертирует целевой кубит, когда управляющий находится в состоянии |1⟩. Если управляющий кубит заранее находится в суперпозиции, возникает запутанность: кубиты нельзя описывать независимо, как в состоянии Белла. Если управляющий кубит в определённом базисном состоянии, CNOT лишь условно инвертирует бит без запутанности. Поэтому не каждый CNOT автоматически создаёт запутанность.

CZ: симметричный родственник CNOT

Вентиль CZ cz(a, b) меняет знак амплитуды, когда оба кубита находятся в |1⟩. В отличие от CNOT, управляющего и целевого кубитов нет: вентиль одинаково действует на оба и изображается двумя соединёнными точками. CZ и CNOT преобразуются друг в друга: CNOT — это CZ, целевой кубит которого проходит через вентиль Адамара до и после операции. CZ лежит в основе многих алгоритмов, например поиска Гровера.

Состояние GHZ: запутанность трёх кубитов

Состояние GHZ, названное в честь Гринбергера, Хорна и Цайлингера, переносит принцип состояния Белла на три кубита: один вентиль Адамара и два CNOT запутывают их так, что измерение даёт только |000⟩ или |111⟩ , но не смешанные строки. Ни один кубит больше не имеет собственного состояния; информация заключена только в общей корреляции.

Алгоритм Дойча: минимальное квантовое преимущество

Алгоритм Дойча одним обращением к неизвестному оракулу отвечает на вопрос, для которого классическому компьютеру нужны два: постоянна функция или сбалансирована? Вход проходит через оракул в суперпозиции, а благодаря интерференции ответ однозначно кодируется во входном кубите. Этот принцип, фазовый откат, лежит в основе почти всех квантовых алгоритмов.

Поиск Гровера: усиление амплитуд

Поиск Гровера находит отмеченный элемент неупорядоченного множества за значительно меньшее число запросов, чем классический алгоритм. Оракул отмечает искомое состояние инверсией фазы, здесь через CZ, а оператор диффузии усиливает отмеченную амплитуду за счёт остальных. Для 2 кубитов одной итерации достаточно, чтобы получить ответ с вероятностью 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. Каждое частичное сложение выполняет тот же обратимый сумматор с последовательным переносом. Поскольку регистр результата растёт вместе с произведением, множители ограничены 3 битами (0–7): только тогда множитель, произведение и кубит переноса помещаются в 10 кубитов.

Деление: quantum.divide()

Деление также использует только обратимые элементы: quantum.divide({ a, b }) выполняет деление столбиком из сдвинутых обратимых вычитаний делителя из регистра остатка; результатом служат частное и остаток (a = quotient · b + remainder). Поскольку делимое, делитель, частное и кубит займа вместе должны поместиться в 10 кубитов, деление ограничено сильнее всего: bits(a) + bits(b) + bits(a÷b) + 1 ≤ 10 должно выполняться, а делитель b должен быть ≥ 1, поскольку делить на ноль нельзя. Если входы не помещаются в бюджет, редактор сообщает об этом вместо вычисления.

Истинная случайность: quantum.random()

Классические компьютеры не создают истинной случайности: их «случайные числа» порождаются детерминированными алгоритмами и являются псевдослучайными. Квантовый компьютер может: quantum.random({ bits }) переводит каждый бит в равновесную суперпозицию вентилем Адамара, и только измерение фундаментально непредсказуемо определяет итог. На реальном квантовом оборудовании это физически истинная случайность; симулятор имитирует её псевдослучайностью браузера.

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

Симулятор точно вычисляет состояние классической арифметикой с плавающей точкой в браузере. Это возможно лишь для очень малых схем до 10 кубитов. Реальные квантовые компьютеры используют физические кубиты, подвержены ошибкам, декогеренции и шуму, а их преимущество проявляется на гораздо более крупных схемах, которые уже нельзя практически моделировать классически. Это учебный инструмент, а не настоящий квантовый процессор.

Часто задаваемые вопросы

Это настоящий квантовый компьютер?
Нет. Это классический симулятор вектора состояния, который точно вычисляет математику небольшой квантовой схемы до 10 кубитов с плавающей точкой в браузере. Реальное квантовое оборудование использует физические кубиты и работает принципиально иначе.
Какой бит соответствует q0 в строке вроде «10»?
q0 всегда является старшим левым битом. Поэтому при 2 кубитах x(0) создаёт состояние |10⟩, а не |01⟩.
Что означает shots?
Shots — число повторных смоделированных измерений от 1 до 10 000. Каждый прогон случайно выбирает результат по точному распределению вероятностей вектора состояния. Сами точные вероятности от случайности не зависят и показываются отдельно.
Почему некоторые примеры показывают ошибку?
В рамках MVP допускается ровно одна схема с одним вызовом run() после measureAll(). Недопустимые индексы кубитов, вентили после measureAll(), неверные углы или число измерений и синтаксические ошибки отклоняются с понятным сообщением.
Как работают вентили Адамара, X и CNOT?
X меняет местами |0⟩ и |1⟩. Вентиль Адамара переводит базисное состояние в равновесную суперпозицию. CNOT инвертирует цель, только когда управление равно |1⟩, и вместе с суперпозицией может создать запутанность.
Как создаётся запутанность?
В одном примере вентиль Адамара применяется к первому кубиту, а затем CNOT — ко второму. Кубиты больше нельзя описывать независимо, и измерение даёт коррелированные результаты, например |00⟩ или |11⟩.