Как создать управляемый-управляемый-НЕ-ворота

Этот пост является частью книги: Практическое квантовое машинное обучение с помощью Python.

Вентили квантового преобразования позволяют нам работать с кубитами. RY-вентиль позволяет нам указать угол вектора состояния кубита θ, который управляет вероятностью измерения кубита как 0 или 1. Мы использовали его, чтобы кубит представлял предельную вероятность.

X-вентиль (НЕ-вентиль) переключает амплитуды вероятности кубита. Мы использовали его, чтобы установить значение кубита в 1 в определенном состоянии. Например, чтобы работать с остатком после расчета предельной вероятности.

Это полезно, потому что некоторые гейты применяют преобразование только к кубиту (управляемому кубиту), когда другой кубит (управляющий кубит) находится в состоянии | 1⟩. Например, управляемый RY-вентиль (CRY-gate) позволяет нам определять совместную вероятность маргинального остатка и другую вероятность.

CRY-gate - это композитные ворота. Мы узнали, как создать эти ворота из более простых ворот, в этом посте. Прежде всего, мы использовали CNOT-гейт.

На первый взгляд, возможность применить X-вентиль к кубиту, если другой кубит равен | 1⟩, не кажется важной. Но X-вентиль играет центральную роль при создании кубитов более высокого уровня, потому что он запутывает два кубита. Концептуально запутанные кубиты разделяют состояние суперпозиции. Фактически, вентиль CNOT является строительным блоком большинства сложных вентилей квантового преобразования.

Следующий код изображает декомпозицию CRY-ворот.

Что, если вы хотите применить определенный вентиль тогда и только тогда, когда два других кубита находятся в состоянии | 1⟩? Вы можете возразить, что AND не является допустимым вентилем кубита. Беглый взгляд на таблицу истинности показывает, что оператор AND необратим. Если на выходе вы получите false, вы не сможете определить, что это был за вход. Это может быть одно из трех разных состояний.

Но CNOT-гейт дает выход. Помните, когда мы строили CRY-вентиль, мы использовали CNOT-вентиль для переключения амплитуд управляемого кубита в середине вращения вокруг первой половины и обратного вращения вокруг второй половины общего вращения. Подобный шаблон позволяет нам создать управляемый-управляемый гейт. Такой вентиль содержит AND-отношение, потому что у него есть два управляющих кубита, и он изменяет управляемый кубит, только если оба управляющих кубита находятся в состоянии | 1⟩.

На следующем рисунке изображена схема CCNOT-затвора - управляемого-управляемого-НЕ-затвора.

The CCNOT-gate is also known as the Toffoli-gate. The Toffoli-gate has a different algorithm than this one. The Toffoli-gate uses qubit phases. Phases are concept we cover later in this book. The implementation we presented here is not optimal but it provides a vivid explanation of the underlying concept.

В следующем листинге показан код этой последовательности CCNOT-gate. Мы определяем многоразовую функцию ccnot (строка 4). Он начинается с управляемого вращения с кубитом q0 в качестве управляющего кубита (строка 6). Он вращает управляемый кубит на θ = π / 2, значение, которое мы определили ранее (строка 2).

Затем у нас есть еще одно управляемое вращение с тем же кубитом, что и контрольный кубит (строка 11), инкапсулированным в CNOT-вентили (строки 10 и 12). Важно отметить, что этот инкапсулированный CRY-вентиль имеет параметр -θ. Он обозначает вращение в противоположном направлении.

Наконец, у нас есть еще один управляемый поворот вокруг θ с кубитом q1, который является управляющим кубитом.

Давайте пройдемся по схеме по очереди. Сначала мы определяем наш θ = π / 2 (строка 2). Величина π / 2 представляет поворот на четверть круга. Это половина общего поворота, который мы хотим применить. Вращение вокруг половины круга (π) переключает амплитуды с | 0⟩ на | 1⟩ и наоборот.

На первом этапе мы вращаем управляемый кубит на четверть круга, если кубит q1 находится в состоянии | 1⟩ через CRY (π / 2) -гейт (строка 8).

Если оба управляющих кубита находятся в состоянии | 1⟩, результат этого вентиля будет таким, как показано на следующем рисунке.

