在量子算术里,“第 0 根线”到底对应整数的最低位还是最高位,不是细节而是语义。同一个加法线路,线序约定不同,算的东西可以从 变成 。论文之间、论文与实现之间、甚至同一篇论文的图与正文之间都常常不一致,而且从线路图本身看不出来。这一卷把约定一次讲清,后续各卷的图统一按这里的约定画。

两种线序约定

设一个 比特的寄存器 ,其中 是最低位(LSB)。

  • 大端(big-endian):最上面的线是最高位 ,往下依次递减,最下面的线是 。
  • 小端(little-endian):最上面的线是最低位 ,往下递增。

Qiskit 的 QuantumCircuit 默认按小端绘制寄存器,即 q[0] 画在最上面;而教科书(尤其算术文献)几乎一律按大端画。本 wiki 的图统一用大端:最上面的线是最高位。这条规则的好处是,它和”从上往下读数”的直觉一致,也让进位链看起来像从低位往高位走——虽然视觉上是从上往下。

无论哪种约定,进位链的方向永远是从低位到高位。在小端图里它看起来从上往下,在大端图里看起来从下往上。这个方向性是判断一张算术线路图画对没画对的第一个检查点。

IR 里的线编号

在本站的统一线路表示中,q = 0 是最上面的线。配合本站的大端约定,q = 0 对应最高位。

x₃x₂x₁x₀x
4 比特寄存器:大端约定,q=0 是最高位 x₃

进位在最下面那根线(,最低位)上被受控翻转,逐位向上传播——注意这里传的是最低位,不是进位。这是一个受控加 1(计数)型结构,不是完整的加法器;完整的加法器见全加器。

如果作者需要小端约定,只需把 labels 倒过来写,并在图注里说明。但跨词条必须一致,否则本站的图谱就没有对照价值。

进位放在哪根线

比特加法 需要 位结果,进位要么单独占一根线,要么”挤”回被破坏的输入线上。这是算术线路里最常见的一处分叉:

方案进位去向代表
显式进位寄存器单独一根 cout 线Vedral–Barenco–Ekert 式的经典写法
就地表借用一个输入比特(通常是 或 的某一位)暂存,最后再反计算CDKM 的 UMA 就是这么做的
就地(in-place)输出直接写回 , 被清零Shor 类线路的常见选择

CDKM 的巧妙之处正是第二行:MAJ 阶段把行进位存进 那一位,UMA 阶段再把它就地变成和位,全程只需一个辅助比特。对比第一行每比特一个辅助比特,这是把辅助位数量从 降到 的关键一步——而辅助比特数量直接决定容错线路的物理比特开销。详见CDKM 加法器。

寄存器分组

groups 把多根线归成一个逻辑寄存器。这是理解”操作数宽度”的前提:一张图有 10 根线,可能是 5 比特操作数、5 比特结果,也可能是 3+3+4 的临时寄存器——线数相同,含义天差地别。

a₂a₁a₀z₂z₁taztmp 反计算 t
三个寄存器:加数 a、结果 z、临时位 t

辅助位用 tmp 之类的名字标出,并且必须画上它的反计算。一张只画加法不画反计算的图,在 Shor 类算法里是错的——辅助位不回零就无法复用,物理比特开销会随比特数线性膨胀。

读图自检清单

拿到任何一张算术线路图,按顺序问四个问题:

  1. 线序是哪种? 从 label 或正文判断;不确定就假设大端。
  2. 进位往哪个方向走? 应该从低位到高位,方向不对说明图有问题。
  3. 进位落在哪根线上? 单独线、借用线还是就地?借用的话是哪一位被借、什么时候还?
  4. 辅助位清零了吗? 图里有没有反计算段?

这四问能过滤掉相当一部分”看起来对”的错误线路图。第 4 问尤其关键——它区分了教科书里为了讲清楚而省略的反计算,和真正可用的实现之间的差别。

为什么这件事值得单开一卷

算术线路的成本几乎全部体现在辅助比特数量上,而辅助比特数量完全取决于上面这几个约定。把 个辅助进位比特优化成一个,是 CDKM 的核心贡献;把就地表做到极致,是 Gidney 的 negadd 思路的核心。换句话说,线序与寄存器约定不是记号问题,它就是优化问题本身(见gate-cost-models)。

延伸阅读