Создание квантовой запутанности с помощью Q#

Завершено

В предыдущем уроке вы узнали о концепции квантового запутания и состояния Колокола.

Теперь создадим квантовое запутание с помощью Q# и Azure Quantum Development Kit. Чтобы создать запутанность, необходимо применить две квантовые операции: ворота Hadamard и ворота Controled-NOT (CNOT).

Операция "Управляемое НЕ" (CNOT)

Если два кубита запутаны, состояние одного кубита зависит от состояния другого кубита. Поэтому для запутанного двух кубитов требуется операция, которая действует на обоих кубитах одновременно. Это называется многоквибитной операцией.

Чтобы создать квантовую запутанность, требуется многоквибитная CNOT операция, которая обозначает controled-NOT. Эта операция принимает два кубита в качестве входных данных, один выступает в качестве кубита управления, а другой — target кубитом. Операция CNOT перевернута состояние второго кубита ( target кубита), если, и только если состояние первого кубита (кубита управления) равно $|1\rangle$.

Входные данные Выходные данные
$\ket{00}$ $\ket{00}$
$\ket{01}$ $\ket{01}$
$\ket{10}$ $\ket{11}$
$\ket{11}$ $\ket{10}$

В Q#операции CNOT выполняется операция на массиве двух кубитов, и она перевернута второй кубитов, если первый кубит имеет значение One.

Запутание с операцией CNOT

Применив hadamard, операцию и контролируемый не, CNOTоперацию, можно преобразовать два кубита в состоянии $|00\rangle$ в состояние $\ket{\phiBell ^+}=\frac1{\sqrt2}(|00\rangle+|11\rangle).$H

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

  1. Возьмите два кубита в состоянии $|00\rangle$. Первый кубит является кубитом управления, а второй кубит — target кубитом.

  2. Создайте состояние суперпозиции только в кубите элемента управления, применяя $H$.

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

    Примечание.

    Подстроки ${}_c и ${}_t$$ указать элемент управления и target кубиты.

  3. $Примените оператор CNOT$ к кубите управления, который находится в состоянии суперпозиции, а target также кубит, который находится в $|состоянии 0_t\rangle$.

    $$CNOT \frac{1}{\sqrt{2}}(\ket{0_c+\ket{1_c)\ket{0}_t}= CNOT \frac{1}{\sqrt2}(\ket{0_c 0_t}+|\ket{1_c 0_t}})2(CNOT 0_c 0_t + CNOT \ket{\ket{1_c 0_t}})$$$$$$=$$=\frac{1}{\sqrt{1}{\sqrt=\frac{=2}}(\ket{0_c 0_t+\ket{1_c 1_t)}}$$

Создание файла Q#

  1. Откройте Visual Studio Code.
  2. > Выберите новый текстовый файл и сохраните его в качестве Main.qs.
  3. Выберите представление —> палитра команд и типQ#: задайте профиль QIR target Azure Quantum. Нажмите ВВОД.
  4. Выберите Q#: Неограниченно.

Создание и измерение состояния $\ket{\phiBell ^+}$

Начнем с создания состояния $\ket{\phiBell ^+}=\frac1{\sqrt2}(|00\rangle+|11\rangle)$.

Создание состояния $\ket{\phiКолокола ^+}$ в Q#

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

    import Microsoft.Quantum.Diagnostics.*; // Aka Std.Diagnostics.*;
    

    Совет

    Вы также можете импортировать стандартную библиотеку, заменив Microsoft.Quantum ее Std. Например, выражение import Std.Diagnostics.* будет эквивалентно import Microsoft.Quantum.Diagnostics.*.

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

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

    import Microsoft.Quantum.Diagnostics.*; // Aka Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    }
    
  4. Примените ворота Hadamard, Hк первому кубитам, q1чтобы поместить его в состояние суперпозиции. Затем перепутает два кубита с помощью CNOT операции.

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

    import Microsoft.Quantum.Diagnostics.*; // Aka Std.Diagnostics.*;
    
    operation Main() : (Result, Result) {
        use (q1, q2) = (Qubit(), Qubit());
    
        H(q1);
        CNOT(q1, q2);
    
        DumpMachine();
    }
    
  6. Измеряйте кубиты с помощью M операции и сохраняйте результаты и m1 m2. Затем используйте Reset операцию для сброса кубитов. В Q#этом случае необходимо всегда сбрасывать кубиты в $|состояние 0\rangle$ .

    import Microsoft.Quantum.Diagnostics.*; // Aka 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 Microsoft.Quantum.Diagnostics.*; // Aka 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);
    }
    

