你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
程序始终在没有量子比特的情况下启动,这意味着不能将类型 Qubit
的值作为入口点参数传递。 此限制是有意的,因为 Q# 的目的是表达和推理整个程序。
相反,程序会分配并释放量子比特或量子内存,就像它一样。
在这方面,Q# 量子计算机建模为量子比特堆。
Q# 支持单独的 为量子内存分配 和 释放 语句,而是支持以 块语句的形式进行量子内存分配,其中内存只能在该块语句的范围内访问。 在当前作用域的持续时间内分配量子位时,可以隐式定义语句块,如有关 use
和 borrow
语句的各节中的更详细描述。 尝试在语句终止后访问分配的量子比特会导致运行时异常。
Q# 有两个语句,use
和 borrow
,用于实例化量子比特值、量子比特数组或其任何组合。 只能在作中使用这些语句。 它们收集实例化的量子比特值,将它们绑定到语句中指定的变量,然后运行语句块。
在块的末尾,绑定变量超出范围,不再定义。
Q# 区分 干净 和 脏 量子比特的分配。 清理量子比特是未入入的,并且不会由计算的另一部分使用。 脏量子比特是量子比特,其状态未知,甚至可以与量子处理器内存的其他部分纠缠。
Use 语句
清理量子比特由 use
语句分配。
- 该语句由关键字
use
后跟绑定和可选语句块组成。 - 如果存在语句块,则量子比特仅在该块中可用。 否则,量子比特在当前作用域结束之前可用。
- 绑定遵循与
let
语句相同的模式:单个符号或符号元组,后跟等号=
,以及单个元组或 初始值设定项的匹配元组。
初始值设定项可用于单个量子比特(指示为 Qubit()
)或量子比特数组(Qubit[n]
),其中 n
是 Int
表达式。
例如,
use qubit = Qubit();
// ...
use (aux, register) = (Qubit(), Qubit[5]);
// ...
use qubit = Qubit() {
// ...
}
use (aux, register) = (Qubit(), Qubit[5]) {
// ...
}
保证量子位在分配时处于 |0⟩ 状态。 它们在作用域结束时发布,必须在发布时处于 |0⟩ 状态。 此要求不是编译器强制执行的,因为这需要一个符号评估,快速变得非常昂贵。 在模拟器上运行时,可以强制实施要求。 在量子处理器上,不能强制实施要求;可以通过单一转换将未测量的量子比特重置为 |0⟩。 未能这样做会导致行为不正确。
use
语句从量子处理器的任意量子比特堆分配量子比特,并将其返回到堆,不晚于量子比特绑定的范围的末尾。
借款语句
borrow
语句授予对已分配但当前未使用的量子比特的访问权限。 这些量子比特可以处于任意状态,并且当借款语句终止时,需要再次处于同一状态。
某些量子算法可以使用量子比特而不依赖于其确切状态,并且不需要它们与系统的其余部分未集成。 也就是说,它们暂时需要额外的量子比特,但可以确保这些量子比特完全返回到其原始状态,这与原状态无关。
如果存在在子例程部分使用但未触摸的量子比特,则可以借用这些量子比特供此类算法使用,而不是分配额外的量子内存。 借用而不是分配可以显著减少算法的总体量子内存需求,并且是典型的时空权衡的量子示例。
borrow
语句遵循前面为 use
语句描述的相同模式,同时提供相同的初始值设定项。
例如,
borrow qubit = Qubit();
// ...
borrow (aux, register) = (Qubit(), Qubit[5]);
// ...
borrow qubit = Qubit() {
// ...
}
borrow (aux, register) = (Qubit(), Qubit[5]) {
// ...
}
借入的量子比特处于未知状态,在语句块的末尾超出范围。 借款人承诺将量子比特保留与借入时相同的状态;也就是说,语句块的开头和末尾的状态应相同。
borrow
语句检索在程序在绑定量子比特直到上次使用该量子比特时保证不使用的量子比特。
如果没有足够的量子比特可供借用,则量子比特将从堆中分配并返回到堆,例如 use
语句。
注释
在已知的脏量子比特用例中,有需要极少数量子比特的多受控 CNOT 门的实现,以及增量器的实现。 本 有关使用量子比特进行分解的论文 提供了一个利用借用量子比特的算法的示例。