你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
量子编程语言简介 Q#
Q# 是一种用于 开发和运行量子算法的高级开源 编程语言。 Q# 包含在 Quantum 开发工具包(QDK)中。 有关详细信息,请参阅 设置 Quantum 开发工具包。
作为量子编程语言, Q# 满足以下语言、编译器和运行时要求:
- 硬件不可知: 量子算法中的量子比特不绑定到特定的量子硬件或布局。 编译器 Q# 和运行时处理从程序量子比特到物理量子比特的映射。
- 集成量子和经典计算: 执行经典计算和量子计算的能力在通用量子计算机中至关重要。
- 尊重物理规律:Q# 量子算法遵循量子物理规则。 例如,不能直接复制或访问量子比特状态。Q#
Q#程序的结构
开始编写量子程序之前,请务必了解其结构和组件。 请考虑以下 Q# 创建叠加状态的程序:
namespace Superposition {
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure the qubit in the Z-basis.
let result = M(q);
// Reset the qubit before releasing it.
Reset(q);
// Return the result of the measurement.
return result;
}
}
根据注释(//
), Superposition
程序首先分配量子比特,应用一个操作来将量子比特置于叠加状态,测量量子比特状态,重置量子比特,最后返回结果。 让我们将此程序分解成其组件。
用户命名空间
Q# 程序以用户定义的 命名空间开头,例如:
namespace Superposition {
// Your code goes here.
}
命名空间有助于组织相关功能。 每个 Q# 程序只能有一个 namespace
。
标准 Q# 库具有预定义的命名空间,其中包含可在量子程序中使用的函数和操作。 有关详细信息,请参阅 内置命名空间。
入口点
该 @EntryPoint()
属性告知 Q# 编译器开始执行程序的位置。 在具有多个函数和操作的程序中,可以在其中任何一个函数和操作之前放置 @EntryPoint()
,以使程序开始并按顺序继续。
@EntryPoint()
operation MeasureOneQubit() : Result {
...
类型
Q#提供大多数语言通用的内置类型,包括Int
、Double
Bool
、和String
特定于量子计算的类型。 例如,该 Result
类型表示量子比特度量的结果,可以有两个值之一: Zero
或 One
。
在 Superposition
程序中, MeasureOneQubit()
该操作返回一个 Result
类型,该类型对应于操作的 M
返回类型。 度量结果存储在使用语句定义的新变量中 let
:
// The operation definition returns a Result type.
operation MeasureOneQubit() : Result {
...
// Measure the qubit in the Z-basis, returning a Result type.
let result = M(q);
...
Q# 还提供了定义范围、数组和元组的类型。 你甚至可以定义自己的自定义类型。
分配量子位
在中 Q#,使用关键字分配量子位 use
。 量子比特始终以 $\ket{0}$ 状态分配。
程序 Superposition
定义单个量子比特:
// Allocate a qubit.
use q = Qubit();
还可以分配多个量子比特并通过其索引访问每个量子比特:
use qubits = Qubit[2]; // Allocate two qubits.
H(qubits[0]); // Apply H to the first qubit.
X(qubits[1]); // Apply X to the second qubit.
有关详细信息,请参阅 Use 语句。
量子操作
分配量子位后,可以将它传递给操作和函数,也称为 可调用方。 运算是 Q# 程序的基本构建基块。 Q#操作是量子子例程,或包含更改量子比特寄存器状态的量子运算的可调用例程。
若要定义 Q# 操作,请指定操作的名称、操作的输入和输出。 在 Superposition
程序中,操作 MeasureOneQubit()
本质上是整个程序。 它不采用任何参数并返回类型 Result
:
operation MeasureOneQubit() : Result {
...
}
下面是一个基本示例,它不采用任何参数,且不期望返回值。 该值 Unit
等效于 NULL
其他语言:
operation SayHelloQ() : Unit {
Message("Hello quantum world!");
}
标准 Q# 库还提供可以在量子程序中使用的操作,如 Hadamard 操作, H
在 Superposition
程序中使用。 给定 Z 基量子位, H
将量子位置于均匀叠加中,其中它有 50% 的机会被测量为 Zero
或 One
。
测量量子比特
虽然有许多类型的量子测量, Q# 但侧重于单个量子比特的投影测量,也称为 Pauli 测量。
在 Q#中, Measure
操作度量指定 Pauli 基数中的一个或多个量子比特,可以是 PauliX
, PauliY
也可以 PauliZ
。 Measure
返回一Zero
种Result
或One
一种类型。
若要在计算基础 $\lbrace、\ket{1}\rbrace\ket{0}$ 中实现度量,也可以使用该M
运算来度量 Pauli Z 基中的量子位。 M
这相当于 Measure([PauliZ], [qubit])
.
程序 Superposition
使用 M
操作:
// Measure the qubit in the Z-basis.
let result = M(q);
重置量子比特
在, Q#量子比特 在释放时必须 处于 $\ket{0}$ 状态。 使用 Reset
操作将每个量子位重置为 $\ket{0}$ 状态,然后再在程序末尾释放它。 无法重置量子位会导致运行时错误。
// Reset a qubit.
Reset(q);
内置命名空间
标准 Q# 库具有内置命名空间,其中包含可在量子程序中使用的函数和操作。 例如, Microsoft.Quantum.Intrinsic
命名空间包含常用的操作和函数,例如 M
测量结果以及 Message
显示程序中的任意位置的用户消息。
若要调用函数或操作,可以指定完整的命名空间或使用 open
语句,使该命名空间的所有函数和操作都可用,并使代码更具可读性。 以下示例调用相同的操作:
Microsoft.Quantum.Intrinsic.Message("Hello quantum world!");
open Microsoft.Quantum.Intrinsic;
Message("Hello quantum world!");
程序 Superposition
没有任何具有完整命名空间的 open
语句或调用。 这是因为 Q# 开发环境会自动加载两个命名空间: Microsoft.Quantum.Core
以及 Microsoft.Quantum.Intrinsic
包含常用函数和操作的命名空间。
可以使用操作优化程序来Superposition
利用Microsoft.Quantum.Measurement
命名空间MResetZ
。 MResetZ
将度量和重置操作合并为一个步骤,如以下示例所示:
namespace Superposition {
// Open the namespace for the MResetZ operation.
open Microsoft.Quantum.Measurement;
@EntryPoint()
operation MeasureOneQubit() : Result {
// Allocate a qubit. By default, it's in the 0 state.
use q = Qubit();
// Apply the Hadamard operation, H, to the state.
// It now has a 50% chance of being measured as 0 or 1.
H(q);
// Measure and reset the qubit, and then return the result value.
return MResetZ(q);
}
}
使用 Q# Azure Quantum 开发量子程序
Q# 和 Azure Quantum 是开发和运行量子程序的强大组合。 借助 Q# Azure Quantum,可以编写量子程序、模拟其行为、估算资源要求,并在实际量子硬件上运行它们。 通过这种集成,可以探索量子计算的潜力,并为复杂问题开发创新解决方案。 无论你是初学者还是经验丰富的量子开发人员, Q# Azure Quantum 都提供解锁量子计算所需的工具和资源。
下图显示了使用和 Azure Quantum 开发 Q# 量子程序时通过的阶段。 你的程序从开发环境开始,最后将作业提交到真正的量子硬件。
让我们分解关系图中的步骤。
选择开发环境
在首选的开发环境中运行量子程序。 可以使用 Azure Quantum 网站中的联机代码编辑器、Azure 门户中 Azure Quantum 工作区中的托管 Jupyter Notebook 或 Visual Studio Code 的本地开发环境。 有关详细信息,请参阅 运行 Q# 程序的不同方法。
编写量子程序
可以使用量子开发工具包(QDK)编写 Q# 量子程序。 若要开始,请参阅 快速入门:创建第一个 Q# 程序。
Q#此外,QDK 还提供对量子计算(如 Qiskit 和 Cirq)其他语言的支持。
与 Python 集成
可以在各种 IDE 中单独使用 Q# 或与 Python 一起使用。 例如,可以将Q#项目与 Python 主机程序配合使用来调用Q#操作。 还可以在 Jupyter Notebook 中与 Python 集成 Q# 。 有关详细信息,请参阅 运行 Q# 程序的不同方法。
%%qsharp 命令
默认情况下, Q# Jupyter Notebook 中的程序使用 ipykernel
Python 包。 若要将代码添加到 Q# 笔记本单元,请使用 %%qsharp
通过 Python 包启用 qsharp
的命令,后跟 Q# 代码。
使用 %%qsharp
时,请记住以下几点:
- 必须首先运行
import qsharp
才能启用%%qsharp
。 %%qsharp
范围到笔记本单元格的显示范围,并将单元格类型从 Python 更改为 Q#。- 不能在或之后
%%qsharp
放置 Python 语句。 - Q# 以下
%%qsharp
代码必须遵循 Q# 语法。 例如,使用//
而不是#
表示注释和;
结束代码行。
注意
Azure 门户中的 Azure 笔记本包含最新版本的 qsharp
Python azure-quantum
包,因此无需安装任何内容。 有关详细信息,请参阅 入门 Q# 和 Azure Quantum 笔记本。
估计资源
在实际量子硬件上运行之前,需要确定程序是否可以在现有硬件上运行,以及它消耗的资源数量。
Azure Quantum 资源估算器允许你评估体系结构决策、比较量子比特技术并确定执行给定量子算法所需的资源。 可以从预定义的容错协议中进行选择,并指定基础物理量子比特模型的假设。
有关详细信息,请参阅 “运行第一个资源估算”。
注意
Azure Quantum 资源估算器是免费的,不需要 Azure 帐户。
在模拟中运行程序
编译并运行量子程序时,QDK 会创建量子模拟器的实例,并将代码传递给 Q# 它。 该模拟器使用 Q# 代码创建量子比特(量子粒子的模拟)并应用转换来修改其状态。 然后将模拟器中的量子操作结果返回到程序。 在模拟器中隔离 Q# 代码可确保算法遵循量子物理学定律,还确保这些算法可在量子计算机上正确运行。
将程序提交到真正的量子硬件
可以通过本地和联机的首选开发环境将程序(也称为作业)提交 Q# 到 Azure Quantum。 有关详细信息,请参阅如何提交 Q# 作业。 还可以运行和提交使用 Qiskit 和 Cirq 语言编写的量子线路。
Azure Quantum 提供当今行业领导者提供的一些最引人入胜且最多样化的量子硬件。 有关受支持的硬件提供程序的当前列表,请参阅量子计算提供程序。
注意
基于云的 Quantinuum H 系列模拟器 目标在没有 Azure 帐户的情况下可用。 若要将作业提交到 Azure Quantum 提供程序的其余部分,需要一个 Azure 帐户和量子工作区。 如果没有量子工作区,请参阅 “创建 Azure Quantum 工作区”。
下图显示提交作业后的基本工作流: