在量子算术里,“第 0 根线”到底对应整数的最低位还是最高位,不是细节而是语义。同一个加法线路,线序约定不同,算的东西可以从 变成 。论文之间、论文与实现之间、甚至同一篇论文的图与正文之间都常常不一致,而且从线路图本身看不出来。这一卷把约定一次讲清,后续各卷的图统一按这里的约定画。
两种线序约定
设一个 比特的寄存器 ,其中 是最低位(LSB)。
- 大端(big-endian):最上面的线是最高位 ,往下依次递减,最下面的线是 。
- 小端(little-endian):最上面的线是最低位 ,往下递增。
Qiskit 的 QuantumCircuit 默认按小端绘制寄存器,即 q[0] 画在最上面;而教科书(尤其算术文献)几乎一律按大端画。本 wiki 的图统一用大端:最上面的线是最高位。这条规则的好处是,它和”从上往下读数”的直觉一致,也让进位链看起来像从低位往高位走——虽然视觉上是从上往下。
无论哪种约定,进位链的方向永远是从低位到高位。在小端图里它看起来从上往下,在大端图里看起来从下往上。这个方向性是判断一张算术线路图画对没画对的第一个检查点。
IR 里的线编号
在本站的统一线路表示中,q = 0 是最上面的线。配合本站的大端约定,q = 0 对应最高位。
进位在最下面那根线(,最低位)上被受控翻转,逐位向上传播——注意这里传的是最低位,不是进位。这是一个受控加 1(计数)型结构,不是完整的加法器;完整的加法器见全加器。
如果作者需要小端约定,只需把 labels 倒过来写,并在图注里说明。但跨词条必须一致,否则本站的图谱就没有对照价值。
进位放在哪根线
比特加法 需要 位结果,进位要么单独占一根线,要么”挤”回被破坏的输入线上。这是算术线路里最常见的一处分叉:
| 方案 | 进位去向 | 代表 |
|---|---|---|
| 显式进位寄存器 | 单独一根 cout 线 | Vedral–Barenco–Ekert 式的经典写法 |
| 就地表 | 借用一个输入比特(通常是 或 的某一位)暂存,最后再反计算 | CDKM 的 UMA 就是这么做的 |
| 就地(in-place) | 输出直接写回 , 被清零 | Shor 类线路的常见选择 |
CDKM 的巧妙之处正是第二行:MAJ 阶段把行进位存进 那一位,UMA 阶段再把它就地变成和位,全程只需一个辅助比特。对比第一行每比特一个辅助比特,这是把辅助位数量从 降到 的关键一步——而辅助比特数量直接决定容错线路的物理比特开销。详见CDKM 加法器。
寄存器分组
groups 把多根线归成一个逻辑寄存器。这是理解”操作数宽度”的前提:一张图有 10 根线,可能是 5 比特操作数、5 比特结果,也可能是 3+3+4 的临时寄存器——线数相同,含义天差地别。
辅助位用 tmp 之类的名字标出,并且必须画上它的反计算。一张只画加法不画反计算的图,在 Shor 类算法里是错的——辅助位不回零就无法复用,物理比特开销会随比特数线性膨胀。
读图自检清单
拿到任何一张算术线路图,按顺序问四个问题:
- 线序是哪种? 从 label 或正文判断;不确定就假设大端。
- 进位往哪个方向走? 应该从低位到高位,方向不对说明图有问题。
- 进位落在哪根线上? 单独线、借用线还是就地?借用的话是哪一位被借、什么时候还?
- 辅助位清零了吗? 图里有没有反计算段?
这四问能过滤掉相当一部分”看起来对”的错误线路图。第 4 问尤其关键——它区分了教科书里为了讲清楚而省略的反计算,和真正可用的实现之间的差别。
为什么这件事值得单开一卷
算术线路的成本几乎全部体现在辅助比特数量上,而辅助比特数量完全取决于上面这几个约定。把 个辅助进位比特优化成一个,是 CDKM 的核心贡献;把就地表做到极致,是 Gidney 的 negadd 思路的核心。换句话说,线序与寄存器约定不是记号问题,它就是优化问题本身(见gate-cost-models)。
延伸阅读
- circuit-representation:本站的线路表示规范
- circuit-atlas:全部门型的图例
- cdkm-adder:借用输入线暂存进位的典范
- gate-cost-models:辅助比特为什么是主要成本