• 量子算法抛转(以及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的量子算法。

  • 相关阅读:
    Linux操作系统中,.zip、.tar、.tar.gz、.tar.bz2、.tar.xz、.jar、.7z等格式的压缩与解压
    R 环境内存限制的更改
    R 安装与环境配置
    开启博客园之路
    react-router @4用法整理
    react性能调谐与diff算法
    react新版本生命周期
    col-md-push-*和col-md-offset的区别
    react 基础篇 #2 create-react-app
    react-draft-wysiwyg富文本
  • 原文地址:https://www.cnblogs.com/somefuture/p/16304449.html
Copyright © 2020-2023  润新知