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# 提供了许多你可能已经熟悉的内置类型,包括 Int
、Double
、Bool
和 String
。 Q# 还提供特定于量子计算的类型,例如 Qubit
和 Result
。
在此示例中,MeasureOneQubit
操作返回一个 Result
类型。 Result
类型是测量量子比特的结果,可以是 One
或 Zero
中的任意一个。
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 基(可以是 PauliX
、PauliY
或 PauliZ
)中执行对一个或多个量子比特的联合测量。 Measure
操作返回一个 Result
类型,即 One
或 Zero
。
若要在计算基 $\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);