量子算法抛转(以及Oracle函数初步)

接下来要接触量子算法了,我们会看到怎么利用量子并行机制和干涉原理。干涉在算法对结果进行测量求值时举足轻重。

Deutsch-Jozsa 算法

DJ算法是量子算法的入门算法,就像编程界的“Hello World”。通过它就能演示量子机是如何“压制”传统机的算法的,不过它当然不能写成Hello World那种一两行代码就搞定。
DJ算法是用来判定一个函数是常量函数还是平衡函数的:

  • 这个函数接受\(n\)个0或1组成的串,输出0或1:\(f\{0,1\}\rightarrow f\{0,1\}\)
  • 常量函数是不管输入什么都输出固定的值(0或1)

\[f(0)=0,f(1)=0\\ f(0)=1,f(1)=1 \]

  • 平衡函数是输出一半的0一半的1

\[f(0)=0,f(1)=1\\ f(0)=1,f(1)=0 \]

在传统计算中,可以分别输入0和1,通过if-then-else分支结构来对比结果。当\(n=1\)时,对比两次就可以;对于任意的\(n\),需要对比一半以上的输入,也就是\(2^{n-1}+1\)次。所以这个问题的时间复杂度是指数的。
image
现在使用量子位来解决,当有2个的情形下,先通过H门制备4个状态的叠加态。假设我们有Oracle函数(一种非常智能的电路),把它作用在叠加态上就能一次计算出全部的\(f(x)\)的值。后面再说它的原理,现在知道的确有这种东西就行
image
如上图,主要思路就是干涉叠加以后通过Oracle函数一次输出所有值,然后测量到0就是常量函数,1就是平衡函数。



这里为了简化,先使用一个量子位,要么传0要么传1进去。下面是它的电路图
image
①②用来制备叠加态,③是Oracle函数,④是干涉步骤。通过数学计算来看一下每一步做了啥:
image
前两步自不必说,第三步使用了一个Oracle函数
image
\(f(x)=0\)时,第二个量子位不变,所以有(为了好看,把分母省略了)
image
\(f(x)=1\)是,第二个量子位的状态系数反转:
image
所以可以把他们写在一起:

\[(-1)^{f(x)}|x\rangle(|0\rangle-|1\rangle) \]

\(x=|0\rangle+|1\rangle\)代入,有
image
可以把\(f(x)\)所有可能的组合都算一遍第一个量子位的叠加态就是
image
可见对于相同的函数类型,只有一个正负号的差别。也就是整体相位中的\(\Delta \gamma=\pi\)
image
前面说过,整体相位有差别的测量结果一样,这对于我们是方便了,因为相同函数类型的概率一样。这样只要给不同的函数类型结果使用一个转换来区分开就行。所以第四步给第一个量子位使用了H门,这样常数函数会被测量为\(|0\rangle\),而平衡函数被测量为\(|1\rangle\)

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



一个qubit的情形分析完了,来看\(n\)个的场景,比如4个:\(f(1101)\)。有几个就并行使用几次H门,先得到叠加态
image
然后应用Oracle函数,按照上面的方法再计算一遍,在最后一步汇总\(f(x)=0\)\(f(x)=1\)会得到
image
第二个qubit在之后会保持不变,所以我们只关注第一个:

\[\frac{1}{\sqrt{2^{n+1}}}\sum_{x=0}^{2^n-1}(-1)^{f(x)}|x\rangle \]

接下来再次使用H门,多个量子位的哈德玛门变换是

\[\overset{H^{\otimes n}}\rightarrow\frac{1}{\sqrt{2^{n}}}\sum_{z\in\{0,1\}^n}(-1)^{<x,z>}|z\rangle \]

其中的\(<x,y>\)表示两个向量的二进制点乘,比如

\[(H_n)_{3,2}=(-1)^{3\cdot 2}=(-1)^{(1,1)\cdot(1,0)}=(-1)^{1+0}=-1 \]

因此应用哈德玛门之后这些量子位变成了
image
\(y=|000\cdots0\rangle\)时,\(x\cdot y=0\)
image
image
\(f(x)\)是平衡函数时,里面的状态会互相抵消;当\(f(x)\)是常数函数时,乘机会互相叠加变成

\[\frac{1}{2^n}2^n|000\cdots0\rangle=|000\cdots0\rangle \]

所以,测量结果依赖于\(f(x)\)创建的干涉态

\[\left|\frac{1}{2^n}\sum_{x=0}^{2^n-1}(-1)^{f(x)} \right|^2 \]



试验

这里使用咱们国家本源量子的模拟器来测试。先测试一下\(f(x)=x_0\oplus x_1x_2\),结果如下
image
可以看到四个状态的概率基本都接近0.25,所以这个函数是平衡函数。
要测试常数函数的话,可以使用恒等操作
image

Oracle函数

Deutsch-Jozsa算法和很多其他量子算法都对许多不同的问题提供了解法模板,只要替换模板中的Oracle函数就能解答特定问题。当然要熟练掌握替换技巧还是挺难的,尤其对于新手。通过打破指数级问题的时间魔咒提高了我们对加速解答问题的期望,解法可能很难,不过一般都贼有效。上面的例子里,我们把Oracle函数硬编码到电路中,并非直接查询\(f(x)\)的值,而是进行了结果的转换测量。这个方法并不通用,只是为了给大家演示量子算法。所以你在这里叹气我也理解。
客观实际是如果我们期望 Oracle 函数能够处理任何函数,那么在最坏的情况下,需要查询至少一半的数据。我们可以认为这些信息已经处于叠加状态,所以可以并行计算它们。不过事情没有那么简单,暂时也不会进一步详细说明。接下来我们会看更多依赖Oracle的量子算法。

posted @ 2022-05-27 16:14  大卫小东(Sheldon)  阅读(393)  评论(0编辑  收藏  举报