如何将数据集实现为预言机和量子线路?

如何将数据集实现为预言机和量子线路?

在量子算法中,经典数据集通常不会像普通数据库中的表那样被加载到量子计算机中。相反,数据会通过预言机暴露出来:也就是一种可由算法查询的可逆操作。线路实现取决于这个预言机必须回答什么问题。

一种常见形式是

\[O_f: |xrangle |yrangle mapsto |xrangle |y oplus f(x)rangle,\]

其中 x 是索引或键,y 是目标寄存器,f(x) 是与 x 关联的数据值或标签。如果 f(x) 是一位,目标寄存器就有一个量子比特。如果 f(x) 是一个 m 位的值,目标寄存器就有 m 个量子比特,并且 XOR 按位进行。

另一种常用形式是相位预言机

\[O_f: |xrangle mapsto (-1)^{f(x)} |xrangle.\]

相位预言机通常可以通过位预言机得到:将目标量子比特制备为 |-rangle = (|0rangle - |1rangle)/sqrt{2},然后利用相位反冲。

示例:一个小型二进制数据集

假设经典数据集是

| 索引 x | 值 f(x) |
| --- | --- |
| 00 | 0 |
| 01 | 1 |
| 10 | 1 |
| 11 | 0 |

这是 XOR 函数:

\[f(x_1,x_0)=x_1 oplus x_0.\]

位预言机可以实现为

\[|x_1x_0rangle |yrangle mapsto |x_1x_0rangle |y oplus x_1 oplus x_0rangle.\]

这个线路只是两个 CNOT 门,一个由 x_1 控制,另一个由 x_0 控制,二者都以 y 为目标:

x1: ──■──────
      │
x0: ──┼──■───
      │  │
y : ──X──X───

这之所以有效,是因为每个 CNOT 都会在其控制位为 1 时翻转目标位。索引中每有一个 1 位,目标就会被翻转一次,因此结果就是两个索引位的奇偶性。

有限查找表的一般方法

对于任意有限表,直接构造方法是:

  1. 使用 n 个量子比特作为索引寄存器,数量足以寻址所有行。
  2. 使用 m 个量子比特作为输出寄存器,数量足以存储每个值。
  3. 对于每一行 x = a,如果输出位 j1,就添加一个多控制 NOT 门,以输出量子比特 j 为目标,并由匹配 a 的索引寄存器控制。
  4. 如果某个控制位必须匹配 0,就在多控制操作前后用 X 门包住该控制线。

例如,如果表中有一行

x = 101, f(x) = 011

那么当索引为 101 时,预言机必须翻转两个低位输出位。控制条件是 x2 = 1x1 = 0x0 = 1。其中 0 控制可以通过以下方式处理:先对 x1 应用 X,再使用普通的全 1 控制操作,然后再次对 x1 应用 X

伪代码如下:

for each row a in table:
    for each output bit j where f(a)[j] == 1:
        flip index qubits whose required control value is 0
        apply multi-controlled X from all index qubits to output[j]
        flip those index qubits back

这种构造容易理解和验证,但并不总是高效。一个包含 N 行和 m 个输出位的表,在分解为目标设备或模拟器支持的基本门集之前,最多可能需要 N * m 个多控制门。

可逆性很重要

量子预言机必须是酉的,因此不能简单地擦除或覆盖数据。这就是通常的预言机使用 XOR 写入的原因:

\[|xrangle |yrangle mapsto |xrangle |y oplus f(x)rangle.\]

如果算法需要临时工作空间,就把值计算到一个辅助寄存器中,使用它,然后通过反向运行同一线路来反计算它。这样可以防止答案寄存器和临时量子比特之间产生不需要的纠缠。

标准模式是:

compute f(x) into work register
use f(x)
uncompute f(x) by applying the inverse circuit

对于由 XCNOTToffoli 和多控制 X 门组成的经典可逆线路,逆操作通常就是以相反顺序应用相同的门。

数据加载不同于预言机

有时人们会要求一个制备含有数据的量子态的线路,例如

\[sum_x d_x |xrangle.\]

这是量子态制备,并不等同于查找预言机。对于任意数据,量子态制备可能很昂贵,因为振幅必须经过归一化,并通过旋转编码。查找预言机回答的是“f(x) 是什么?”这类查询,而量子态制备创建的是一个振幅为数据的叠加态。

正确的实现取决于算法:

  • 对于 Grover 搜索,通常需要一个标记良好索引的相位预言机。
  • 对于算术算法,通常需要一个计算 f(x) 的可逆线路。
  • 对于振幅编码,需要一个量子态制备线路,或者类似 QRAM 的假设。
  • 对于小型演示,直接的查找表线路通常就足够了。

实用检查

对于小型预言机,在把它用于更大的算法之前,应先验证真值表。一个简单且可复现的检查方式是模拟每个计算基输入,并确认输出寄存器变为 y XOR f(x)

检查清单如下:

  1. 确认框架使用的位序。Qiskit、Cirq 和其他工具可能会以不同顺序显示量子比特和位串。
  2. 测试每个索引值 x
  3. 在输出寄存器初始化为零和非零值两种情况下都进行测试,因为预言机应该执行 XOR,而不是覆盖。
  4. 如果使用了辅助量子比特,检查它们在反计算后是否回到 |0rangle
  5. 将线路分解为后端的基门,并检查深度和门数量。

对于小型静态数据集,直接的多控制门方法是最清晰的实现。对于更大的结构化数据集,更好的做法是用可逆算术和逻辑,以代数方式实现该函数。对于非常大的非结构化数据,构造预言机的成本是算法模型的一部分,不应隐藏在“预言机”这个词背后。

Leave a Reply