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

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\)次。所以这个问题的时间复杂度是指数的。



现在使用量子位来解决,当有2个的情形下,先通过H门制备4个状态的叠加态。假设我们有Oracle函数(一种非常智能的电路),把它作用在叠加态上就能一次计算出全部的\(f(x)\)的值。后面再说它的原理,现在知道的确有这种东西就行



如上图,主要思路就是干涉叠加以后通过Oracle函数一次输出所有值,然后测量到0就是常量函数,1就是平衡函数。



这里为了简化,先使用一个量子位,要么传0要么传1进去。下面是它的电路图



①②用来制备叠加态,③是Oracle函数,④是干涉步骤。通过数学计算来看一下每一步做了啥:



前两步自不必说,第三步使用了一个Oracle函数



当\(f(x)=0\)时,第二个量子位不变,所以有(为了好看,把分母省略了)



当\(f(x)=1\)是,第二个量子位的状态系数反转:



所以可以把他们写在一起:

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

把\(x=|0\rangle+|1\rangle\)代入,有



可以把\(f(x)\)所有可能的组合都算一遍第一个量子位的叠加态就是



可见对于相同的函数类型,只有一个正负号的差别。也就是整体相位中的\(\Delta \gamma=\pi\)。



前面说过,整体相位有差别的测量结果一样,这对于我们是方便了,因为相同函数类型的概率一样。这样只要给不同的函数类型结果使用一个转换来区分开就行。所以第四步给第一个量子位使用了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门,先得到叠加态



然后应用Oracle函数,按照上面的方法再计算一遍,在最后一步汇总\(f(x)=0\)和\(f(x)=1\)会得到



第二个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
\]

因此应用哈德玛门之后这些量子位变成了



当\(y=|000\cdots0\rangle\)时,\(x\cdot y=0\),





当\(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\),结果如下



可以看到四个状态的概率基本都接近0.25,所以这个函数是平衡函数。

要测试常数函数的话,可以使用恒等操作

Oracle函数

Deutsch-Jozsa算法和很多其他量子算法都对许多不同的问题提供了解法模板,只要替换模板中的Oracle函数就能解答特定问题。当然要熟练掌握替换技巧还是挺难的,尤其对于新手。通过打破指数级问题的时间魔咒提高了我们对加速解答问题的期望,解法可能很难,不过一般都贼有效。上面的例子里,我们把Oracle函数硬编码到电路中,并非直接查询\(f(x)\)的值,而是进行了结果的转换测量。这个方法并不通用,只是为了给大家演示量子算法。所以你在这里叹气我也理解。

客观实际是如果我们期望 Oracle 函数能够处理任何函数,那么在最坏的情况下,需要查询至少一半的数据。我们可以认为这些信息已经处于叠加状态,所以可以并行计算它们。不过事情没有那么简单,暂时也不会进一步详细说明。接下来我们会看更多依赖Oracle的量子算法。

