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# 提供了许多你可能已经熟悉的内置数据类型,例如IntDoubleBoolString。 Q# 还提供特定于量子计算的类型,例如 QubitResult

例如,MeasureOneQubit 操作返回一个Result类型的值。 该Result类型表示量子比特在测量时的状态,并且其值可以是ZeroOne

量子库

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 基(可以是 PauliXPauliYPauliZ)中执行对一个或多个量子比特的联合测量。 该Measure操作返回一种Result类型,其值为ZeroOne

若要在计算基 $\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;
    }