Как реализовать «и» и «или» в Qiskit

Хотите начать работу с квантовым машинным обучением? Взгляните на статью Практическое квантовое машинное обучение с помощью Python.

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

Лучше всего это иллюстрируется стандартной структурой if then else.

Предложение if этой структуры обычно содержит чистую логическую логику. Здесь мы широко используем логические операторы, такие как и, или и not.

Но логическая логика не работает в квантовых вычислениях. В квантовых вычислениях все преобразования кубита должны быть обратимыми. Это означает, что вам нужно не только вычислить выход с учетом входа, но также необходимо уметь вычислять вход с учетом определенного выхода. А это невозможно для некоторых логических операторов, например, и и или.

Давайте посмотрим на таблицу истинности, представляющую эти операторы.

Таблица истинности показывает, что мы не всегда можем сказать, какой вход был получен на выходе. Например, если мы применим P or Q и в результате получим true, мы не знаем, было ли P true, Q было истинным или оба P и Q были верно. И если мы применим P and Q, мы не сможем определить ввод, если на выходе получим false.

Эти операторы необратимы и поэтому не подходят для преобразования кубита.

К счастью, мы можем преобразовать эти операторы, чтобы они стали обратимыми. Уловка состоит в том, чтобы сохранить исходный ввод и записать вывод во вспомогательный кубит. Рассмотрим операторы и.

Вместо двух кубитов мы используем три. Мы оцениваем, являются ли первые два кубита истинными, и если да, мы меняем значение третьего кубита. На следующем рисунке изображена таблица истинности этого оператора.

Технически рассчитываем. Это означает «P и Q xor A.» Оператор xor является исключающим оператором или. Это верно, только если либо P, либо Q истинны, а соответствующие другие - ложны. Неверно, если оба истинны или оба ложны.

Поскольку у нас есть три переменные с двумя возможными значениями каждая, существует 2³ = 8 различных комбинаций. И, как видите, ввод вспомогательной переменной A также имеет значение. Столбцы P и Q остаются неизменными, но значение вспомогательного значения изменяется, если P и Q истинны. И что наиболее важно, учитывая любой результат, мы можем определить, что это был за вход. Это преобразование обратимо.

В квантовых вычислениях мы работаем не со значениями истинности, а с состояниями кубитов. Базовые состояния кубита - это | 0⟩, которое мы измеряем как 0, и | 1⟩, которое мы измеряем как 1.

Когда мы применяем вентиль Адамара к кубиту в состоянии | 0⟩, это приводит к состоянию | +⟩. В этом состоянии мы измеряем кубит как 0 или 1 с вероятностью 50% каждый. Давайте посмотрим.

Итак, подготовим квантовую схему с тремя кубитами. Кроме того, мы сохраняем их ссылки в переменных Python P, Q и A.

Когда мы применяем вентили Адамара к P и Q, мы видим четыре разных состояния. На рисунке кубиты читаются справа (P) налево (A). Мы всегда измеряем кубит A как 0, потому что мы его не трогали.

Вентиль квантового преобразования, который применяет, - это вентиль Тоффоли. Он также известен как ворота CCNOT, где CC означает «контролируемый-управляемый». Если вы снова посмотрите на таблицу истинности, вы увидите, что этот оператор переключает значение вспомогательного кубита (то есть целевого кубита), если два других кубита (они являются контрольными кубитами) находятся в состоянии | 1⟩.

Результаты показывают, что мы измеряем целевой кубит A (левый кубит) как 1, только если кубиты P и Q находятся в состоянии | 1⟩ и измеряются как 1.

Далее посмотрим на оператор 𝑃∨𝑄⊕𝐴. Этот оператор должен применять НЕ-вентиль к целевому кубиту, если кубит P или кубит Q находятся в состоянии | 1⟩.

Как видно из результатов, мы измеряем целевой кубит A как 1, если один или оба управляющих кубита находятся в состоянии | 1⟩. Хитрость здесь в том, чтобы применить два дополнительных гейта с управляемым НЕ. Единственный вентиль управляемого НЕ преобразует кубиты 𝑃⊗𝐴 в.

Первый вентиль управляемого НЕ переключает 𝐴 из | 0⟩ в | 1⟩, если 𝑃 находится в состоянии | 1⟩. Если 𝑄 не находится в состоянии | 1⟩, два других логических элемента ничего не делают и, таким образом, оставляют кубит 𝐴 в состоянии | 1⟩.

Соответственно, если только кубит 𝑄 находится в состоянии | 1⟩, то вентиль qc.cx(Q, A) переключает 𝐴 из | 0⟩ в | 1⟩, а два других логических элемента ничего не делают.

Наконец, если оба кубита находятся в состоянии | 1⟩, то применяются все три гейта. Первый вентиль переключает 𝐴 из | 0⟩ в | 1⟩. Второй вентиль снова переключает его на | 0⟩, а третий вентиль снова переключает его на | 1⟩.

Заключение

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

В этом посте мы узнали несколько приемов, которые позволяют превратить необратимый оператор в обратимый квантовый оператор. Но мы должны бережно относиться к этим знаниям. Мы не должны пытаться воспроизвести классическую логику в наших квантовых схемах. Когда мы хотим воспользоваться квантовым преимуществом, нам нужно думать по-другому.

Тем не менее, даже в продвинутых квантовых алгоритмах мы используем такие базовые структуры для подготовки квантового состояния таким образом, чтобы представлять проблему, которую мы стремимся решить.

Хотите начать работу с квантовым машинным обучением? Взгляните на статью Практическое квантовое машинное обучение с помощью Python.

Первые три главы получите бесплатно здесь.