# 模乘置换(Modular Multiplication)
English · **简体中文**
> 类别 C1 · 模块 [`oracq.algorithms.basics.number_theory`](../../api/algorithms/basics/number_theory.rst) · 阶段 —
## 概述
给定与模数 $m$ 互素的乘数 $a$,在 $w$ 位寄存器上实现可逆映射
$$
U_{a,m}\,|x\rangle =
\begin{cases}
|a \cdot x \bmod m\rangle, & x < m,\\
|x\rangle, & x \ge m,
\end{cases}
$$
即 Shor 求阶所需的模乘酉的有限规模版本。它是[量子求阶](order-finding.md)的底层构件;经典因子后处理见该页。
## 接口与输入模型
```python
modular_multiply(multiplier, modulus, *, width=None, max_width=8)
```
API 入口:{obj}`modular_multiply `
- `multiplier`:与 `modulus` 互素的正整数(input model 为 CP,乘数与模数直接以经典参数给出,无 oracle 输入)。
- `modulus`:模数,不小于 2。
- `width`:目标位宽;省略时取能容纳 `modulus - 1` 的最小位宽。
- `max_width`:置换合成预算,默认 8,最多允许 12。
返回 {obj}`Operation `,寄存器为 `target: Bits(width)`。模块属性:
| 属性 | 含义 |
|---|---|
| `algorithm` | `"modular_multiply"` |
| `implementation_scope` | `"bounded permutation synthesis"` |
| `modulus` | 调用参数回显 |
## 实现要点
生成策略是枚举 $2^w$ 个基态上的完整置换,分解为不相交循环后逐对转置(`_transposition`)合成,因此任意基态上的作用与定义逐点一致。乘数在生成期先对模数约化;`modulus > 2^width` 或 $\gcd(a, m) \neq 1$ 时直接抛出 {obj}`ValidationError `。
适用边界:置换枚举个数随位宽指数增长,`max_width` 默认 8、上限 12 是有意的合成预算。**当前模乘使用有上限的置换合成,默认最多 8 位;它用于检查求阶接口与线路,不代表已实现可扩展的 Shor 模算术**(沿用算法目录页的既有口径)。需要大规模模算术的场景应换用可扩展构造,本模块不提供。
## 验证方案
类别 C1(精确离散语义,判定准则见 `../../development/validation-plan.md` §2):作用酉须与真值表逐点相等。证据:
- 结构:`tests/core/test_algorithm_expansion.py:AlgorithmExpansionTests` 的构造与属性断言;`test_bad_inputs_fail_at_generation` 覆盖乘数与模数不互素({obj}`modular_multiply(2, 4) `)等生成期违例。
- 数值:`AlgorithmExpansionTests.test_modular_multiplication_total_permutation_and_order`——对 `modular_multiply(2, 5)`(位宽 3)穷举全部 8 个基态,逐点验证 $x<5$ 映到 $2x\bmod 5$、$x\ge 5$ 保持不变,目标基态幅度精确为 1。
- 绑定:本算法无独立绑定见证(无开放声明入口)。
## 已知缺口与计划阶段
缺口沿用验证矩阵口径:小规模见证**已注明不可外推为完整 Shor**(保留原有口径);可扩展模算术构造未实现。阶段列为 —(不属 V1–V4 的任何一档)。
## 相关链接
- 同模块:[量子求阶与因子后处理](order-finding.md)
- 源码:`src/oracq/algorithms/basics/number_theory.py`
- API 参考:[模乘与求阶](../../api/algorithms/basics/number_theory.rst)
- 验证矩阵:[验证覆盖矩阵](../../development/validation-coverage.md)
## 数值验证
论文级数值实验见 `tests/verification/verify_nt_qlss_sde.py`(nt_qlss_sde 组),全部在真实后端执行;经典预言机为独立的数论置换真值($x \mapsto ax \bmod m$ 当 $x