简单的量子算法(一):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 ...
随机推荐
- 【Windows10 IoT开发系列】“Hello,World!”指导
原文:[Windows10 IoT开发系列]"Hello,World!"指导 本文主要是介绍使用C#来开发一个可以运行在Raspberry Pi2上的一个基本项目. 1.在启动V ...
- visual studio 2017 添加MSDN
原文:visual studio 2017 添加MSDN 1.启动VS2017的安装软件,点击更改,进行MSDN帮助组件添加安装. 2.在单个组件中找到"Help Viewer", ...
- [转] Protobuf高效结构化数据存储格式
从公司的项目源码中看到了这个东西,觉得挺好用的,写篇博客做下小总结.下面的操作以C++为编程语言,protoc的版本为libprotoc 3.2.0. 一.Protobuf? 1. 是什么? Goo ...
- 将后台窗口激活到前台的方法(使用AttachThreadInput和SetForegroundWindow两个API)
下面这种方法是我见到的最理想的,还有一些其他的方法,像通过SetWindowsPos这个API设置窗口的Z-oder到最顶层,再设置回去.还有通过把当前窗口设置到底层,然后激活目标窗口等等方法. HW ...
- 关于Android开发四大组件
文章主要是讲Android开发的四大组件,本文主要分为 文章源自:http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html 一.Act ...
- SYN2306B型 GPS北斗双模授时板
SYN2306B型 GPS北斗双模授时板 产品概述 SYN2306B型GPS北斗双模授时板是由西安同步电子科技有限公司精心设计.自行研发生产的一款双模授时板卡,接收北斗或者GPS北斗混合授时卫星信号, ...
- DHCP服务部署流程
为某一局域网部署DHCP [root@dhcp ~]# yum install -y dhcp[root@dhcp ~]# rpm -ql dhcp/usr/sbin/dhcpd:dhcp服务进程 / ...
- springboot如何读取自定义配置项
我们springboot项目有自己默认的配置文件,一般地由application.yml和bootstrap.yml组成,前者是模块的配置,后者是微服务的配置,后台比前者先被框架加载. 我们有时需要自 ...
- 中转Webshell 绕过安全狗(二)
前言 在实践中转webshell绕过安全狗(一)中,在服务端和客户端均为php.某大佬提示并分享资源后,打算使用python完成中转.部分代码无耻copy. 客户端 本地127.0.0.1,安装pyt ...
- npm设置淘宝代理
npm config set registry https://registry.npm.taobao.org npm info underscore