简单的量子算法(一):Hadamard 变换、Parity Problem
Hadamard Transform
Hadamard 变换在量子逻辑门中提过,只不过那时是单量子的Hadamard门,负责把\(|1\rangle\)变成\(|-\rangle\),\(|0\rangle\)变成\(|+\rangle\)。
那么对多量子的Hadamard门呢?
对于多量子逻辑门,其实说过一句,是单量子逻辑门的张量积。
对于多量子比特的Hadamard门,就是把每一个量子比特都由\(|1\rangle\)变成\(|-\rangle\),\(|0\rangle\)变成\(|+\rangle\),或者\(|-\rangle\)变成\(|1\rangle\),\(|+\rangle\)变成$|0\rangle $ 。如果是n个比特,那么这n比特的Hadamard门就可以写作是 \(H^{\otimes n}\) ,矩阵表达就是 \(H^{\otimes n}=\left[ \begin{array}{}{\frac{1}{\sqrt2}} &{\frac{1}{\sqrt2}} \\ {\frac{1}{\sqrt2}}&{-\frac{1}{\sqrt2}} \end{array}\right] \otimes ……\otimes \left[ \begin{array}{}{\frac{1}{\sqrt2}} &{\frac{1}{\sqrt2}} \\ {\frac{1}{\sqrt2}}&{-\frac{1}{\sqrt2}} \end{array}\right]\) (张量积n次)
对于\(|0\rangle\),变成\(\frac{1}{\sqrt2}|0\rangle+\frac{1}{\sqrt2}|1\rangle\)。
对于\(|00\rangle\),变成\((\frac{1}{\sqrt2}|0\rangle+\frac{1}{\sqrt2}|1\rangle)(\frac{1}{\sqrt2}|0\rangle+\frac{1}{\sqrt2}|1\rangle)\) ,即 \(\frac{1}{2}|00\rangle+\frac{1}{2}|01\rangle+\frac{1}{2}|10\rangle+\frac{1}{2}|11\rangle\) 可能性均等的所有可能 的叠加。
那么对于n个 \(|0\rangle\) 呢?则是变成了 \(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\) ,x是由0、1组成的所有的长度为n的数字串。
那么更进一步,如果我的n比特不是 \(|0\rangle\),而是 \(|0\rangle\) 、 \(|1\rangle\) 随意切换呢?比如数字串 \(|u\rangle=|u_1u_2……u_n\rangle\) ,如果输入是 \(|u\rangle\) ,那么经过H门变换,输出会是什么?
输出是:\(\sum_x \frac{-1^{u·x}}{2^{\frac{n}{2}}} |x\rangle\) ,这里 \(u·x=u_1x_1+u_2x_2+……+u_nx_n\)
原因如下:
对于\(|0\rangle\),H门变成\(\frac{1}{\sqrt2}|0\rangle+\frac{1}{\sqrt2}|1\rangle\)
对于\(|1\rangle\),H门变成\(\frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle\)
如果想要有一个负号,则需要这一位在输入的时候是\(|1\rangle\) ,并且输出的时候也是 \(|1\rangle\) ,同时,如果在这个数字串中这种情况出现了偶数次(即有偶数位的比特在输入输出的时候都是\(|1\rangle\)),那么整体情况就会是负负得正,所以我们将每位的情况相乘,再连加(对于不会造成负号的情况,他们相乘的结果是0),作为-1的指数来标明符号。
而以上的变换,在量子计算中又称为Fourier Sampling。
整理一下本小节的内容: \(H^{\otimes n} |u\rangle = \sum_x \frac{-1^{u·x}}{2^{\frac{n}{2}}} |x\rangle\) ,他将我们的输入数据给移到了符号上面去。
Parity Problem
这个问题是hadamard变换的简单应用。
假设: 有这么一个黑盒子 把长度为n的0、1数字串映射成0或者1一个数字 \(f: \{ 0,1 \}^n \rightarrow \{0,1 \}\) ,已知映射的规则如下 \(f(x)=u·x=u_1x_1+u_2x_2+……+u_nx_n \mod 2\) 模2的意思是如果是累加的和是奇数,那么就是1,偶数就是0
问题:请问,我至少需要试几次,才能知道u是什么?
经典解法:
输入100……0 得到\(u_1\) 的值
输入010……0 得到\(u_2\) 的值
输入001……0 得到\(u_3\) 的值
……
输入000……1 得到\(u_n\) 的值
因为我们的输出结果只有一位的信息,而u的全部信息有n位,所以我们至少也需要n次。
量子解法:
这个量子解法又叫做 Bernstein-Vazirani算法,一共只有两步:
一、制造出一个量子叠加态 : $\frac{1}{2^{n/2}}\sum_x (-1)^{f(x)} |x\rangle $
二、对这个叠加态fourier sampling
why?
对于第一步我们需要制备出来的量子叠加态,不知道大家有没有眼熟,这个是我们上一节的结论,将\(|u\rangle\) 作为H门的输出得到的结果一模一样。
我们已经知道了量子计算是可逆的,对于H门来说,连续两个的H门操作就是完全抵消的,第一个H门将\(|0\rangle\)变成\(|+\rangle\),第二个H门又将\(|+\rangle\)变成\(|0\rangle\)。
所以,我们能够将$\frac{1}{2^{n/2}}\sum_x (-1)^{f(x)} |x\rangle $用H门变换出来,把f(x)的值移到符号上,那么我们也可以通过H门把符号上的f(x)移到输出里,只需要一个同样的H门操作,也就是我们的第二步。
所以现在的问题变成了,如果制备叠加态 $\frac{1}{2^{n/2}}\sum_x (-1)^{f(x)} |x\rangle $ 呢?
在量子电路里面我们已经讨论过了,一个量子的电路,为了让他可逆,我们一般是输入 \(|x\rangle|b\rangle\) 然后输出是 \(|x\rangle |b \oplus f(x) \rangle\) 把输入的结果f(x)模2加到b上。
因为是需要所有的x,所以首先用H门,将n比特的 \(|0\rangle\) 变成所有状态均可能的叠加态 \(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\) 。
接下来,把 \(|-\rangle =\frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle\) 作为 \(|b\rangle\) 和前面的叠加态 \(\frac{1}{2^{\frac{n}{2}}} \sum_{x \in \{0,1 \}^n}|x\rangle\) 一起输入 \(U_f\) 。
此时输入是 \(\frac{1}{2^{\frac{n}{2}}} \sum_x |x\rangle |-\rangle\)
输出是 \(\frac{1}{2^{\frac{n}{2}}} \sum_x |x\rangle |- \oplus f(x) \rangle\)
如果f(x)=0 那么\(|- \oplus f(x) \rangle = \frac{1}{\sqrt2}|0\rangle-\frac{1}{\sqrt2}|1\rangle = |-\rangle\)
如果f(x)=1 那么\(|- \oplus f(x) \rangle = \frac{1}{\sqrt2}|1\rangle-\frac{1}{\sqrt2}|0\rangle = -|-\rangle\)
最后一个比特的值如果在\(|+\rangle |-\rangle\)坐标下测量,一定是 \(|-\rangle\),f(x)的差别也变到了符号上,即 \((-1)^{f(x)}\)
此时,我们的输出已经是 \(\frac{1}{2^{n/2}}\sum_x (-1)^{f(x)} |x\rangle |-\rangle\) ,只看前面的部分,就是我们需要的叠加态了。
概括一下,概括一下,通过H门制备出一个均等可能的态,然后和 \(|-\rangle\) 一起通过 \(U_f\) 将f(x)的结果移到符号上,最后再次通过H门,把符号上的结果移下来,整个电路图如下图所示,非常的简单,在经典算法需要多项式时间的时候,量子算法只需要常数的时间。

