你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:创建第一个 Q# 程序

了解如何编写一个演示纠缠的基本 Q# 程序,这是量子计算的关键概念。

当两个或多个 量子比特 纠缠时,它们共享量子信息,这意味着一个量子比特发生的情况也会发生在另一个量子比特身上。 在本快速入门中,你将创建一个名为 Bell 对的特定双量子位纠缠状态。 在 Bell 对中,如果在状态中 $\ket{0}$ 测量了一个量子位,则你知道另一个量子位也处于 $\ket{0}$ 状态而不测量它。 有关详细信息,请参阅 Quantum 纠缠

在本快速入门中,请执行以下操作:

  • 创建 Q# 文件。
  • 分配一对量子比特。
  • 纠缠量子比特。

先决条件

创建 Q# 文件

  1. 打开 Visual Studio Code。
  2. 选择“文件>新建文本文件”。
  3. 将文件另存为 Entanglement.qs。 .qs 扩展表示 Q# 程序。

Q#编写代码

Entanglement.qs在文件中,按照以下步骤纠缠并测量一对量子比特。

定义一个命名空间

每个 Q# 程序都以用户定义的命名空间开头,这有助于组织相关功能。 对于本快速入门,命名空间为 BellPair

namespace BellPair {
    // Your code goes here.
}

打开量子库

QDK 包括 Q# 标准库,其中包含量子程序的预定义函数和操作。 若要使用它们,必须先打开相关库。

BellPair在命名空间中,使用open语句导入Microsoft.Quantum.Diagnostics库。 这使你可以访问其所有函数和操作,包括 DumpMachine()稍后用于显示纠缠状态。

    open Microsoft.Quantum.Diagnostics;

定义操作

打开相关库后,定义量子操作及其输入和输出值。 在本快速入门中,操作为 EntangleQubits. 这是你将编写剩余 Q# 代码来分配、操作和测量两个量子比特的位置。

EntangleQubits 不采用任何参数并返回两 Result 个值, Zero 或者 One,表示量子比特度量的结果:

    operation EntangleQubits() : (Result, Result) {
        // Your entanglement code goes here.
}

分配两个量子位

EntangleQubits 操作当前为空,因此下一步是分配两个量子比特, q1 以及 q2。 在中 Q#,使用 use 关键字分配量子比特:

        // Allocate two qubits, q1 and q2, in the 0 state.
        use (q1, q2) = (Qubit(), Qubit());

注意

在中 Q#,量子比特始终以 $\ket{0}$ 状态分配。

将一个量子位放入叠加

量子比特 q1q2 处于 $\ket{0}$ 状态。 若要为纠缠准备量子比特,必须将其中一个量子位置于均匀叠加中,其中 50% 的机会被测量为 $\ket{0}$ 或 $\ket{1}$。

通过应用 Hadamard, H操作将量子位置于叠加中:

        // Put q1 into an even superposition.
        H(q1);

生成的状态q1为{1}{\sqrt{2}}$\frac{ (\ket{{0}+\ket{1}),$这是甚至叠加$\ket{0}$和 $\ket{{1}$。

纠缠量子比特

现在,你已准备好使用受控的 NOT 操作 CNOT纠缠量子比特。 CNOT 是一个控制操作,它采用两个量子比特,一个作为控件,另一个作为目标。

在本快速入门中,你将设置为 q1 控制量子比特和 q2 目标量子比特。 这意味着 CNOT 翻转处于状态时的状态 q2 q1 $\ket{1}$。

        // Entangle q1 and q2, making q2 depend on q1.
        CNOT(q1, q2);

这两个量子比特的结果状态是 Bell 对 $\frac{{1}{\sqrt{2}}(\ket{00}+\ket{{11})$ 。

提示

如果要了解 Hadamard 和 CNOT 操作如何转换量子比特的状态,请参阅 使用量子运算创建纠缠。

显示纠缠状态

在测量量子比特之前,请务必验证以前的代码是否成功纠缠它们。 可以使用 DumpMachine 该操作(库的 Microsoft.Quantum.Diagnostics 一部分)输出程序的当前状态 Q# :

        // Show the entangled state of the qubits.
        DumpMachine();

测量量子比特

验证量子比特纠缠后,可以使用 M 该操作来测量它们。 测量q1q2折叠其量子状态甚至ZeroOne概率。

在中 Q#,使用 let 关键字声明新变量。 若要存储和 q2q1度量结果,请分别声明变量m1m2

        // Measure q1 and q2 and store the results in m1 and m2.
        let (m1, m2) = (M(q1), M(q2));

重置量子比特

在每个程序结束时 Q# 发布之前,量子比特必须处于 $\ket{0}$ 状态。 使用 Reset 操作执行此操作:

        // Reset q1 and q2 to the 0 state.
        Reset(q1);
        Reset(q2);

返回度量结果

最后,若要完成EntangleQubits操作并观察纠缠状态,请返回度量结果和m1m2

        // Return the measurement results.
        return (m1, m2);

提示

若要了解有关函数或操作的详细信息 Q# ,请将鼠标悬停在函数或操作上。

将“H”操作悬停在 Visual Studio Code 中时显示的详细信息的屏幕截图。

Q#运行代码

祝贺你! 你编写了一个纠缠两个 Q# 量子比特并创建一个 Bell 对的程序。 在运行程序之前,请使用 @EntryPoint() 属性告知 Q# 编译器开始执行程序的位置。 每个 Q# 程序必须包含一个 @EntryPoint()。 在本例中EntangleQubits,放在@EntryPoint()操作之前。

最终 Q# 程序应如下所示:

namespace BellPair {
    open Microsoft.Quantum.Diagnostics;
        
    @EntryPoint()
    operation EntangleQubits() : (Result, Result) {  
        // Allocate two qubits, q1 and q2, in the 0 state.
        use (q1, q2) = (Qubit(), Qubit());

        // Put q1 into an even superposition.
        // It now has a 50% chance of being measured as 0 or 1.
        H(q1);

        // Entangle q1 and q2, making q2 depend on q1.
        CNOT(q1, q2);

        // Show the entangled state of the qubits.
        DumpMachine();

        // Measure q1 and q2 and store the results in m1 and m2.
        let (m1, m2) = (M(q1), M(q2));

        // Reset q1 and q2 to the 0 state.
        Reset(q1);
        Reset(q2);

        // Return the measurement results.
        return (m1, m2);
    }
}

若要运行程序并查看这两个量子比特的结果,请选择“运行”或按 Ctrl+F5@EntryPoint()

Q# Visual Studio Code 中文件的屏幕截图,其中显示了“运行”命令的位置。

可以多次运行程序,每个程序在调试控制台中都有不同的结果。 这演示了量子测量的概率性质和量子比特的纠缠。

例如,如果结果是 Zero,调试控制台应如下所示:

DumpMachine:

 Basis | Amplitude      | Probability | Phase
 -----------------------------------------------
  |00⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000
  |11⟩ |  0.7071+0.0000𝑖 |    50.0000% |   0.0000

Result: "(Zero, Zero)"

下一步

若要了解有关量子纠缠 Q#的详细信息,请参阅 教程:使用 探索量子纠缠 Q#。 本教程扩展了本快速入门中介绍的概念,并帮助你编写更高级的纠缠程序。