Bernstein–Vazirani 算法 的原理

1. 原理

1.1. 问题定义

        有一个隐藏的二进制字符串 s \in \{0,1\}^n ,有一个特定黑盒(Oracle)U_f​ 实现函数:f(x) = s \cdot x \pmod{2},其中  s \cdot x = s_1 x_1 \oplus s_2 x_2 \oplus \dots \oplus s_n x_n​  是按位点乘模 2(奇偶性)。【,这里的“特定”,是强调 s 对于考生未知但固定。即,对于考生,s 是未知的;但对于设计黑盒的出题人,s 是已知的可以根据 s 来设计黑盒。量子算法仅适合这个特定的情况;经典算法,可以解决的问题的作用域更大,即使 设计黑盒的人不知道 s 时,经典算法也能解出 s 。在这个特定黑盒问题上,量子算法比经典算法快 n 倍

       经典上,如果只能通过输入 x 得到 f(x),那么需要 n 次查询才能确定 s(每次查询确定一个比特,例如输入 x = 00\dots 010\dots0   在第 j 位为 1 可以得到 s_j ​)。

       Bernstein–Vazirani 算法用量子计算,只用 1 次查询 就得到 s

1.2. 量子 Oracle 的实现

        结合 s 的具体值,由出题人实现一个量子门 U_f​ 满足:

               U_f |x\rangle |y\rangle = |x\rangle |y \oplus f(x)\rangle

        其中 x 是 n qubit 寄存器,y 是 1 qubit 辅助寄存器。

注,本小节先不太关注 U_f 的具体实现,只要相信这是可以设计出来的。但,需要注意的是, U_f 由出题人设计,设计细节跟  s 的具体值有关,所以,更精确地, U_f 应该叫做 U_{f_s}。第2节会专门讨论,这里先聚焦量子算法整体框架。】

1.3. 算法步骤

步骤 1:初始化

          第一寄存器(n 个 qubit):|0\rangle^{\otimes n}

          第二寄存器(1 个 qubit):|1\rangle

系统初态:

        |\psi_0\rangle = |0\rangle^{\otimes n} \otimes |1\rangle

步骤 2:在辅助比特和输入寄存器上加 Hadamard 门

对每个 qubit 作用 H

        |\psi_1\rangle = (H^{\otimes n} |0\rangle^{\otimes n}) \otimes (H|1\rangle)

我们知道:

        H^{\otimes n} |0^n\rangle = \frac{1}{\sqrt{2^n}} \sum_{x \in \{0,1\}^n} |x\rangle

        H|1\rangle = |-\rangle = \frac{|0\rangle - |1\rangle}{\sqrt{2}}

所以:

        |\psi_1\rangle = \frac{1}{\sqrt{2^n}} \sum_{x} |x\rangle \otimes \frac{|0\rangle - |1\rangle}{\sqrt{2}}

步骤 3:调用 Oracle U_f

              |\psi_2\rangle = U_f |\psi_1\rangle

        = \frac{1}{\sqrt{2^n}} \sum_{x} |x\rangle \otimes \frac{|0 \oplus f(x)\rangle - |1 \oplus f(x)\rangle}{\sqrt{2}}

因为:

        |0 \oplus a\rangle - |1 \oplus a\rangle = (-1)^a \big( |0\rangle - |1\rangle \big)

这里 a = f(x)

验证:
若 a=0|0\rangle - |1\rangle
若 a=1|1\rangle - |0\rangle = -(|0\rangle - |1\rangle)

所以:

        |\psi_2\rangle = \frac{1}{\sqrt{2^n}} \sum_{x} (-1)^{f(x)} |x\rangle \otimes \frac{|0\rangle - |1\rangle}{\sqrt{2}}

代入 f(x) = s \cdot x

        |\psi_2\rangle = \frac{1}{\sqrt{2^n}} \sum_{x} (-1)^{s \cdot x} |x\rangle \otimes |-\rangle

关键点:辅助比特依然是 |-\rangle 态,没有被纠缠,所以我们可以只看第一寄存器状态:

        |\phi_2\rangle = \frac{1}{\sqrt{2^n}} \sum_{x} (-1)^{s \cdot x} |x\rangle

这个态称为 s 的 Hadamard 基编码态(类似傅里叶对偶)。

