Упражнение. Создание квантовой запутанности с помощью 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.

Вот как это работает:

  1. Выберите один кубит в состоянии c, чтобы быть управляющим кубитом, и другой кубит, чтобы быть target кубитом. Здесь мы выбираем самый левый кубит в качестве управляющего и самый правый кубит в качестве target.

  2. Поместите только кубит элемента управления в равное состояние суперпозиции. Для этого примените операцию H только к кубитам элемента управления:

    $$H \ket{0_c} = \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c})$$

    Замечание

    Индексы ${}_c$ и ${}_t$ обозначают управляющий и target кубиты, соответственно.

  3. Примените операцию CNOT к паре кубитов. Помните, что кубит элемента управления находится в состоянии суперпозиции, а target кубит находится в $\ket{0_t}$ состоянии.

Снимок экрана: пошаговое приложение шлюза CNOT к паре кубитов.

Состояние $\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):

  1. Откройте VS Code.
  2. Откройте меню "Файл " и выберите "Создать текстовый файл ", чтобы создать новый файл.
  3. Сохраните файл как Main.qs.

Создание состояния Белла

Чтобы создать Беллово состояние $\ket{\phi^+}$ в Q#, выполните следующие действия.

  1. Импортируйте Std.Diagnostics пространство имен из стандартной Q# библиотеки, чтобы использовать функцию DumpMachine . Эта функция отображает сведения о состояниях кубитов при вызове функции в коде. Чтобы импортировать пространство имен, скопируйте следующий Q# код в файл Main.qs :

    import Std.Diagnostics.*;
    
  2. Main Создайте операцию, возвращающую два Result значения типа, которые являются результатами измерения кубитов.

    import Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        // Your code goes here
    }
    
  3. Внутри операции Main выделите два кубита, q1 и q2, которые будут запутаны.

    import Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    }
    
  4. Примените гейт Хадамара, H, к управляющему кубитуq1. Это помещает только этот кубит в состояние суперпозиции. Затем примените ворота CNOT, CNOT к обоим кубитам для запутывания двух кубитов. Первый аргумент CNOT является управляющим кубитом, а второй аргумент — кубитом target.

    import Std.Diagnostics.*; 
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    
        H(q1);
        CNOT(q1, q2);
    }
    
  5. Используйте функцию DumpMachine для отображения состояния кубитов после их запутания. Обратите внимание, что DumpMachine не выполняет измерение на кубитах, поэтому DumpMachine не влияет на состояния кубитов.

    import Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    
        H(q1);
        CNOT(q1, q2);
    
        DumpMachine();
    }
    
  6. Используйте операцию 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);
    
    }
    
  7. Возвращает результаты измерения кубитов с помощью инструкции 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);
    }
    
  8. Чтобы запустить программу на встроенном симуляторе, выберите линзу выполнения кода над Main операцией или нажмите CTRL+F5. Выходные данные отображаются в консоли отладки.

  9. Результаты измерения коррелируются, поэтому в конце программы вы получаете результат (Zero, Zero) или (One, One) с равной вероятностью. Повторно запустите программу несколько раз и просмотрите выходные данные, чтобы убедить себя в корреляции.

  10. Чтобы визуализировать схему, выберите линзу кода схема над операцией 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^-}$ состояние:

  1. Создайте два кубита в состоянии $\ket{00}$.

  2. Поместите кубит элемента управления в состояние суперпозиции $H$ с помощью операции:

    $$H \ket{0_c} = \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c}) = \ket{+_c}$$

  3. $Z$ Примените операцию к кубите элемента управления.

    $$Z \frac{1}{\sqrt{2}}(\ket{0_c} + \ket{1_c}) = \frac{1}{\sqrt{2}}(\ket{0_c} - \ket{1_c}) = \ket{-_c}$$

  4. Примените операцию CNOT к кубиту управления и кубиту target, который находится в состоянии $\ket{0_t}$.

    Снимок экрана показывает алгебраическое выведение применения гейта CNOT к кубиту управления в суперпозиции.

Чтобы создать состояние $\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.

В следующем уроке вы узнаете, как использовать запутанность для отправки квантовой информации, процесса, известного как квантовое телепортирование.