Что представляет собой цикл вычислений на квантовом компьютере?
1. Приготовили кубиты в нужном количестве и нужном нам начальном состоянии.
2. Собрали кубиты в квантовый регистр.
3. Применили к квантовому регистру последовательность операций.
4. Произвели измерение кубитов, составляющих квантовый регистр. Получили в итоге двоичное число, размерность которого совпадает с размерностью квантового регистра.
5. Поразмыслили над полученным результатом.
6. Повторили цикл вычислений (пункты с 1. по 5.), возможно, много раз.
7. Поразмыслили над результатом.
За каждым из пунктов стоят тома непрошибаемой теории. Но мы же программисты. Многие ли из нас знают так уж хорошо, что там и как крутится-вертится в классических процессорах. Да, практически, никто. Да оно, вроде бы, не очень и надо. Может и здесь как-нибудь так. Нам бы среду (IDE-шку какую-никакую, или чего там есть?), пару тезисов… мы чего-нибудь накалякаем, ткнём кнопочку “run”, квантовый компилятор (или чего там у них) выдаст нам синтаксис, мы его подправим. Глядишь, потихонечку пойдёт-поедет!
Отчего же не попробовать? Кто нам, в конце концов, запретит? Google нам в руки. Осмотримся! Во-первых, что там с ассортиментом квантовых компьютеров на рынке? Так. Понятно. Глухо! Поработать с живой железкой ещё не скоро доведётся. Люди даже выражают сомнения, доведётся ли вообще когда-нибудь. Ну, я имею в виду, с такой нормальной железкой, с несколькими сотнями кубитов, размером с ноутбук, и чтобы купить можно было недорого в любом ближайшем хозяйственном магазине. Да. Нескоро.
Ну и ладно. Но руки-то чешутся! А интуиция и образование подсказывают, что всё это квантовое вычислительное хозяйство вполне должно поддаваться (с какими-то ограничениями) моделированию на классических компьютерах. Поищем в этом направлении. Здесь уже получше ситуация. Но, всё-таки, на удивление мало живых/активных проектов. Совсем молодая область! Но кое-что есть. Особенно долго копаться, и привередничать не будем, возьмём первое, более-менее понятное и более-менее работающее. И, желательно, попроще. Например, QCad
Ну вот! Среда есть, кнопки есть. Нифига непонятно пока, по ходу разберёмся. Бегло пробежали глазами мануальчик и в бой!
Значит так: слева в главном окне – кубиты.
![](https://habrastorage.org/r/w780q1/files/7dd/9b2/a04/7dd9b2a04aa346429425f2e586eaa40b.jpg)
Есть панель-toolbox с иконками элементарных преобразований (гейтов), которые мы будем нанизывать на горизонтальные линейки с рисками.
![](https://habrastorage.org/r/w780q1/files/a99/ba0/3fc/a99ba03fcc8644b5b762357e9b4102a7.jpg)
По нажатию кнопки “run”, эти наши кубиты, как бы, побегут слева направо и будут последовательно пробегать сквозь гейты (т.е. претерпевать соответствующие преобразования) и, в конце концов, прибегут к правому краю окошка, полностью преобразованные в соответствии с нашей «программой» (последовательностью гейтов). А на правый конец линеек (всех или не всех, это уж как мы пожелаем), мы повесим иконки, символизирующие процесс измерения, которым заканчивается всякий цикл вычислений на квантовом компьютере. Сам же результат измерений в разных видах мы можем просмотреть в отдельном окошке.
![](https://habrastorage.org/r/w780q1/files/aac/0d8/b35/aac0d8b352384016bed5a9c97e26d583.jpg)
Результат измерения квантового регистра – одно двоичное число. И процесс измерения – это вероятностный процесс. Т.е. мы на выходе получаем одно из возможных (вероятных) значений результата вычислений. А нам практически всегда требуется оценить распределение вероятностей. Чтобы оценить это искомое распределение, процесс вычисления надо бы повторить много раз. В окошке результата измерений (на вкладке «Measured», т.е. «Измеренное») разработчик QCAD выдаёт нам результат сразу в виде искомого распределения вероятностей каждого из возможных состояний регистра. Так разработчику намного проще моделировать, а пользователю намного проще анализировать результат.
Сходу может быть неочевидно, что кубит № 1 – это самый младший кубит регистра и в окошке результата в состоянии регистра он находится в позиции младшего бита, т.е – крайний справа.
![](https://habrastorage.org/r/w780q1/files/454/19c/773/45419c7733be4a868bc123ea65b4b257.jpg)
Очень, конечно, интересно, как это реализовано (или, вернее будет сказать, может быть реализовано, потенциально) в железе, но первые же несколько робких и безуспешных попыток продраться сквозь зубодробительную теорию, основательно охлаждают этот интерес. Ну и ладно.
Кубит – это квантовомеханическая система. Кубит потому так и называется (ку — БИТ), что для нас, программистов, он выглядит имеющим всего два базисных состояния. А, стало быть, как учат нас первые строчки учебников квантовой механики, мы вправе ожидать, что, в общем случае, кубит будет скорее находиться в суперпозиции базисных состояний, чем в одном из «чистых» базисных. А в симуляторе мы видим слева (на входе) кубиты в состояниях |0> и |1>. Как так? Метнёмся в Google, осмотримся. Да, действительно. Квантовые инженеры-железячники уже научились «приготавливать» кубиты в «чистых» базисных состояниях. Ну и славно.
А чем замечательно базисное состояние (|0> или |1>)? Замечательно оно тем, что сколько бы раз мы ни применяли процедуру измерения к кубиту в одном из этих состояний, мы всегда будем получать определённый результат (0 или 1). Измерение в квантовой механике, как мы знаем, процесс вероятностный, а тут у нас результат будет определённый, т.е. вероятность будет равна 1.
Итак, приступаем к экспериментам с нашим симулятором! С чего начнём? Ну, вот все говорят: «Квантовые вычисления …, квантовые вычисления …»! Хочется уже понять, что это за квантовые вычисления такие? Идёшь, естественно, в Google, набираешь: «квантовые вычисления», и вываливается тебе много всего, но среди всего того, что вываливается, ты находишь либо какие-то общие слова, либо убойную математику, либо убойную физику. И хочется спросить: а где же собственно сами вычисления?! Но спросить особенно некого. Ну, вот давайте, пожалуй, с этого и начнём, попробуем смоделировать на нашей модели квантового компьютера самые обычные арифметические операции с двоичными числами.
Реализуем операцию сложения двух двухразрядных чисел. Три кубита используем для хранения результата (Q1, Q2, Q3), два кубита под первое слагаемое (Q4, Q5), два кубита под второе слагаемое (Q6, Q7) и ещё понадобится какое-то количество вспомогательных кубитов (для хранения бита переноса, например, и т.п.).
![](https://habrastorage.org/r/w780q1/files/109/aa1/c23/109aa1c235d14efeab141c19ffba4a5c.jpg)
Первое, что мы делаем – создаём шаблон модели:
File -> new ->…
В появившемся диалоге
![](https://habrastorage.org/r/w780q1/files/32d/224/010/32d2240101914e18860abebce4240326.jpg)
выбираем требуемое количество строк (т.е. кубитов) и столбцов (тактов вычислений) и жмём ОК.
В открывшемся пустом окне справа вешаем в нужных позициях иконки измерения,
![](https://habrastorage.org/r/w780q1/files/afe/88b/e1a/afe88be1a3ef44a58741abf8625d32b6.jpg)
и получаем готовый шаблон приложения.
Теперь, используя доступные нам гейты (элементарные преобразования), мы должны «собрать» искомую программу (сложение двух двухразрядных двоичных чисел). Я использовал для этого гейты «controlled not» и «controlled controlled not». Что они собой представляют и как работают, всякий может подсмотреть в своём «Карманном справочнике для квантового программиста».
Ниже на картинке приведена моя реализация решения задачи:
![](https://habrastorage.org/r/w780q1/files/7dd/9b2/a04/7dd9b2a04aa346429425f2e586eaa40b.jpg)
Очень возможно, что это решение покажется кому-то чудовищным, но, несомненно, — оно является решением! А как это проверить?
Если дважды кликнуть на квадратике с символом состояния кубита.
![](https://habrastorage.org/r/w780q1/files/410/c45/c42/410c45c4259b46878d6795d3b83a24a5.jpg)
Откроется диалог:
![](https://habrastorage.org/r/w780q1/files/9fc/8d6/5b5/9fc8d65b56f74595ba98b6ad3005d61e.jpg)
c помощью которого можно выбрать начальное состояние каждого конкретного кубита.
Таким образом, задавая различные начальные состояния кубитам операндов, мы будем получать разные значения результата после нажатия кнопки “RUN”. А что у нас здесь будет результатом и как его посмотреть? Идём в окошке Qubits status на вкладку Measured и находим там состояние регистра, напротив которого стоит число (суть вероятность) 1.0.
![](https://habrastorage.org/r/w780q1/files/1ab/6e8/19f/1ab6e819ffee4d5ea3246bc168212228.jpg)
Это и будет результат наших вычислений!
Ну что же, для самого первого знакомства с темой, пожалуй, хватит. Засим, позвольте откланяться.
Искренне ваш!
1. Приготовили кубиты в нужном количестве и нужном нам начальном состоянии.
2. Собрали кубиты в квантовый регистр.
3. Применили к квантовому регистру последовательность операций.
4. Произвели измерение кубитов, составляющих квантовый регистр. Получили в итоге двоичное число, размерность которого совпадает с размерностью квантового регистра.
5. Поразмыслили над полученным результатом.
6. Повторили цикл вычислений (пункты с 1. по 5.), возможно, много раз.
7. Поразмыслили над результатом.
За каждым из пунктов стоят тома непрошибаемой теории. Но мы же программисты. Многие ли из нас знают так уж хорошо, что там и как крутится-вертится в классических процессорах. Да, практически, никто. Да оно, вроде бы, не очень и надо. Может и здесь как-нибудь так. Нам бы среду (IDE-шку какую-никакую, или чего там есть?), пару тезисов… мы чего-нибудь накалякаем, ткнём кнопочку “run”, квантовый компилятор (или чего там у них) выдаст нам синтаксис, мы его подправим. Глядишь, потихонечку пойдёт-поедет!
Отчего же не попробовать? Кто нам, в конце концов, запретит? Google нам в руки. Осмотримся! Во-первых, что там с ассортиментом квантовых компьютеров на рынке? Так. Понятно. Глухо! Поработать с живой железкой ещё не скоро доведётся. Люди даже выражают сомнения, доведётся ли вообще когда-нибудь. Ну, я имею в виду, с такой нормальной железкой, с несколькими сотнями кубитов, размером с ноутбук, и чтобы купить можно было недорого в любом ближайшем хозяйственном магазине. Да. Нескоро.
Ну и ладно. Но руки-то чешутся! А интуиция и образование подсказывают, что всё это квантовое вычислительное хозяйство вполне должно поддаваться (с какими-то ограничениями) моделированию на классических компьютерах. Поищем в этом направлении. Здесь уже получше ситуация. Но, всё-таки, на удивление мало живых/активных проектов. Совсем молодая область! Но кое-что есть. Особенно долго копаться, и привередничать не будем, возьмём первое, более-менее понятное и более-менее работающее. И, желательно, попроще. Например, QCad
Ну вот! Среда есть, кнопки есть. Нифига непонятно пока, по ходу разберёмся. Бегло пробежали глазами мануальчик и в бой!
Значит так: слева в главном окне – кубиты.
![](https://habrastorage.org/files/7dd/9b2/a04/7dd9b2a04aa346429425f2e586eaa40b.jpg)
Есть панель-toolbox с иконками элементарных преобразований (гейтов), которые мы будем нанизывать на горизонтальные линейки с рисками.
![](https://habrastorage.org/files/a99/ba0/3fc/a99ba03fcc8644b5b762357e9b4102a7.jpg)
По нажатию кнопки “run”, эти наши кубиты, как бы, побегут слева направо и будут последовательно пробегать сквозь гейты (т.е. претерпевать соответствующие преобразования) и, в конце концов, прибегут к правому краю окошка, полностью преобразованные в соответствии с нашей «программой» (последовательностью гейтов). А на правый конец линеек (всех или не всех, это уж как мы пожелаем), мы повесим иконки, символизирующие процесс измерения, которым заканчивается всякий цикл вычислений на квантовом компьютере. Сам же результат измерений в разных видах мы можем просмотреть в отдельном окошке.
![](https://habrastorage.org/files/aac/0d8/b35/aac0d8b352384016bed5a9c97e26d583.jpg)
Хозяйке на заметку № 1
Результат измерения квантового регистра – одно двоичное число. И процесс измерения – это вероятностный процесс. Т.е. мы на выходе получаем одно из возможных (вероятных) значений результата вычислений. А нам практически всегда требуется оценить распределение вероятностей. Чтобы оценить это искомое распределение, процесс вычисления надо бы повторить много раз. В окошке результата измерений (на вкладке «Measured», т.е. «Измеренное») разработчик QCAD выдаёт нам результат сразу в виде искомого распределения вероятностей каждого из возможных состояний регистра. Так разработчику намного проще моделировать, а пользователю намного проще анализировать результат.
Хозяйке на заметку № 2
Сходу может быть неочевидно, что кубит № 1 – это самый младший кубит регистра и в окошке результата в состоянии регистра он находится в позиции младшего бита, т.е – крайний справа.
![](https://habrastorage.org/files/454/19c/773/45419c7733be4a868bc123ea65b4b257.jpg)
Очень, конечно, интересно, как это реализовано (или, вернее будет сказать, может быть реализовано, потенциально) в железе, но первые же несколько робких и безуспешных попыток продраться сквозь зубодробительную теорию, основательно охлаждают этот интерес. Ну и ладно.
Непонятка № 1
Кубит – это квантовомеханическая система. Кубит потому так и называется (ку — БИТ), что для нас, программистов, он выглядит имеющим всего два базисных состояния. А, стало быть, как учат нас первые строчки учебников квантовой механики, мы вправе ожидать, что, в общем случае, кубит будет скорее находиться в суперпозиции базисных состояний, чем в одном из «чистых» базисных. А в симуляторе мы видим слева (на входе) кубиты в состояниях |0> и |1>. Как так? Метнёмся в Google, осмотримся. Да, действительно. Квантовые инженеры-железячники уже научились «приготавливать» кубиты в «чистых» базисных состояниях. Ну и славно.
А чем замечательно базисное состояние (|0> или |1>)? Замечательно оно тем, что сколько бы раз мы ни применяли процедуру измерения к кубиту в одном из этих состояний, мы всегда будем получать определённый результат (0 или 1). Измерение в квантовой механике, как мы знаем, процесс вероятностный, а тут у нас результат будет определённый, т.е. вероятность будет равна 1.
Итак, приступаем к экспериментам с нашим симулятором! С чего начнём? Ну, вот все говорят: «Квантовые вычисления …, квантовые вычисления …»! Хочется уже понять, что это за квантовые вычисления такие? Идёшь, естественно, в Google, набираешь: «квантовые вычисления», и вываливается тебе много всего, но среди всего того, что вываливается, ты находишь либо какие-то общие слова, либо убойную математику, либо убойную физику. И хочется спросить: а где же собственно сами вычисления?! Но спросить особенно некого. Ну, вот давайте, пожалуй, с этого и начнём, попробуем смоделировать на нашей модели квантового компьютера самые обычные арифметические операции с двоичными числами.
Эксперимент № 1
Реализуем операцию сложения двух двухразрядных чисел. Три кубита используем для хранения результата (Q1, Q2, Q3), два кубита под первое слагаемое (Q4, Q5), два кубита под второе слагаемое (Q6, Q7) и ещё понадобится какое-то количество вспомогательных кубитов (для хранения бита переноса, например, и т.п.).
![](https://habrastorage.org/files/109/aa1/c23/109aa1c235d14efeab141c19ffba4a5c.jpg)
Первое, что мы делаем – создаём шаблон модели:
File -> new ->…
В появившемся диалоге
![](https://habrastorage.org/files/32d/224/010/32d2240101914e18860abebce4240326.jpg)
выбираем требуемое количество строк (т.е. кубитов) и столбцов (тактов вычислений) и жмём ОК.
В открывшемся пустом окне справа вешаем в нужных позициях иконки измерения,
![](https://habrastorage.org/files/afe/88b/e1a/afe88be1a3ef44a58741abf8625d32b6.jpg)
и получаем готовый шаблон приложения.
Теперь, используя доступные нам гейты (элементарные преобразования), мы должны «собрать» искомую программу (сложение двух двухразрядных двоичных чисел). Я использовал для этого гейты «controlled not» и «controlled controlled not». Что они собой представляют и как работают, всякий может подсмотреть в своём «Карманном справочнике для квантового программиста».
Ниже на картинке приведена моя реализация решения задачи:
![](https://habrastorage.org/files/7dd/9b2/a04/7dd9b2a04aa346429425f2e586eaa40b.jpg)
Очень возможно, что это решение покажется кому-то чудовищным, но, несомненно, — оно является решением! А как это проверить?
Хозяйке на заметку № 3
Если дважды кликнуть на квадратике с символом состояния кубита.
![](https://habrastorage.org/files/410/c45/c42/410c45c4259b46878d6795d3b83a24a5.jpg)
Откроется диалог:
![](https://habrastorage.org/files/9fc/8d6/5b5/9fc8d65b56f74595ba98b6ad3005d61e.jpg)
c помощью которого можно выбрать начальное состояние каждого конкретного кубита.
Таким образом, задавая различные начальные состояния кубитам операндов, мы будем получать разные значения результата после нажатия кнопки “RUN”. А что у нас здесь будет результатом и как его посмотреть? Идём в окошке Qubits status на вкладку Measured и находим там состояние регистра, напротив которого стоит число (суть вероятность) 1.0.
![](https://habrastorage.org/files/1ab/6e8/19f/1ab6e819ffee4d5ea3246bc168212228.jpg)
Это и будет результат наших вычислений!
Ну что же, для самого первого знакомства с темой, пожалуй, хватит. Засим, позвольте откланяться.
Искренне ваш!