量子算法抛转(以及Oracle函数初步)的更多相关文章

  1. oracle函数操作

    感于总有些网友提出一些非常基础的问题,比如有没有实现某某功能的函数啊,某某函数是做什么用的啊,格式是什么等等,同时也感受到自己对oracle函数认识的不足,于是集中月余时间专注于oracle函数,小有 ...

  2. 笔记 | 第一个量子算法:Deutsch-Jozsa算法,非常好懂!

    <关于胡小兔的博客又诈尸了这件事> 信息物理真是难啊!上节课讲了量子计算的最基础的概念和Deutsch-Jozsa算法,我看了好几天才看懂-- 等考完试估计我就忘了,所以今天先写个博客给未 ...

  3. oracle函数,游标,视图使用总结0.000000000000000000001

    oracle函数或者叫存储过程,在实际的开发过程中对于复杂的业务需求是非常有用的,非常有效率的也是非常好玩儿的一个技术点. 平常在开发过程中对于CRUD功能较多.一般SQL即可应付,大不了就是长一点而 ...

  4. 【函数】Oracle函数系列(2)--数学函数及日期函数

    [函数]Oracle函数系列(2)--数学函数及日期函数 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...

  5. oracle函数listagg的使用说明(分组后连接字段)

    关于oracle函数listagg的使用说明 工作中经常遇到客户提出这样的需求,希望在汇总合并中,能够把日期逐个枚举出来. 如图,原始数据是这样的: 客户希望能够实现这样的汇总合并: 那么通常我会使用 ...

  6. 浅谈Oracle函数返回Table集合

    在调用Oracle函数时为了让PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成.REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合 ...

  7. 算法总结之欧拉函数&中国剩余定理

    算法总结之欧拉函数&中国剩余定理 1.欧拉函数 概念:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)( ...

  8. oracle学习笔记(三)oracle函数

    --oracle 函数 --lower(char):将字符串转换为小写格式 --upper(char):将字符串转换为大写格式 --length(char):返回字符串的长度 --substr(cha ...

  9. oracle函数和存储过程有什么区别

    oracle函数和存储过程有什么区别 1. 返回值的区别,函数有1个返回值,而存储过程是通过参数返回的,可以有多个或者没有 2.调用的区别,函数可以在查询语句中直接调用,而存储过程必须单独调用. 函数 ...

  10. Oracle函数sys_connect_by_path 详解

    Oracle函数sys_connect_by_path 详解 语法:Oracle函数:sys_connect_by_path 主要用于树查询(层次查询) 以及 多列转行.其语法一般为:       s ...

随机推荐

  1. 机器学习策略篇:详解开发集和测试集的大小(Size of dev and test sets)

    在深度学习时代,设立开发集和测试集的方针也在变化. 可能听说过一条经验法则,在机器学习中,把取得的全部数据用70/30比例分成训练集和测试集.或者如果必须设立训练集.开发集和测试集,会这么分60%训练 ...

  2. ExpiringMap学习总结

    一.ExpiringMap简介 ExpiringMap是一个轻量级的Java缓存方式 针对一些小体量的项目,存储的数据量也不是很大(如校验码)的情况下,使用Redis会增加系统的复杂性和维护难度.它的 ...

  3. 得物 ZooKeeper SLA 也可以 99.99%

    1. 背景 ZooKeeper(ZK)是一个诞生于 2007 年的分布式应用程序协调服务.尽管出于一些特殊的历史原因,许多业务场景仍然不得不依赖它.比如,Kafka.任务调度等.特别是在 Flink ...

  4. 前端使用 Konva 实现可视化设计器(11)- 对齐效果

    这一章补充一个效果,在多选的情况下,对目标进行对齐.基于多选整体区域对齐的基础上,还支持基于其中一个节点进行对齐. 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 I ...

  5. powershell 设置代理

    $env:HTTP_PROXY="http://127.0.0.1:10809" $env:HTTPS_PROXY="http://127.0.0.1:10809&quo ...

  6. Authentication failed. Some common reasons include:

    问题无论是pull.clone还是push都报错 fatal: Out of memory, malloc failed (tried to allocate 301989888 bytes)fata ...

  7. RocketMQ的单节点环境搭建

    1 介绍RocketMQ作为一款纯java.分布式.队列模型的开源消息中间件,支持事务消息.顺序消息.批量消息.定时消息.消息回溯等. 1.1 RocketMQ 特点支持发布/订阅(Pub/Sub)和 ...

  8. ThreadLocal原理详解——终于弄明白了ThreadLocal

    目录 概述 API介绍 ThreadLocal的理解 ThreadLocal的原理分析 总结 概述 在java学习生涯中可能很多人都会听到ThreadLocal变量,从字面上理解ThreadLocal ...

  9. Android 13 - Media框架(10)- NuPlayer::Renderer

    关注公众号免费阅读全文,进入音视频开发技术分享群! 这一节我们来了解 NuPlayer Renderer 是如何工作,avsync 机制是如何运行的. 1.创建 Renderer void NuPla ...

  10. WPF+Emgucv实现在图像上画出感兴趣的区域 并进行掩膜获取 得到图像均值 和简单的 漫水填充

    <Grid.RowDefinitions></Grid.RowDefinitions> <Grid> <UniformGrid Columns="2 ...