# Bernstein–Vazirani 秘密串读出(Bernstein–Vazirani)
English · **简体中文**
> 类别 C1 · 模块 [`oracq.algorithms.basics.oracle_algorithms`](../../api/algorithms/basics/oracle_algorithms.rst) · 阶段 V1
## 概述
给定承诺为仿射布尔函数 $f(x) = s \cdot x \oplus c$($s \in \{0,1\}^n$ 为秘密串,$c \in \{0,1\}$ 为偏置,点积与异或在 GF(2) 上进行),用一次 oracle 查询完整读出 $s$。与 [Deutsch–Jozsa](deutsch-jozsa.md) 相同的相位反冲电路上,相位 $(-1)^{f(x)} = (-1)^c (-1)^{s \cdot x}$ 的线性部分在 Hadamard 干涉后把 input 塌缩到 $|s\rangle$,常数因子 $(-1)^c$ 不影响读出。
## 接口与输入模型
```python
bernstein_vazirani(function)
affine_boolean_oracle(width, secret, *, bias=0)
```
API 入口:{obj}`bernstein_vazirani `、{obj}`affine_boolean_oracle `
- {obj}`bernstein_vazirani(function) `:`function` 为单结果位 XOR database(input model 为 FO:仿射布尔函数真值表),内部先经 {obj}`deutsch_jozsa ` 校验 `data_width == 1`;仿射承诺由调用者承担。oracle 可以保留为开放声明({obj}`abstract_database `),生成后再绑定 gate 或 QRAM 实现。
- {obj}`affine_boolean_oracle(width, secret, *, bias=0) `:构造 $f(x) = s \cdot x \oplus c$ 的门级 oracle,返回 {obj}`XorDatabase `。`width` 范围 1..64,`secret` 范围 $0 .. 2^{\text{width}}-1$,`bias` 取 0 或 1;`secret` 的第 $i$ 位对应地址第 $i$ 位(little endian)。
`bernstein_vazirani` 返回 {obj}`Operation `,寄存器与 DJ 相同:`input: Bits(address_width)` 与 `answer: Bits(1)`。模块属性:
| 属性 | 含义 |
|---|---|
| `algorithm` | `"bernstein_vazirani"` |
| `input_promise` | `"f(x)=dot(s,x) XOR c over GF(2)"`(承诺声明) |
| `readout_register` | `"input"`(读取 input 直接得到 $s$) |
| `validation_stage` | `"paradigm"`(自 DJ 电路继承) |
## 实现要点
实现复用 DJ 电路:调用 `deutsch_jozsa(function)` 后,仅以 `dataclasses.replace` 重标注模块名与属性(`algorithm` / `input_promise`),依赖与电路结构完全不变。读出满足承诺时 `input` 精确等于 $s$;对非仿射函数输出不作保证。oracle 保留为模块调用;开放声明路线(`abstract_database` → {obj}`bind `)在运行展示目录中有端到端示例:先以 `bernstein_vazirani(abstract_database(...))` 生成含未绑定槽位的程序,再用具体 oracle 的 `operation` 绑定。
## 验证方案
类别 C1(精确离散语义,判定准则见 `../development/validation-plan.md` §2):读出分布须逐点等于 $|s\rangle$。三层证据:
- 结构:`tests/core/test_algorithm_expansion.py:AlgorithmExpansionTests.test_legacy_imports_reference_canonical_objects`(矩阵口径)。
- 数值:`AlgorithmExpansionTests.test_bernstein_vazirani_recovers_secret_with_affine_bias`——`width = 3` 下全部 8 个秘密串 × 偏置 $\{0, 1\}$ 共 16 个组合,input 分布集中于 $s$ 的断言精度 places = 10。
- 绑定:tests/core 无独立绑定见证(矩阵口径为 —);开放声明 → 门级绑定的用法由运行展示目录与 `applications/catalog.py` 的 `dj_gate` / `dj_qram` 案例(同一 XOR database 绑定机制)演示。
## 已知缺口与计划阶段
无已知缺口(验证矩阵缺口列为 —),阶段 V1。
## 相关链接
- 同模块:[Deutsch–Jozsa 查询](deutsch-jozsa.md)、[Simon 采样](simon.md)
- 源码:`src/oracq/algorithms/basics/oracle_algorithms.py`
- 教程:[给算法替换 oracle](../../tutorials/oracle-binding.md)
- API 参考:[Oracle 查询算法](../../api/algorithms/basics/oracle_algorithms.rst)
- 验证矩阵:[验证覆盖矩阵](../../development/validation-coverage.md)
## 数值验证
论文级数值验证脚本:`tests/verification/verify_oracles.py`(B 组案例),产物 `out/verification/oracles.json`。
实验设计:本算法为论文点名算法,按任务要求做**多宽度 × 多秘密串 × 双偏置 × 多后端路径**——宽度 3–8 bit,每个宽度取秘密串集合 $\{1,\ 2^n-1,\ 0101\ldots,\ \texttt{0x9E37\ldots} \bmod 2^n\}$(去重后 3–4 个)× 偏置 $\{0,1\}$,共 6–8 个实例/宽度;每个实例在 reference、rir-pysparq、adapter-pysparq、originir-ext 四条路径上各跑一次,指标为读出串等于秘密串的概率(input 边缘分布)、与 $\delta_s$ 分布的 TVD、以及与闭式末态 $(-1)^c|s\rangle|-\rangle$ 的逐振幅偏差。`affine_boolean_oracle` 自身另做叠加态真值表穷举($f(x)=s\cdot x\oplus c$ 逐分支对拍)。开放声明路线以 `bernstein_vazirani(abstract_database(...))` 生成含未绑定槽位的程序,再分别绑定 gate 真值表与 QRAM 实现做端到端恢复。
| 案例 | 规模 | 路径 | 指标值 |
|---|---|---|---|
| bv-recovery-w3 | 3 bit,6 实例 | 全部四路径 | success_probability = 1 - 1.1e-15,tvd = 5.6e-16,max_error = 3.3e-16 |
| bv-recovery-w4 | 4 bit,6 实例 | 全部四路径 | success_probability = 1 - 1.4e-15,tvd = 7.2e-16,max_error = 4.4e-16 |
| bv-recovery-w5 | 5 bit,6 实例 | 全部四路径 | success_probability = 1 - 1.8e-15,tvd = 8.9e-16,max_error = 5.6e-16 |
| bv-recovery-w6 | 6 bit,6 实例 | 全部四路径 | success_probability = 1 - 2.1e-15,tvd = 1.1e-15,max_error = 6.7e-16 |
| bv-recovery-w7 | 7 bit,8 实例 | 全部四路径 | success_probability = 1 - 2.3e-15,tvd = 1.2e-15,max_error = 7.8e-16 |
| bv-recovery-w8 | 8 bit,8 实例 | 全部四路径 | success_probability = 1 - 2.7e-15,tvd = 1.3e-15,max_error = 8.9e-16 |
| bv-oracle-truth-table-w4 | 4 bit,s=0b1011,c=1 | reference, rir-pysparq, originir-ext | max_error = 5.6e-17 |
| bv-oracle-truth-table-w8 | 8 bit,s=0xA5,c=0 | reference, rir-pysparq, originir-ext | max_error = 2.8e-17 |
| bv-open-bind-w4-s11b1 | 4 bit,gate/qram 双绑定 | reference, rir-pysparq, originir-ext | success_probability = 1 - 1.4e-15,max_error = 4.4e-16 |
| bv-open-bind-w4-s6b0 | 4 bit,gate/qram 双绑定 | reference, rir-pysparq, originir-ext | success_probability = 1 - 1.4e-15,max_error = 4.4e-16 |
success_probability 与 1 的偏差全部来自后端浮点累加($\le 3\times10^{-15}$),恢复串在每个实例、每条路径上都精确等于秘密串。
复现命令:
```bash
PYTHONPATH=src <含 pysparq+uniqc 的解释器> tests/verification/verify_oracles.py
```
产物路径:`out/verification/oracles.json`。