СТАТЬЯ

Все о воротах Адамара

Из Квантовых вычислений для разработчиков Йохана Воса

В этой статье обсуждается вентиль Адамара: что это такое, какое отношение он имеет к квантовым вычислениям и как создавать простые квантовые приложения с вентилем Адамара и некоторым кодом Java.

__________________________________________________________________

Получите скидку 37% на квантовые вычисления для разработчиков, введя fccvos в поле кода скидки при оформлении заказа на manning.com.
__________________________________________________________________

Я собираюсь начать с объяснения ворот Адамара: если вы уже знакомы с ними и хотите перейти к примерам Java, переходите ко второй части статьи.

Ворота Адамара, ворота суперпозиции

Чтобы привести частицу в состояние суперпозиции, необходимо применить физику очень высокого уровня. К счастью, как разработчику, перевод кубита в состояние суперпозиции просто требует применения определенного логического элемента к этому кубиту.

Ворота Адамара - хорошо известные ворота в квантовых вычислениях, которые достигают этого. Подобно вентилю Паули-X, вентиль Адамара действует на один кубит и также может быть представлен матрицей 2 x 2.

Ворота Адамара определяются следующим образом:

Уравнение 1

Мы хотим выяснить, что происходит, когда мы применяем этот вентиль к кубиту, находящемуся в состоянии | 0 ›. Это можно проверить, умножив матрицу вентилей на вектор кубита:

Уравнение 2

Это уравнение показывает, что после применения шлюза Адамара к кубиту, находящемуся в состоянии | 0 ›, кубит переходит в новое состояние, в котором вероятность измерения 0 равна:

Уравнение 3

И вероятность измерения 1 также равна:

Уравнение 4

В заключение, применение шлюза Адамара к кубиту, находящемуся в состоянии |0>, переводит кубит в состояние суперпозиции, где вероятность измерения 0 равна вероятности измерения 1.

Что произойдет, если мы применим вентиль Адамара к кубиту, находящемуся в состоянии |0>?

Векторное представление кубита в этом состоянии определяется следующим образом:

Уравнение 5

Следовательно, применение шлюза Адамара к этому кубиту означает умножение матрицы Адамара на приведенный выше вектор:

Уравнение 6

Если бы мы измерили кубит в этой точке, шанс измерения 0 был бы:

Уравнение 7

и шанс измерения 1 будет:

Уравнение 8

Следовательно, в обоих случаях (кубит | 0 ›или кубит | 1›) применение вентилей Адамара дает равные шансы кубиту быть 0 или 1' при измерении.

Ворота Адамара в действии

Теперь, когда у нас есть небольшая предыстория, давайте создадим простое квантовое приложение с вентилем Адамара. Соответствующий код для этого примера показан ниже:

public static void singleExecution(String[] args) {
         QuantumExecutionEnvironment simulator = new SimpleQuantumExecutionEnvironment();
         Program program = new Program(1);
         Step step = new Step();
         step.addGate(new Hadamard(0));
         program.addStep(step);
         Result result = simulator.runProgram(program);
         Qubit[] qubits = result.getQubits();
         Qubit zero = qubits[0];
         int value = zero.measure();
         System.out.println("Value = "+value);
     }

Мы создаем QuantumExecutionEnvironment, который запускает нашу программу. Затем мы создаем экземпляр Program, который имеет дело с одним кубитом, и мы создаем экземпляр Step.

Вместо того, чтобы добавлять ворота Pauli-X к этому шагу, мы теперь добавляем ворота Адамара к шагу:

step.addGate(new Hadamard(0));

Это применяет к кубиту вентиль Адамара. По умолчанию кубиты изначально находятся в состоянии | 0 ›. После применения шлюза Адамара к кубиту, который находится в этом состоянии, есть пятьдесят процентов вероятности, что кубит при измерении равен zero, и пятьдесят процентов вероятности, что он будет one.

Оставшаяся часть фрагмента кода добавляет шаг в программу и запускает программу на симуляторе.

Наконец, мы измеряем кубит и печатаем значение.

Если вы запустите эту программу один раз, вы увидите:

Value = 0

or

Value = 1

После того, как образец кода распечатает измеренное значение, он визуализирует квантовую схему с помощью StrangeFX. Это делается с помощью следующей строки кода:

Renderer.renderProgram(program);

В результате этого действия отображается окно с квантовой схемой, как показано на рисунке 2.

Как видно из этого рисунка, полученный кубит с 50% вероятностью будет измерен как 1.

Вторая часть примера вызывает функцию manyExecution, которая очень похожа на singleExecution, описанную выше, но на этот раз вы запускаете программу 1000 раз. QuantumExecutionEnvironment и Программа должны быть созданы только один раз. После создания программы в приложение добавляется следующий цикл:

Листинг 1. Несколько запусков фрагмента кода Адамара

int cntZero = 0;
         int cntOne = 0;
         for (int i = 0; i < 1000; i++) {A                   1
             Result result = simulator.runProgram(program);  2
             Qubit[] qubits = result.getQubits();
             Qubit zero = qubits[0];
             int value = zero.measure();                     3
             if (value == 0) cntZero++;                      4
             if (value == 1) cntOne++;
         }

1 Вы выполняете следующий цикл 1000 раз

2 Вы запускаете квантовую программу

3 Вы измеряете кубит

4 В зависимости от измеренного значения («0» или «1») вы увеличиваете один или другой счетчик.

Из этого фрагмента видно, что метод runProgram вызывается 1000 раз на симуляторе. Каждый раз вы измеряете получившийся кубит. Если кубит имеет значение 0, счетчик cntZero увеличивается. Если кубит имеет значение 1, счетчик cntOne увеличивается. После применения этого цикла результаты распечатываются:

System.out.println("Applied Hadamard circuit 1000 times, got "
                 + cntZero + " times 0 and " + cntOne + " times 1.");

Таким образом, результат этого приложения показывает что-то похожее на:

==================================================
 1000 runs of a Quantum Circuit with Hadamard Gate
 Applied Hadamard circuit 1000 times, got 510 times 0 and 490 times 1.
 ==================================================

Здесь вы создали генератор случайных чисел с использованием низкоуровневого Quantum API. Отдельный кубит в программе помещается в суперпозицию, а затем измеряется. При запуске этой программы на квантовом симуляторе или, как вариант, на любом классическом компьютере, имитирующем квантовое поведение, случайность все равно остается детерминированной, поскольку вы используете классические алгоритмы для генерации случайного числа. Обычно симуляторы работают с векторами вероятностей, и когда требуется измерение, случайное число используется для выбора одной из вероятностей - конечно, с учетом значения вероятностей.

На реальном квантовом оборудовании все по-другому. Когда мы измеряем кубит, сама природа выберет одно значение. Этот процесс действительно случайный (по крайней мере, это то, что в настоящее время предполагает большинство квантовых физиков). Хотя это простое приложение кажется сложным способом генерации случайного числа, оно имеет реальную ценность. Он показывает, как с помощью квантового оборудования можно сгенерировать действительно случайное число. Случайные числа чрезвычайно важны во многих областях, включая шифрование.

На этом пока все. Если вы хотите узнать больше о книге, посмотрите ее в нашей браузерной программе чтения книг LiveBook здесь и просмотрите эту слайд-колоду.