你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Q# 量子编程语言用户指南
Q# 量子编程语言是 Microsoft Quantum 开发工具包的一部分,它为程序可视化和分析提供丰富的 IDE 支持和工具。 借助 Q# 和 Quantum 开发工具包 (QDK),可以使用 Azure Quantum 在真实的量子硬件上编写量子程序并运行它们。
有关详细信息,请参阅如何配置量子开发环境以及如何将 Q# 作业提交到 Azure Quantum。
Q# 用户指南包含:
运行 Q# 程序的方法:Q# 程序可以作为独立应用程序运行,也可以和 Python 或 .NET 语言编写的其他主机程序一起运行。
测试和调试 Q# 程序:与经典编程一样,能够检查量子程序是否按预期方式运行,并且能够诊断不正确的行为至关重要。 用于测试和调试量子程序的 Quantum 开发工具包。
Q# 语言指南:Q# 是一种提供高级抽象的独立语言。 没有量子态或线路的概念;相反,Q# 在语句和表达式方面实现程序,与经典的编程语言非常类似。 Q# 语言指南提供 Q# 量子编程语言的完整规范和文档。
量子模拟器文档:量子模拟器是在经典计算机上运行并充当 Q# 程序的目标计算机的软件程序。借助这些软件程序,可以在经典计算机上运行和测试量子程序。
Q# 库文档:Quantum 开发工具包通过可添加到 Q# 项目中的 NuGet 包提供其他特定于域的功能。 该文档包括组成标准 Q# 库的运算、函数、用户定义类型、示例和概念,以及量子化学、量子机器学习和量子数值库。
Q# 程序中有什么?
让我们探讨一下 Q# 程序内一般包含的部分。 考虑以下 Q# 程序:
namespace HelloQuantum {
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
@EntryPoint()
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
}
EntryPoint
告知 Q# 编译器从哪里开始执行程序。 该程序将显示以下消息:
Hello quantum world!
命名空间
每个 Q# 文件通常以命名空间开头。 下面的示例说明:
namespace HelloQuantum {
// Your code goes here.
}
命名空间有助于组织相关功能。 当你在程序中使用 Q# 库以及编写自己的库时,它们的使用变得很重要。
库
Q# 广泛使用库。 库是一个包,其中包含可在量子程序中使用的函数和操作。
例如,Microsoft.Quantum.Chemistry 库可帮助执行与化学有关的量子计算。 我们提供了几个标准库,其中包括各种基本操作。
从库中调用函数或操作时,需要指定库的命名空间。 下面的示例从 Microsoft.Quantum.Intrinsic 库中调用了 Message
函数,以便在控制台中打印消息:
namespace HelloQuantum {
@EntryPoint()
operation SayHelloQ() : Unit {
Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
}
}
更常见的情况是,使用 open
指令使代码更简洁、更易于阅读。
此示例与上一示例执行的操作相同,不同之处在于,此示例使用 open
指令将 Microsoft.Quantum.Intrinsic
命名空间引入程序:
namespace HelloQuantum {
open Microsoft.Quantum.Intrinsic;
@EntryPoint()
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
}
在这里,只需指定 Message
,编译器就可了解它所属的命名空间。
Q# 文档为每个内置库提供了完整参考文档。 有关详细信息,请参阅 Q# 库文档。
类型
Q# 提供了许多你已经熟悉的内置类型,包括 Int
、Double
、Bool
和 String
,以及特定于量子计算的类型。 例如,Result
类型表示量子位测量的结果,可以具有以下两个可能值之一:One
和 Zero
。 Q# 还提供了定义范围、数组和元组的类型。 你甚至可以定义自己的自定义类型。
总而言之,Q# 类型系统是比较简约的,因为没有像 C# 或 Java 等经典语言那样使用类或接口的明确概念。
分配量子位
在 Q# 中,通过 use
关键字分配量子比特。 可以一次分配一个或多个量子位。
下面的示例分配了一个量子位:
// Allocate a qubit.
use q = Qubit();
// Do something with q here.
默认情况下,使用 use
关键字分配的每个量子位最初都为 0 态。
量子操作
分配后,可以将量子比特传递到操作和函数,也称为可调用对象。 从某种意义上讲,这是 Q# 程序可对量子比特执行的所有操作。 运算是 Q# 程序的基本构建基块。 Q# 操作是量子子例程。 也就是说,它是一个可调用例程,其中包含用于修改量子位寄存器状态的量子操作。
要定义 Q# 运算,你需要指定运算的名称及其输入和输出。 下面是一个基本示例:
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
此处,SayHelloQ
是操作的名称。 它将零参数作为其输入并返回 Unit
类型,这意味着该操作不返回任何信息。
Q# 库还提供可在程序中使用的操作,例如 Hadamard 或 H
操作。 在 Z 基指定一个量子比特,H
操作会将量子比特置于平均叠加中。 在叠加中,量子比特被测量为 0 或 1 的几率是 50%。
针对量子比特状态的所有直接操作都由内部可调用对象(例如 X
和 H
)定义,也就是说,其实现不是在 Q# 中定义,而是由目标计算机定义的可调用对象。 这些操作实际执行的内容仅由选择运行特定 Q# 程序的目标计算机进行具体实现。 有关详细信息,请参阅 Q# 程序实现。
例如,如果在全态模拟器上运行程序,模拟器将对模拟的量子系统执行相应的数学运算。 但在将来,如果目标计算机是一台真实的量子计算机,那么在 Q# 中调用此类操作将指示量子计算机在真正的量子硬件上执行相应的实际操作。 例如,在离子阱量子计算机中,量子操作是通过精确计时的激光脉冲实现的。
Q# 程序重新组合目标计算机定义的这些操作,以创建新的、更高级别的操作来表示量子计算。 由此,借助 Q# 可轻松地表达量子和混合量子传统算法的基础逻辑,同时对于目标计算机或模拟器的结构也具有普遍性。
测量量子比特
量子测量多种多样,但 Q# 侧重于单个量子比特的投影测量,也称为 Pauli 测量。 在给定基(例如计算基 $\ket{0},\ket{1}$)上进行测量时,量子比特状态将投影到所测量的任何基状态,从而破坏两者之间的任何叠加。
在 Q# 中,Pauli 测量是通过应用 Measure
操作来完成的,该操作对指定 Pauli 基中的一个或多个量子比特执行联合测量。 Measure
操作返回 Result
类型。
注意
如果基数组和量子比特数组的长度不同,则 Measure
操作将失败。
若要在计算基 $\ket{0},\ket{1}$ 中实现测量,也可以使用 M
操作,该操作在 Pauli Z 基中对单个量子比特执行测量。 因此,M
操作等效于应用 Measure([PauliZ], [qubit])
。
下面的程序是一个简单的示例,它在 $\ket{0}$ 状态下分配一个量子比特,然后对其应用 Hadamard 运算 H
并在 PauliZ
基础上测量结果。
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit, by default it is in zero state
use q = Qubit();
// We apply a Hadamard operation H to the state
// It now has a 50% chance of being measured 0 or 1
H(q);
// Now we measure the qubit in Z-basis.
let result = M(qubit);
// We reset the qubit before releasing it.
if result == One { X(qubit); }
// Finally, we return the result of the measurement.
return result;
}
为了在单个联合测量之外执行测量,Microsoft.Quantum.Measurement
命名空间包含更具体的操作。 例如,MultiM
操作采用量子比特数组并在计算基中返回测量结果数组。
后续步骤
- Q# 程序的运行方式
- 测试和调试 Q# 程序
- Q# 中的声明
- 在 Q# 中的程序实施
- Q# 编写的表达式
- 用 Q# 编写的数据类型
- Q# 库
- 量子模拟器