Q# 项目的主要组件是什么?

已完成

开始编写量子程序之前,请务必了解 Q# 程序的结构和组成。

在本单元中,你将查看 Q# 程序的主要组成部分。

Main 操作

每个 Q# 程序必须至少包含一个操作,这通常是 Main 操作。 Main 操作是程序的入口点。 默认情况下,Q# 编译器从 Main() 操作开始执行程序。 (可选)可以使用 @EntryPoint() 特性将程序中的任何操作指定为执行点。

例如,以下代码定义了入口点操作 MeasureOneQubit

@EntryPoint()
operation MeasureOneQubit() : Result {
    ...
}

但是,也可以通过将 MeasureOneQubit() 操作重命名为 Main() 以在不使用 @EntryPoint() 特性的情况下编写该代码:

// The Q# compiler automatically detects the Main() operation as the entry point. 
operation Main() : Result {
    ...
}

类型

Q# 提供了许多你可能已经熟悉的内置类型,包括 IntDoubleBoolString。 Q# 还提供特定于量子计算的类型,例如 QubitResult

在此示例中,MeasureOneQubit 操作返回一个 Result 类型。 Result 类型是测量量子比特的结果,可以是 OneZero 中的任意一个。

operation MeasureOneQubit() : Result {
    ...
}

量子库

Q# 库包含可在量子程序中使用的函数和操作。 从库中调用函数或操作时,需要使用 import 指令并指定库的命名空间。 例如,若要使用标准量子库中 Microsoft.Quantum.Intrinsic 命名空间中的函数 Message,请执行以下操作:

// imports all functions and operations from Microsoft.Quantum.Intrinsic 
import Microsoft.Quantum.Intrinsic.*;
    Message("Hello quantum world!");


// imports just the `Message` function from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.Message;
    Message("Hello quantum world!");

可以使用 Std 而不是 Microsoft.Quantum 来导入标准库中的命名空间。 例如:

// imports all functions and operations from Microsoft.Quantum.Intrinsic == Std.Intrinsic
import Std.Intrinsic.*;
    Message("Hello quantum world!");

分配量子位

在 Q# 中,若要分配量子比特,请使用 use 关键字和 Qubit 类型。 使用 use 关键字分配的每个量子比特最初都为 $\ket{0}$ 状态。

可以一次分配一个或多个量子位。 下面的示例分配了 1 个和 5 个量子比特:

use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits

测量量子比特

在 Q# 中,Measure 操作在指定的 Pauli 基(可以是 PauliXPauliYPauliZ)中执行对一个或多个量子比特的联合测量。 Measure 操作返回一个 Result 类型,即 OneZero

若要在计算基 $\lbrace\ket{0},\ket{1}\rbrace$ 中实现测量,还可使用 M 操作,该操作在 Pauli Z 基中执行测量。 因此,M 操作等效于应用 Measure([PauliZ], [qubit])

重置量子比特

在 Q# 中,量子比特在释放时必须处于 $\ket{0}$ 状态。 完成使用量子比特后,可以使用 Reset 操作将量子比特重置为 $\ket{0}$。

    // Reset the qubit so it can be safely released.
    Reset(qubit);