步骤 4:对第一寄存器再作用 H^{\otimes n}

回忆 Hadamard 门的性质:

        H^{\otimes n} |x\rangle = \frac{1}{\sqrt{2^n}} \sum_{z} (-1)^{x \cdot z} |z\rangle

逆变换相同(因为 H 是自逆):

        H^{\otimes n} \left[ \frac{1}{\sqrt{2^n}} \sum_{x} (-1)^{s\cdot x} |x\rangle \right] = \frac{1}{2^n} \sum_{x} \sum_{z} (-1)^{s\cdot x + x\cdot z} |z\rangle

交换求和顺序:

        = \sum_{z} \left[ \frac{1}{2^n} \sum_{x} (-1)^{x \cdot (s \oplus z)} \right] |z\rangle

步骤 5:利用正交性

对于二进制向量,有恒等式:

        \frac{1}{2^n} \sum_{x \in \{0,1\}^n} (-1)^{x \cdot w} = \delta_{w,0}

其中 w 是 n qubit 向量,\delta_{w,0}=1 当且仅当 w=0,否则为 0。

这里 w = s \oplus z,所以:

        \frac{1}{2^n} \sum_{x} (-1)^{x \cdot (s \oplus z)} = \delta_{s,z}

即只有 z = s 的那一项系数为 1,其它为 0。

因此:

        H^{\otimes n} |\phi_2\rangle = |s\rangle

步骤 6:测量

测量第一寄存器的 n 个 qubit,得到结果即为 s(确定性的,不是概率性的),因为量子态正好是 |s\rangle

1.4. 总结

算法步骤简记:

  1. 初始:|0^n \rangle |1\rangle

  2. 对所有 qubit 作用 Hadamard:
            \to \left( \frac{1}{\sqrt{2^n}} \sum_x |x\rangle \right) |-\rangle

  3. 调用 Oracle U_f​:
            \to \left( \frac{1}{\sqrt{2^n}} \sum_x (-1)^{s\cdot x} |x\rangle \right) |-\rangle

  4. 对前 n 个 qubit 再次作用 Hadamard:
            \to |s\rangle |-\rangle

  5. 测量前 n 个 qubit,得到 s

1.5. 与 Deutsch–Jozsa 的区别

  • Deutsch–Jozsa:区分常数函数与平衡函数,也需要 1 次量子查询(经典最坏 2^{n-1}+1 次)。

  • Bernstein–Vazirani:找到一个隐藏的二进制字符串 s,经典需要 n 次查询,量子 1 次。

  • BV 可以视为 DJ 的一个特例(但目标不同)。

       最终,BV 算法的量子加速来自于 量子并行 + 相位反冲 + 量子傅里叶(Hadamard)变换 的配合,让 Oracle 一次调用就在叠加态中标记所有 x 的相位 (-1)^{s\cdot x},再通过 Hadamard 变换把相位信息变成基态 |s\rangle

2. 深入 U_f

我们来具体构造 U_f ​,让它实现 f(x) = s \cdot x \pmod{2} 。

2.1. 函数定义

        给定一个固定的二进制字符串 s = s_1 s_2 \dots s_n​,其中 s_i \in \{0,1\} 。
定义:

        f(x) = s \cdot x = s_1 x_1 \oplus s_2 x_2 \oplus \dots \oplus s_n x_n

这是线性函数(模 2 加法)。

2.2. 量子 Oracle 形式

我们需要一个幺正算符 U_f​ 使得:

        U_f |x\rangle |y\rangle = |x\rangle |y \oplus f(x)\rangle

对于 BV 算法,辅助比特初始为 |-\rangle  时会触发相位反冲,使得:

        U_f |x\rangle |-\rangle = (-1)^{f(x)} |x\rangle |-\rangle

所以对第一寄存器来说,U_f​ 在这种特殊情况下表现为一个相位 Oracle

        U_f |x\rangle = (-1)^{s\cdot x} |x\rangle \quad \text{(when \ auxiliary \ qubit\ is \ \(|-\rangle\) )}

2.3. 电路构造

情况 1:s 只有一个 1(比如 s=00\dots010\dots0 ,第 j 位为 1)

那么 f(x) = x_j​。

实现方式:

         如果 s_j=1 且其它位 s_i=0,则 U_f​ 只需在辅助比特 |y\rangle 上加一个 受控于第 j 个 qubit 的 CNOT

