通过


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

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

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

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

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

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

先决条件

创建 Q# 文件

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

编写您的Q#代码

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

导入量子库

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

在程序中,使用 import 语句打开 Std.Diagnostics 库。 这使你可以访问库的所有函数和操作,包括用于稍后显示纠缠状态的DumpMachine

import Std.Diagnostics.*;

定义操作

导入相关库后,定义量子操作及其输入和输出值。 在本快速入门中,操作为 Main. 这是用于编写剩余 Q# 代码以分配、操作和测量两个量子比特的部分。

Main 不采用任何参数并返回两 Result 个值, ZeroOne返回表示量子位度量结果的值:

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

分配两个量子位

Main 操作当前为空,因此下一步是分配两个量子比特, 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}$。

通过应用HadamardH操作,你将量子比特置于叠加状态:

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

生成的状态q1为$\frac{{1}{\sqrt{2}}(\ket{{0}+\ket{1})$,即$\ket{0}$和$\ket{{1}$的均匀叠加。

纠缠量子比特

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

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

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

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

提示

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

显示纠缠状态

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

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

测量量子比特

验证量子比特纠缠后,可以使用 M 该操作来测量它们。 测量q1q2会将它们的量子状态折叠为ZeroOne,且具有相等的概率。

在中 Q#,使用 let 关键字声明新变量。 若要存储和 q1q2度量结果,请分别声明变量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);

返回度量结果

最后,若要完成 Main 操作并观察纠缠状态,请返回 m1m2 的测量结果。

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

提示

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

运行Q#代码

祝贺你! 你编写了一个纠缠两个 Q# 量子比特并创建一个 Bell 对的程序。

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

import Std.Diagnostics.*;

operation Main() : (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

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#探索量子纠缠。 本教程扩展了本快速入门中介绍的概念,并帮助你编写更高级的纠缠程序。