Запуск программы

  1. Чтобы запустить программу на встроенном симуляторе, нажмите кнопку "Выполнить над Main операцией" или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.

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

  3. Вы можете визуализировать схему каналов, щелкнув канал из списка команд над операциейMain. Схема схемы показывает ворота Hadamard, примененные к первому кубитам, и ворота CNOT, примененные к обоим кубитам.

    Снимок экрана: канал состояния Колокола.

Создание и измерение состояния $\ket{\phiBell ^-}$

Чтобы создать другие состояния Колокола, необходимо применить дополнительные операции Паули $X$ и $Z$ к кубитам.

Например, чтобы создать состояние $\ket{\phiBell ^-}=\frac1 2}(|00-11\rangle\rangle{\sqrt|),$ можно применить операцию Pauli $Z$ к кубите управления после применения шлюза Hadamard. Операция $Z$ перевернет состояние $\ket{+}$ на $\ket{-}$.

Примечание.

Состояния $\frac{{1}{\sqrt{2}}(|0\rangle+|1\rangle)$ и $\frac{1}{\sqrt{{2}}(|0\rangle –|1\rangle)$ также известны как $\ket{+}$ и $\ket{{-}$соответственно.

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

  1. Возьмите два кубита в состоянии $|00\rangle$.

  2. Создайте состояние суперпозиции только в кубите элемента управления, применяя $H$.

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

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

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

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

    $$\frac{1}{\sqrt{2}}CNOT (\ket{0_c-1_c\ket{})\ket{0}_t =}CNOT \frac{1}{\sqrt2}(\ket{0_c 0_t-1_c 0_t}}|\ket{)2(CNOT 0_c 0_t} - CNOT \ket{\ket{1_c 0_t})==\frac{=$$$$=\frac{1}{\sqrt{1}{\sqrt$$$$2}}(\ket{0_c 0_t-1_c 1_t)}\ket{}$$

Создание состояния $\ket{\phiBell ^-}$ in Q#

  1. Измените Q# код, чтобы создать состояние $\ket{\phiBell ^-}$. Файл Main.qs должен выглядеть следующим образом:

    import Microsoft.Quantum.Diagnostics.*; // Aka 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);
    }
    
  2. Чтобы запустить программу на встроенном симуляторе, нажмите кнопку "Выполнить над Main операцией" или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.

  3. Вы можете визуализировать схему каналов, щелкнув канал из списка команд над операциейMain. Схема схемы показывает ворота Hadamard, примененные к первому кубитам, ворота Паули $Z$ , примененные к первому кубитам, и ворота CNOT, примененные к обоим кубитам.

Бонусное упражнение: создание состояний $\ket{\psiКолокола ^+}$ и $\ket{\psi^-}$

Аналогичным образом можно создать состояния $\ket{\psiBell ^+}$ и $\ket{\psi^-}$ путем применения операций Паули $X$ и $Z$ к кубитам.

  • Состояние $\ket{\psiКолокола ^+}=\frac1 2}(|01\rangle{\sqrt+|10\rangle)$ можно создать, применив операцию Паули $X$ к target кубите после применения ворота Hadamard.
  • Состояние $\ket{\psiКолокола ^-}=\frac1{\sqrt2}(|01-10\rangle\rangle|)$ можно создать, применив Поли $Z$ к кубите управления и Поли $X$ к target кубите после применения ворота Hadamard.

Измените программу Main.qs , чтобы создать состояния $\ket{\psiBell ^+}$ и $\ket{\psi^-}$.