Оба управляющих кубита (читаются справа налево) находятся в состоянии | 1⟩ согласно нашей инициализации. Затем половину времени (согласно обороту на π / 2) управляемый кубит находится в состоянии | 1⟩.

Затем мы применяем последовательность CNOT-вентилей, где q0 - это управляющий кубит, а q1 - управляемый кубит. Поскольку q0 находится в состоянии | 1⟩, он изменяет состояние q1 с | 1⟩ на | 0⟩. Следующее управляемое вращение с q1 в качестве управляющего кубита не имеет никакого эффекта, потому что q1 теперь находится в состоянии | 0⟩, а CRY-вентиль изменяет управляемый кубит, только если управляющий кубит находится в состоянии | 1⟩. Следующий вентиль CNOT отменяет эффект, который имел первый вентиль CNOT. Поскольку управляющий кубит q0 все еще находится в состоянии | 1⟩, он переключает состояние q1 обратно из состояния | 0⟩ в | 1⟩.

Если оба управляющих кубита находятся в состоянии | 1⟩, эти три логических элемента вообще не действуют.

Наконец, мы применяем управляемое вращение вокруг π / 2 с q0 в качестве управляющего кубита. Это переводит состояние управляемого кубита q2 из состояния | 1⟩ половину времени в состояние | 1⟩ все время. Он поворачивает вектор состояния кубита вокруг другой четверти круга, составляя половину оборота. Половина поворота вокруг круга превращает состояние | 0⟩ в | 1⟩, как показано на следующем рисунке.

Давайте посмотрим на код и результат, если оба управляющих кубита находятся в состоянии | 1⟩.

Мы видим, что кубит q2 все время находится в состоянии | 1⟩. Он полностью переключился из исходного состояния | 0⟩.

Что делать, если один из управляющих кубитов не находится в состоянии | 1⟩? Допустим, кубит q0 находится в состоянии | 0⟩.

Опять же, первый CRY-вентиль поворачивает вектор состояния кубита управляемого кубита на π / 2 - четверть круга - потому что управляющий кубит q1 находится в состоянии | 1⟩.

Но на этот раз следующий CNOT-вентиль не действует. Поскольку кубит q0 находится в состоянии | 0⟩, он не переключает состояние кубита q1 с | 1⟩ на | 0⟩. В результате вступает в силу следующий CRY-вентиль с θ = −π / 2. Он возвращает эффект первого CRY-гейт. Следующий вентиль CNOT и последний вентиль CRY не действуют, потому что кубит q0 находится в состоянии | 0⟩. Таким образом, мы применили только первые два CRY-гейта, а второй вернул первый. Посмотрим код и результат.

Мы видим, что общее состояние не изменилось. Управляемый кубит остается в состоянии | 0⟩.

Наконец, давайте посмотрим, что произойдет, если только управляющий кубит q0 находится в состоянии | 1⟩, а кубит q1 - нет. Затем первый CRY-гейт проходит безрезультатно. Следующая последовательность второго CRY-гейта, инкапсулированного в CNOT-вентили, сначала переключает кубит q1 с | 0⟩ на | 1⟩, затем применяет поворот управляемого кубита вокруг −θ = −π / 2 и переключает кубит q1 обратно из От | 1⟩ до | 0⟩. Теперь управляемый кубит повернут на половину контура в противоположном направлении. На следующем рисунке показан результат на данный момент.

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

Наконец, последний CRY-вентиль поворачивает управляемый кубит назад на θ, потому что управляющий кубит q0 находится в состоянии | 1⟩. Результатом является снова исходное состояние, как показано в следующем коде и результатах.

Вывод

Мы создали управляемый-управляемый-НЕ-вентиль через композицию CNOT- и CRY-ворот. Мы могли бы даже дополнительно составить CRY-ворота через CNOT- и RY-ворота. Это эффективно показывает важность CNOT-ворот. Это не только лучший пример для объяснения квантовой запутанности, но и строительный блок для создания дополнительных управляемых ворот. Или контролируемые-контролируемые ворота. И даже контролируемые-контролируемые-контролируемые ворота. Вы можете продолжать эту последовательность, пока у вас не закончатся кубиты.

Этот пост является частью книги: Практическое квантовое машинное обучение с помощью Python.

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