电路:

|x_1\dots x_n\rangle \to \text{no\ change}

|y\rangle \to |y \oplus x_j\rangle

这就是 CNOT 门,控制位是第 j 个 qubit,目标位是辅助比特。


情况 2:一般 s 有多个 1

例如 s = 101,则 f(x) = x_1 \oplus x_3​(假设 n=3)。

实现方法:

  • 对于每个 i,如果 s_i = 1,就对辅助比特做一个 CNOT,控制位是第 i 个 qubit。

  • 因为这些 CNOT 都目标在同一个辅助比特上,最终效果是:

    y \to y \oplus x_1 \oplus x_3

    这正是 y \oplus f(x)


例子n=3, s=101
电路(第一寄存器 |x_1 x_2 x_3\rangle,辅助比特 |y\rangle ):

  1. CNOT:控制 x_1​,目标 y

  2. CNOT:控制 x_3​,目标 y
    x_2​ 因为 s_2=0 不参与)

检查对|-\rangle 的效果

辅助比特初始为 |-\rangle = \frac{|0\rangle - |1\rangle}{\sqrt{2}}​。

CNOT 门作用在目标为 |-\rangle 时的性质:
控制比特 |c\rangle,目标比特 |-\rangle

        \text{CNOT} |c\rangle |-\rangle = |c\rangle \otimes \text{X}^c |-\rangle 

因为 |-\rangle 是 X 的本征值为 -1 的本征态:

        X|-\rangle = -|-\rangle 

所以:

        \text{CNOT} |c\rangle |-\rangle = (-1)^c |c\rangle |-\rangle

即,控制比特为 |1\rangle 时,整个态乘上 -1


对于多个 CNOT(都目标在同一辅助比特 |-\rangle 上),每个 CNOT 的相位因子是 (-1)^{x_i}​ 当 s_i=1
总的相位因子是:

        (-1)^{x_1 \cdot s_1} \cdot (-1)^{x_2 \cdot s_2} \cdots (-1)^{x_n \cdot s_n} = (-1)^{\sum_i s_i x_i} = (-1)^{s\cdot x}

这正是我们要的相位 Oracle。

4. 完整电路图(BV 算法)

以 n=3, s=101 为例:

       ┌───┐          ┌───┐
q0: |0>┤ H ├──■───────┤ H ├─── M ───> s1
       ├───┤  │       ├───┤
q1: |0>┤ H ├──┼───────┤ H ├─── M ───> s2
       ├───┤  │       ├───┤
q2: |0>┤ H ├──┼──■────┤ H ├─── M ───> s3
       ├───┤┌─┴─┐│ ┌──┴──┐
q3: |1>┤ H ├┤ X ├┤ ├─ X ─┤
       └───┘└───┘│ └─────┘
                  └───────

(注:q3 是辅助比特,初始 |1\rangle,经过 H 变成 |-\rangle;两个 CNOT 的控制分别是 q0 和 q2,目标都是 q3,对应s=101)

5. 为什么经典查询需要 n 次?

        经典只能输入 x 得到 f(x)
要确定 s,需选取 n 个线性无关的 x,例如:

        x^{(1)} = 100\dots0 \quad \Rightarrow f(x^{(1)}) = s_1

        x^{(2)} = 010\dots0 \quad \Rightarrow f(x^{(2)}) = s_2

 …

每个查询得到 s 的一个比特,所以需要 n 次。

6. 量子一次查询的原因

量子可以输入叠加态:

        \sum_x |x\rangle

        Oracle 一次作用在叠加态上,同时对所有x 计算 f(x) 并编码为相位 (-1)^{s\cdot x}
        然后通过 Hadamard 变换把相位模式(-1)^{s\cdot x} = \prod_i (-1)^{s_i x_i}​ 变成 |s\rangle

        Hadamard 变换在这里起到二进制傅里叶变换的作用,把线性相位的叠加变成单个基态|s\rangle

总结

        U_f​ 的具体实现是,对每个满足 s_i = 1 的比特 i,在辅助比特上加一个 CNOT 门(控制位是第 i 个 qubit)。当辅助比特初始化为|-\rangle 时,这些 CNOT 共同给态 |x\rangle 加上相位 (-1)^{s\cdot x}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值