量子搜索算法 Grover search
问题定义:
Problem:
\(f: \{ 0,1,2,3,……,N-1 \} \rightarrow \{0,1\}\)
找到 \(f(x)=1\) 的x
解法
经典解法:
经典解法很简单,就是把每一个都看一遍,如果只有一个x对应的f(x)=1,那么平均是要看一半,才能找到那个x。
时间复杂度O(N)
量子解法:
使用Grover search 算法,时间复杂度在 \(O(\sqrt N)\)
Grover search 算法
Grover search 算法一共分为两步:
- Phase Inversion
- Inversion about the Mean
然后不断的迭代这两步我们就能够得到结果了。
首先我们先看看这两个步骤分别在做什么:
我们把 $f(x)=1 $ 的 \(|x\rangle\) 称为 \(x^*\) ,我们要找的也就是这个 \(x^*\) 。
Phase Inversion:
这一步主要是把 \(x^*\) 的概率幅翻转,变成负数,而其他的保持不变。
即,把 \(\sum_{x } \alpha_x|x\rangle\) 变成 \(\sum_{x \neq x^*} \alpha_x|x\rangle -\alpha_{x^*}|x^*\rangle\)
Inversion about the Mean
这一步呢,就是把 \(\alpha_x\) 变成 \(2\mu- \alpha_x\)
\(\mu\) 是所有概率幅的平均值,\(\mu= \frac{\sum_x \alpha_x}{N}\)
用图可能更好表达这两个步骤究竟在做什么:

图1到图2,就是Phase Inversion,把\(x^*\)的概率幅翻转到了下面,图2中的虚线就是我的概率幅的平均值,图2到图3 就是我们的Inversion about the Mean,对着平均值翻转一次,其余x的概率幅是高于平均值的,所以 \(2\mu- \alpha_x\) 让他们变小了,而我们的 \(x^*\) 他的概率幅是个负数,所以 \(2\mu- \alpha_x\) 后他增加了。
不断的重复这个步骤, \(x^*\) 他的概率幅会越来越大,最后我们测量的时候就会很容的找到他。
进行了 \(\sqrt N\) 后,他的概率幅就会达到 \(\frac{1}{ \sqrt 2}\) ,算概率就是1/2。
那么接下来的问题就是,这些操作是怎么实现的?
Phase Inversion:
这个步骤要做的事情就是,
把 \(\sum_{x } \alpha_x|x\rangle\) 变成 \(\sum_{x \neq x^*} \alpha_x|x\rangle -\alpha_{x^*}|x^*\rangle\)
符号是和f(x)是否为1相关的,进一步化简就是 \(\sum_x (-1)^{f(x)} \alpha_x|x\rangle\)
有没有一丝熟悉感?
把f(x)的结果给放到相位上去,这是我们在Parity Problem中就遇到的问题。
当时的解决方法是把答案比特变成 \(|-\rangle\)。

一般情况,如果我们打算放置答案的比特是 \(|b\rangle\),那么输入的比特就是\(|b \oplus f(x)\rangle\)
如果f(x)=0 那么\(|( \frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle) \oplus f(x) \rangle = \frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle = |-\rangle\)
如果f(x)=1 那么\(( \frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle) \oplus f(x) \rangle = \frac{1}{\sqrt2}|1\rangle-\frac{1}{\sqrt2}|0\rangle = -|-\rangle\)
最后一个比特的值如果在\(|+\rangle |-\rangle\)坐标下测量,一定是 \(|-\rangle\),f(x)的差别也变到了符号上,即 \((-1)^{f(x)}\)
Inversion about the Mean
把 \(\alpha_x\) 变成 \(2\mu- \alpha_x\) ,这个就要比前一个麻烦了
这其实是要求我把现在的态对着 \(\mu\) 翻转。
对着 \(\mu\) 翻转会吗?
不太会。
但是我会对着 \(|0\rangle\) 的翻转啊。
对角线第一个值为1,其余为-1,非对角线的都为0。
\(\left[ \begin{array}{} 1 & 0 & …& 0 \\ 0 & -1 & …& 0 \\…\\0 & 0 & …& -1 \end{array}\right]\left[ \begin{array}{} a_0\\a_1\\…\\a_{n-1} \end{array}\right]=\left[ \begin{array}{} a_0\\-a_1\\…\\-a_{n-1} \end{array}\right]\)
这个矩阵轻而易举的可以让 \(|0\rangle\) 保持不变,非 \(|0\rangle\) 的符号全都翻转。
量子变换要求矩阵式酉矩阵,这个矩阵很明显满足 \(UU^\dagger=U^\dagger U=I\)
接下来怎么做呢?
我们先把我们的态整体来一个从 \(|\mu\rangle\) 到 \(|0\rangle\) 的旋转,对着 \(|0\rangle\) 翻转后,又从 \(|0\rangle\) 到 \(|\mu\rangle\) 翻转回去。
\(|\mu\rangle\) 是一个怎样的态?
所有的x的概率都一样,也就是我们的superposition \(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\)
\(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\) 和 \(|0\rangle\)之间的相互转换,这就是我们最最熟悉的Hadamard Transform了
第二部分的电路图如下:

这个矩阵是可以直接计算的:

我这里直接给出答案,得到的矩阵值呢是下图左边的这个矩阵:

在对应的 \(\alpha_x\)的结果恰好是 \(\frac{2}{N} \sum _{y=0}^{N} \alpha_y -\alpha_x\)
而 \(\frac{2}{N} \sum _{y=0}^{N} \alpha_y\) 恰好就是 \(2\mu\)
至此,呈上最完整的电路图模块:

第一个H门是数据的初始化,第二个门是为了翻转 \(x^*\),第三四五个门是为了对 \(| \mu \rangle\) 翻转,二三四五这四个门就是要给重复的模块了,不断的重复他们就可以不断的提高 \(x^*\)的概率幅,最终找到 \(x^*\)。
参考资料:
Quantume Mechanics & Quantume Computation Lecture 11
量子搜索算法 Grover search的更多相关文章
- 【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
01 什么是禁忌搜索算法? 1.1 先从爬山算法说起 爬山算法从当前的节点开始,和周围的邻居节点的值进行比较. 如果当前节点是最大的,那么返回当前节点,作为最大值 (既山峰最高点):反之就用最高的邻居 ...
- 量子计算机编程(二)——QPU基础函数
第二部分主要是QPU的基础功能,第一部分就像是我们有了哪些基本的语句,第二部分就是我们能写一些简单基础的函数,一些小模块,第三部分就是他的应用了. 先来看一下一个简单量子应用的结构: 第一步,将量子态 ...
- 1月21日 Reference Data Type 数据类型,算法基础说明,二分搜索算法。(课程内容)
Reference Datat Types 引用参考数据类型 -> 组合数据类型 Array, Hash和程序员自定义的复合资料类型 组合数据的修改: 组合数据类型的变量,不是直接存值,而是存一 ...
- DS18B20数字温度计 (三) 1-WIRE总线 ROM搜索算法和实际测试
目录 DS18B20数字温度计 (一) 电气特性, 寄生供电模式和远距离接线 DS18B20数字温度计 (二) 测温, ROM和CRC算法 DS18B20数字温度计 (三) 1-WIRE总线 ROM搜 ...
- 密码疑云 (3)——详解RSA的加密与解密
上一篇文章介绍了RSA涉及的数学知识,本章将应用这些知识详解RSA的加密与解密. RSA算法的密钥生成过程 密钥的生成是RSA算法的核心,它的密钥对生成过程如下: 1. 选择两个不相等的大素数p和q, ...
- 最新证明面临质疑:P/NP问题为什么这么难?
转自:http://tech.sina.com.cn/d/2017-08-16/doc-ifyixias1432604.shtml 编译 | 张林峰(普林斯顿大学应用数学专业博士研究生) 责编 | 陈 ...
- 为什么我们需要Q#?
原文地址:https://blogs.msdn.microsoft.com/visualstudio/2018/11/15/why-do-we-need-q/ 本文章为机器翻译. 你可能熟悉微软量子的 ...
- Suricata配置文件说明
本系列文章是Suricata官方文档的翻译加上自己对其的理解,部分图片也是来自那篇文章,当然由于初学,很多方面的理解不够透彻,随着深入后面会对本文进行一定的修正和完善. Suricata使用Yaml作 ...
- STL非变易算法 - STL算法
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...
随机推荐
- 001 Ceph简介
一.Ceph简介 Red Hat Ceph是一个分布式的数据对象存储,系统设计旨在性能.可靠性和可扩展性上能够提供优秀的存储服务.Ceph分布式存储能够在一个统一的系统中同时提供了对象.块.和文件存储 ...
- 使用spring框架创建最简单的java web程序(IDEA商业版)
项目目录如下(IDEA社区版好像无法识别webapp目录?原因见https://www.cnblogs.com/bityinjd/p/9284378.html): 工具: IDEA 1.首先使用ma ...
- Serverless 实战 —— Funcraft + OSS + ROS 进行 CI/CD
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...
- linux大盘格式化分区
Linux 实例的磁盘管理 对于 Linux 系统上的大磁盘,也要采用 GPT 分区格式, 也可以不分区, 把磁盘当成一个整体设备使用. 在 Linux 上一般采用 XFS 或者 EXT4 来做大盘的 ...
- Qt listWidget和QListWidgetItem的简单使用
简单的来实习了下 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QListWid ...
- $Luogu2512/CH122/AcWing122$糖果传递 模拟
$Luogu$ $AcWing$ $Description$ 有$n$个小朋友坐成一圈,每人有$a_i$个糖果. 每人只能给左右两人传递糖果. 每人每次传递一个糖果代价为$1$. 求使所有人获得均等 ...
- getopt命令
最近学习了一下getopt(不是getopts)命令来处理执行shell脚本传入的参数,在此记录一下,包括长选项.短选项.以及选项的值出现的空格问题,最后写了个小的脚本来处理输入的参数 首先新建一个t ...
- 能快速理解Java_集合类_的文章
目录 @ 这篇文章是我学习完Java集合类做的笔记和总结,如果你想认真细读这篇文章,请做好受虐的准备(建议电脑看),因为这篇文章有点长,ヽ(ー_ー)ノ. 如果在看我这篇文章过程中,发现了错误,望指点. ...
- 【转】[IT综合面试]牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
感谢IT面试群 S-北京-陈磊 的整理分享. 基础篇:操作系统.计算机网络.设计模式 提高篇:WIN32.MFC与Linux 算法篇:算法与数据结构 一:操作系 ...
- Zookeeeper的安装与集群搭建
简介 Zookeeper下载 官网地址:点我直达 百度云盘:点我直达 踩坑录 官网下载一定要下载带bin的 要不然zookeeper起不起来,找不到加载类,原来从版本3.5.5开始,带有bin名称的包 ...