下一篇的内容是simon's Algorithm是在parity Problem的又一个进化,也是基于H门的,所以说H门很重要啊,基本上所有的量子算法不管要干嘛,先来一个H门再说,毕竟这个是用n比特同时表达 \(2^n\) 个数据的法宝。
参考资料:
Quantume Mechanics & Quantume Computation Lecture 8
简单的量子算法(一):Hadamard 变换、Parity Problem的更多相关文章
- 简单的量子算法(二):Simon's Algorithm
前情回顾: 简单的量子算法(一):Hadamard 变换.Parity Problem 好的,现在开始正版的故事,Simon's Algorithm 问题: 有一个secret string,是n位的 ...
- 笔记 | 第一个量子算法:Deutsch-Jozsa算法,非常好懂!
<关于胡小兔的博客又诈尸了这件事> 信息物理真是难啊!上节课讲了量子计算的最基础的概念和Deutsch-Jozsa算法,我看了好几天才看懂-- 等考完试估计我就忘了,所以今天先写个博客给未 ...
- 非刚性图像配准 matlab简单示例 demons算法
2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...
- 如何简单解释 MapReduce算法
原文地址:如何简单解释 MapReduce 算法 在Hackbright做导师期间,我被要求向技术背景有限的学生解释MapReduce算法,于是我想出了一个有趣的例子,用以阐释它是如何工作的. 例子 ...
- 简单的PHP算法题
简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...
- 冒泡排序算法和简单选择排序算法的js实现
之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...
- java实现简单回文算法
算法要求 编写一个程序,判断一个字符串是否为"回文".回文串:字符串字符从前往后与从后往前一致(中心对称). 算法思路 首先将字符串等分左右两块,然后依次对称比较每一对字符是否相同 ...
- sklearn简单实现机器学习算法记录
sklearn简单实现机器学习算法记录 需要引入最重要的库:Scikit-learn 一.KNN算法 from sklearn import datasets from sklearn.model_s ...
- 史上最简单的排序算法?看起来却满是bug
大家好,我是雨乐. 今天在搜论文的时候,偶然发现一篇文章,名为<Is this the simplest (and most surprising) sorting algorithm ever ...
随机推荐
- Delphi下IOC 模式的实现(反转模式,即Callback模式)
IOC英文为 Inversion of Control,即反转模式,这里有著名的好莱坞理论:你呆着别动,到时我会找你.Ioc模式是解决调用者和被调用者之间关系的模式,可以有效降低软件的耦合度,并适合团 ...
- 使用VS2010开发Qt程序的4点经验(QT4到QT5的升级,更改sln文件,切换工程使用的Qt库,在VS的Solution Explorer视图中建立文件夹)
导读 相比于Qt Creator,我更喜欢用VS2010来进行开发.虽然启动时间相对较慢,但是VS下强大的快捷键和丰富的插件,以及使用多年的经验,都让我觉得在开发过程中得心应手.其中最重要的一点是,有 ...
- axios和vuex
0.babel 将es6代码转换成各个浏览器都能识别的代码 一.axios 1.官方网站 https://www.kancloud.cn/yunye/axios/234845 2.引用: (1)cdn ...
- bootstrap模态框篇【遇到的问题】
<div class="modal fade" tabindex="-1" role="dialog"> <div cl ...
- 搭建基于.NetFrameWork的私有nuget服务端及打包项目发布上传
一.私有Nuget服务端搭建 1.创建一个.NetFramework web项目 2.在nuget管理中 安装 nuget.server包 3.安装完成后修改web.config里面的 apikey ...
- ABP开发框架前后端开发系列---(5)Web API调用类在Winform项目中的使用
在前面几篇随笔介绍了我对ABP框架的改造,包括对ABP总体的介绍,以及对各个业务分层的简化,Web API 客户端封装层的设计,使得我们基于ABP框架的整体方案越来越清晰化, 也越来越接近实际的项目开 ...
- Laravel --- 如何较优雅的使用公用函数
一.创建公用文件 App/Helpers/CommonHelper.php 二.创建Provider php artisan make:provider HelperServiceProvider C ...
- C语言之父Dennis Ritchie告诉你:如何成为世界上最好的程序员?
文/Ohans Emmanuel 译/网易云信 想要阅读更多技术干货文章,欢迎关注网易云信博客. 了解网易云信,来自网易核心架构的通信与视频云服务. 我不知道如何成为世界上最好的程序员.但是,我们可以 ...
- ZooKeeper学习之路(四)—— Java 客户端 Apache Curator
一.基本依赖 Curator是Netflix公司开源的一个Zookeeper客户端,目前由Apache进行维护.与Zookeeper原生客户端相比,Curator的抽象层次更高,功能也更加丰富,是目前 ...
- 第三章: Expressions and Flow Control
第三章: Expressions and Flow Control一:局部变量和实例变量定义变量是指设定变量的数据类型和变量的名字,Java语言要求变量遵循先定义,再初始化,然后使用的规则.作用域:指 ...