使用 Q# 创建量子纠缠

已完成

现在,让我们使用 Q# 和 Azure Quantum Development Kit 创建一些量子纠缠。

受控非 (CNOT) 运算

当两个量子比特纠缠时,一个量子比特的状态取决于另一个量子比特的状态。 因此,若要纠缠两个量子比特,需要提供一个同时作用于两个量子比特的运算。 这称为“多量子比特运算或门”

若要创建量子纠缠,需要提供多量子比特 CNOT 运算(表示受控非)。 此运算采用两个量子比特作为输入,一个充当控制量子比特,另一个是 target 量子比特。 当且仅当第一个量子比特(控制量子比特)的状态为 $|1\rangle$ 时,CNOT 门才会翻转第二个量子比特(target 量子比特)的状态。

输入 输出
$\ket{00}$ $\ket{00}$
$\ket{01}$ $\ket{01}$
$\ket{10}$ $\ket{11}$
$\ket{11}$ $\ket{10}$

在 Q# 中,CNOT 运算作用于两个量子比特的数组,如果第一个量子比特为 One,则它会翻转第二个量子比特。

与 CNOT 运算的纠缠

通过应用 H 运算和 CNOT 运算,可以将状态 $|00\rangle$ 的两个量子比特转换为贝尔状态 $\ket{\phi^+}=\frac1{\sqrt2}(|00\rangle+|11\rangle)$。

以下是其工作原理:

  1. 取状态为 $|00\rangle$ 的两个量子比特。 第一个量子比特是控制量子比特,第二个量子比特是 target 量子比特。

  2. 通过应用 $H$ 来仅在控制量子比特中创建叠加状态。

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

    注意

    下标 ${}_c$ 和 ${}_t$ 指定控制和 target 量子比特。

  3. 将 $CNOT$ 运算符应用于处于叠加状态的控制量子比特和处于状态 $|0_t\rangle$ 的 target 量子比特。

    $$ 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})=$$$$=\frac{{1}{\sqrt2}(CNOT \ket{0_c 0_t} + CNOT \ket{1_c 0_t})=$$$$=\frac{1}{\sqrt2}(\ket{0_c 0_t}+\ket{1_c 1_t})$$

使用 Q# 创建并度量贝尔状态

  1. 打开 Visual Studio Code。
  2. 选择“文件”>“新建文本文件”并将其另存为 Entanglement.qs
  3. 选择“视图”->“命令面板”并键入“Q#:设置 Azure Quantum QIR target 配置文件”。 按 Enter
  4. 选择“Q#:无限制”。

创建贝尔状态 $\ket{\phi^+}$

我们首先创建贝尔状态 $\ket{\phi^+}=\frac1{\sqrt2}(|00\rangle+|11\rangle)$。

  1. 将以下 Q# 代码复制并粘贴到 Entanglement.qs 文件中。

    namespace Entanglement {
        open Microsoft.Quantum.Diagnostics;
    
        @EntryPoint()
        operation EntangleQubits() : (Result, Result) {
            // Allocate the two qubits that will be entangled.
            use (q1, q2) = (Qubit(), Qubit());
    
            // Set the first qubit in superposition by calling the `H` operation,
            // which applies a Hadamard transformation to the qubit.
            // Then, entangle the two qubits using the `CNOT` operation.
            H(q1);
            CNOT(q1, q2);
    
            // Show the entangled state using the `DumpMachine` function.
            DumpMachine();
    
            // Measurements of entangled qubits are always correlated.
            let (m1, m2) = (M(q1), M(q2));
            Reset(q1);
            Reset(q2);
            return (m1, m2);
        }
    }
    
  2. 若要在内置模拟器本地运行程序,请在 下面的命令列表中单击“运行”,或按 Ctrl+F5@EntryPoint()。 输出会显示在调试控制台中。

    VS Code 的屏幕截图,其中显示了如何使用输入点下方的 codelens 运行 Q# 文件。

  3. 度量结果是相关的,因此在程序结束时,你将收到概率相同的 (Zero, Zero)(One, One) 结果。

  4. 可以通过在 @EntryPoint() 下面的命令列表中单击“线路”来可视化线路图。 线路图显示了应用于第一个量子比特的阿达马门和应用于两个量子比特的 CNOT 门。

    贝尔状态线路的屏幕截图。

创建贝尔状态 $\ket{\phi^-}$

若要创建其他贝尔状态,需要对量子比特应用额外的泡利 $X$ 和 $Z$ 运算。

例如,若要创建贝尔状态 $\ket{\phi^-}=\frac1{\sqrt2}(|00\rangle-|11\rangle)$,可以在应用阿达马门后对控制量子比特应用泡利 $Z$ 运算。 $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\rangle=\frac{{1}{\sqrt{2}}(|0_c\rangle+|1_c\rangle) =\ket{+}_c$$

  3. 对控制量子比特应用 $Z$ 运算。

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

  4. 对控制量子比特和处于 $|0_t\rangle$ 状态的 target 量子比特应用 $CNOT$ 运算符。

    $$ 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})=$$$$=\frac{{1}{\sqrt2}(CNOT \ket{0_c 0_t} - CNOT \ket{1_c 0_t})=$$$$=\frac{1}{\sqrt2}(\ket{0_c 0_t}-\ket{1_c 1_t})$$

修改 Q# 代码以创建贝尔状态 $\ket{\phi^-}$。 运行程序以查看纠缠状态和线路图。

namespace Entanglement {
    open Microsoft.Quantum.Diagnostics;

    @EntryPoint()
    operation EntangleQubits() : (Result, Result) {
        // Allocate the two qubits that will be entangled.
        use (q1, q2) = (Qubit(), Qubit());

        // Set the first qubit in superposition by calling the `H` operation,
        // which applies a Hadamard transformation to the qubit.
        // Then, entangle the two qubits using the `CNOT` operation.
        H(q1);
        Z(q1); // Apply the Pauli Z operation to the control qubit
        CNOT(q1, q2);

        // Show the entangled state using the `DumpMachine` function.
        DumpMachine();

        // Measurements of entangled qubits are always correlated.
        let (m1, m2) = (M(q1), M(q2));
        Reset(q1);
        Reset(q2);
        return (m1, m2);
    }
}

附加练习:创建贝尔状态 $\ket{\psi^+}$ 和 $\ket{\psi^-}$

同样,可以通过对量子比特应用泡利 $X$ 和 $Z$ 运算来创建贝尔状态 $\ket{\psi^+}$ 和 $\ket{\psi^-}$。

  • 在应用阿达马门后,可以通过对 target 量子比特应用泡利 $X$ 运算来创建贝尔状态 $\ket{\psi^+}=\frac1{\sqrt2}(|01\rangle+|10\rangle)$。
  • 在应用阿达马门后,可以通过对控制量子比特应用泡利 $Z$ 运算,对 target 量子比特应用泡利 $X$ 运算,来创建贝尔状态 $\ket{\psi^-}=\frac1{\sqrt2}(|01\rangle-|10\rangle)$。

修改 Entanglement.qs 程序以创建贝尔状态 $\ket{\psi^+}$ 和 $\ket{\psi^-}$