Упражнение. Создание квантовой запутанности с помощью Q#
В предыдущей теме вы узнали о понятии квантового запутывания и состояниях Белла.
В этом разделе вы используете Microsoft Quantum Development Kit (QDK) для написания Q# кода, который создает запутанные состояния Белла между двумя кубитами. Чтобы создать ваше первое Беллово состояние, необходимо применить два квантовых преобразования: преобразование Хадамара и преобразование Controlled-NOT (CNOT).
Во-первых, давайте посмотрим, как работают эти операции и почему они создают запутанные состояния.
Операция Hadamard
Напомним, что операция Hadamard или H помещает кубит, который находится в чистом $\ket{0}$ состоянии или $\ket{1}$ состоянии в равном состоянии суперпозиции.
$$ H \ket{0} = \frac1{\sqrt2} \ket{0} + \frac1{\sqrt2} \ket{1}$$ $$ H \ket{1} = \frac1{\sqrt2} \ket{0} - \frac1{\sqrt2} \ket{1}$$
Первым шагом для создания состояния Bell является выполнение операции Hadamard на одном из кубитов.
Операция "Управляемое НЕ" (CNOT)
Если два кубита запутаны, состояние одного кубита зависит от состояния другого кубита. Таким образом, чтобы запутать два кубита, необходимо применить операцию с несколькими кубитами, которая является операцией, которая действует на обоих кубитах одновременно. Операция Controlled-NOT или CNOT — это операция с несколькими кубитами, которая помогает создать квантовую запутанность.
Операция CNOT принимает два кубита в качестве входных данных. Одним из кубитов является контрольный кубит, а другой кубит является target кубитом. Если кубит элемента управления находится в $\ket{1}$ состоянии, операция CNOT перевернет состояние target кубита. В противном случае CNOT ничего не делает.
Например, в следующих двухкубитных состояниях, контрольный кубит является самым левым, а target кубит является самым правым.
Входные данные CNOT |
Выходные данные из CNOT |
|---|---|
| $\ket{00}$ | $\ket{00}$ |
| $\ket{01}$ | $\ket{01}$ |
| $\ket{10}$ | $\ket{11}$ |
| $\ket{11}$ | $\ket{10}$ |
В Q# операция CNOT действует на массив двух кубитов, и она инвертирует второй кубит только в том случае, если первый кубит имеет значение One.
Запутание с операциями Hadamard и CNOT
Предположим, что у вас есть двухкубитная система в состоянии $\ket{00}$. В этом состоянии кубиты не запутаны. Чтобы привести эти кубиты в состояние Бэлла $\ket{\phi^+}=\frac1{\sqrt2}(\ket{00}+\ket{11})$, примените операции Адамара и CNOT.
Вот как это работает:
Выберите один кубит в состоянии c, чтобы быть управляющим кубитом, и другой кубит, чтобы быть target кубитом. Здесь мы выбираем самый левый кубит в качестве управляющего и самый правый кубит в качестве target.
Поместите только кубит элемента управления в равное состояние суперпозиции. Для этого примените операцию H только к кубитам элемента управления:
$$H \ket{0_c} = \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c})$$
Замечание
Индексы ${}_c$ и ${}_t$ обозначают управляющий и target кубиты, соответственно.
Примените операцию CNOT к паре кубитов. Помните, что кубит элемента управления находится в состоянии суперпозиции, а target кубит находится в $\ket{0_t}$ состоянии.
Состояние $\frac{1}{\sqrt2}(\ket{0_c 0_t}+\ket{1_c 1_t})$ запутано. Это конкретное запутанное состояние является одним из четырех состояний Bell, $\ket{\phi^{+}}$.
Замечание
В квантовых вычислениях операции часто называются шлюзами. Например, ворота H и ворота CNOT.
Создайте квантовую запутанность в Q#
Чтобы создать состояние Bell с Q# кодом, выполните следующие действия в Visual Studio Code (VS Code):
- Откройте VS Code.
- Откройте меню "Файл " и выберите "Создать текстовый файл ", чтобы создать новый файл.
- Сохраните файл как Main.qs.
Создание состояния Белла
Чтобы создать Беллово состояние $\ket{\phi^+}$ в Q#, выполните следующие действия.
Импортируйте
Std.Diagnosticsпространство имен из стандартной Q# библиотеки, чтобы использовать функциюDumpMachine. Эта функция отображает сведения о состояниях кубитов при вызове функции в коде. Чтобы импортировать пространство имен, скопируйте следующий Q# код в файл Main.qs :import Std.Diagnostics.*;MainСоздайте операцию, возвращающую дваResultзначения типа, которые являются результатами измерения кубитов.import Std.Diagnostics.*; operation Main() : (Result, Result) { // Your code goes here }Внутри операции
Mainвыделите два кубита,q1иq2, которые будут запутаны.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); }Примените гейт Хадамара,
H, к управляющему кубитуq1. Это помещает только этот кубит в состояние суперпозиции. Затем примените ворота CNOT,CNOTк обоим кубитам для запутывания двух кубитов. Первый аргументCNOTявляется управляющим кубитом, а второй аргумент — кубитом target.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); }Используйте функцию
DumpMachineдля отображения состояния кубитов после их запутания. Обратите внимание, чтоDumpMachineне выполняет измерение на кубитах, поэтомуDumpMachineне влияет на состояния кубитов.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); DumpMachine(); }Используйте операцию
Mдля измерения кубитов и сохранения результатов вm1иm2. Затем используйтеResetоперацию для сброса кубитов.import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); DumpMachine(); let (m1, m2) = (M(q1), M(q2)); Reset(q1); Reset(q2); }Возвращает результаты измерения кубитов с помощью инструкции
return. Ниже приведена окончательная программа в файле Main.qs :import Std.Diagnostics.*; operation Main() : (Result, Result) { use (q1, q2) = (Qubit(), Qubit()); H(q1); CNOT(q1, q2); DumpMachine(); let (m1, m2) = (M(q1), M(q2)); Reset(q1); Reset(q2); return (m1, m2); }Чтобы запустить программу на встроенном симуляторе, выберите линзу выполнения кода над
Mainоперацией или нажмите CTRL+F5. Выходные данные отображаются в консоли отладки.Результаты измерения коррелируются, поэтому в конце программы вы получаете результат
(Zero, Zero)или(One, One)с равной вероятностью. Повторно запустите программу несколько раз и просмотрите выходные данные, чтобы убедить себя в корреляции.Чтобы визуализировать схему, выберите линзу кода схема над операцией
Main. Схема показывает врата Адамара, примененные к первому кубиту, и врата CNOT, примененные к обоим кубитам.
Создание других состояний Колокола
Чтобы создать другие состояния Белла, примените дополнительные операции Паули $X$ или $Z$ к кубитам.
Например, чтобы создать Беллово состояние $\ket{\phi^-}=\frac1{\sqrt2}(\ket{00}-\ket{11})$, примените операцию Паули $Z$ к кубиту управления после применения ворот Адамара, но перед применением CNOT. Операция $Z$ изменяет состояние с $\ket{+}$ на $\ket{-}$.
Замечание
Состояния $\frac{1}{\sqrt{2}}(\ket{0}+\ket{1})$ и $\frac{1}{\sqrt{2}}(\ket{0} - \ket{1})$ также известны как $\ket{+}$ и $\ket{-}$соответственно.
Ниже показано, как создать $\ket{\phi^-}$ состояние:
Создайте два кубита в состоянии $\ket{00}$.
Поместите кубит элемента управления в состояние суперпозиции $H$ с помощью операции:
$$H \ket{0_c} = \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c}) = \ket{+_c}$$
$Z$ Примените операцию к кубите элемента управления.
$$Z \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c}) = \frac{1}{\sqrt{2}}(\ket{0_c} - \ket{1_c}) = \ket{-_c}$$
Примените операцию CNOT к кубиту управления и кубиту target, который находится в состоянии $\ket{0_t}$.
Чтобы создать состояние $\ket{\phi^-}$Q#Bell, замените код в вашем Main.qs на следующий код:
import Std.Diagnostics.*;
operation Main() : (Result, Result) {
use (q1, q2) = (Qubit(), Qubit());
H(q1);
Z(q1); // Apply the Pauli Z operation to the control qubit
CNOT(q1, q2);
DumpMachine();
let (m1, m2) = (M(q1), M(q2));
Reset(q1);
Reset(q2);
return (m1, m2);
}
Аналогичным образом можно создать состояния Белла $\ket{\psi^+}$ and $\ket{\psi^-}$, применяя операции Паули $X$ и $Z$ к кубитам.
- Чтобы создать состояние $\ket{\psi^+}=\frac1{\sqrt2}(\ket{01}+\ket{10})$Колокола, примените оператор Паули $X$ к target кубиту после того, как примените оператор Адамара к управляющему кубиту. Затем примените гейт CNOT.
- Чтобы создать состояние $\ket{\psi^-}=\frac1{\sqrt2}(\ket{01}-\ket{10})$ Белла, примените оператор Паули $Z$ к кубиту управления и оператор Паули $X$ к кубиту target, после того как вы примените ворота Адамара (Hadamard) к кубиту управления. Затем примените гейт CNOT.
В следующем уроке вы узнаете, как использовать запутанность для отправки квантовой информации, процесса, известного как квантовое телепортирование.