简单的量子算法(一):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 ...
随机推荐
- Elasticsearch教程(二)java集成Elasticsearch
1.添加maven <!--tika抽取文件内容 --> <dependency> <groupId>org.apache.tika</groupId> ...
- Delphi 7.0常用函数速查手册(磁盘文件类)
在Delphi 7.0中,已为我们定义好了非常多的函数,大致分类有6种:数据类型转换函数.字符串.数组操作函数.文件.磁盘操作函数.内存.指针操作函数.数学运算函数.日期函数. 在Delphi中调用函 ...
- 手机控制PPT good
以前做了一个小东西,通过手机来控制PPT的翻页,最大化和最小化,东西很简单,近期整理电脑发现了拿来和大家分享一下 主要分为两个部分,客户端和服务器 客户端实现 当初考虑到跨平台的特性就选择了qt来写的 ...
- SpringMVC核心架构的具体流程
核心架构的具体流程步骤如下: 1.首先用户发送请求-->DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行 处理,作为统一访问点,进行全局的流程控 ...
- java高级知识
1. Spring读取配置文件的流程,怎样引入注解? 2. Spring是怎么注入新的java文件的? 3. CAS锁是什么实现机制,在java的哪些包里最常使用?什么情况下会使用CAS锁? 4. 线 ...
- IOS关于数据加密(主要为登录加密)想总结的
首先上来就来说一下,IOS常见的几种加密算法 *哈希(散列)函数 : MD5.SHA *对称加密算法:DES.3DES.AES *非对称加密算法:RSA 一.哈希(散列)函数 1.MD5 MD ...
- 09 audio和vedio标签
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- happy machine learning(First One)
从前几天起我就开始了愉快的机器学习,这里记录一下学习笔记,我看的是吴恩达老师的视频,这篇博客将会按吴老师的教学目录来集合各优良文章,以及部分的我的个人总结 1. 监督学习与无监督学习 监督:给定一个 ...
- python算法与数据结构-栈(43)
一.栈的介绍 栈作为一种数据结构,是一种只能在一端进行插入和删除操作.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读 ...
- 【转】三次握手——https为什么更安全
三次握手与四次挥手: https://blog.csdn.net/legend050709/article/details/39804519 https://blog.csdn.net/luoyoub ...