Q# 项目的主要组件是什么?
在编写自己的量子程序之前,请务必了解 Q# 编程语言的结构和组件。
在本单元中,你将了解 Q# 程序的基本组件。
Main 操作
每个 Q# 程序必须至少包含一个操作。 Q# 编译器从入口点操作开始运行程序,默认情况下是 Main 操作。 例如,以下 Q# 程序包含一个调用 Main 的作,该作将创建量子比特并返回量子比特状态的度量值:
// This operation is the entry point to your program because it's name is Main
operation Main() : Result {
use q = Qubit();
return M(q);
}
没有入口点操作,Q# 代码无法运行。 如果要使用一个操作而不是 Main 作为入口点,请使用 @EntryPoint() 属性。 例如,下面的代码为前面的作提供了一个更具描述性的名称, MeasureOneQubit并将该作定义为 Q# 程序的入口点:
// The @EntryPoint() attribute tells the compiler to start running your code from this operation
@EntryPoint()
operation MeasureOneQubit() : Result {
use q = Qubit();
return M(q);
}
类型
Q# 提供了许多你可能已经熟悉的内置数据类型,例如Int,Double和BoolString。 Q# 还提供特定于量子计算的类型,例如 Qubit 和 Result。
例如,MeasureOneQubit 操作返回一个Result类型的值。 该Result类型表示量子比特在测量时的状态,并且其值可以是Zero或One。
量子库
Q# 附带了多个库,其中包含函数和作,可帮助你编写量子程序。 若要从库调用函数或作,请使用 import 关键字并指定库的命名空间。 例如,若要使用标准量子库中 Microsoft.Quantum.Intrinsic 命名空间的函数 Message,请使用以下代码:
// import all functions and operations from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Microsoft.Quantum.Intrinsic
Message("Hello quantum world!");
}
星号表示从 Microsoft.Quantum.Intrinsic 命名空间导入所有函数。 或者,只能导入函数 Message :
// import only the Message function from Microsoft.Quantum.Intrinsic
import Microsoft.Quantum.Intrinsic.Message;
operation Main() : Unit {
// call the Message function from Microsoft.Quantum.Intrinsic
Message("Hello quantum world!");
}
注释
在 Q# 中,类型 Unit 表示函数或作不返回值。 有关 Q# 中的类型的详细信息,请参阅 类型系统。
可以在标准库中使用 Std 导入命名空间,而不是使用 Microsoft.Quantum。 例如,以下代码从 Microsoft.Quantum.Intrinsic 命名空间导入所有函数和作:
// import everything from Std.Intrinsic (Microsoft.Quantum.Intrinsic)
import Std.Intrinsic.*;
operation Main() : Unit {
// call the Message function from Std.Intrinsic
Message("Hello quantum world!");
}
若要浏览 Q# 标准库,请参阅 API 参考。
量子比特分配
若要在 Q# 中分配量子位,请使用 use 关键字和 Qubit 类型。 使用 use 关键字分配的量子位总是从 $\ket{0}$ 状态开始。
可以在量子比特数组中分配单个量子比特或多个量子比特。 下面是在变量 q1 中分配单个量子比特和五个量子比特数组的示例 q5:
use q1 = Qubit(); // Allocate one qubit
use q5 = Qubit[5]; // Allocate five qubits
量子比特度量
在 Q# 中,Measure 操作在指定的 Pauli 基(可以是 PauliX、PauliY 或 PauliZ)中执行对一个或多个量子比特的联合测量。 该Measure操作返回一种Result类型,其值为Zero或One。
若要在计算基 $\lbrace\ket{0},\ket{1}\rbrace$ 中执行测量,也可以使用 M 操作。 该 M 操作等效于 Pauli-Z 基础中的 Measure 操作,因此 M([qubit]) 的表现与 Measure([PauliZ], [qubit]) 完全相同。 但是, M 该作仅接受单个量子比特作为输入,而不是量子比特数组。
重置量子比特
在 Q# 中,量子比特必须处于 $\ket{0}$ 状态才能释放它们。 使用量子比特后,调用 Reset 操作将量子比特重置为 $\ket{0}$ 状态。 例如,以下代码分配量子比特、度量量子比特的状态,然后重置量子比特:
operation Main() : Result {
use q = Qubit();
let result = M(q);
// Reset the qubit so that you can release it
Reset(q);
return result;
}