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的更多相关文章

  1. 简单的量子算法(二):Simon's Algorithm

    前情回顾: 简单的量子算法(一):Hadamard 变换.Parity Problem 好的,现在开始正版的故事,Simon's Algorithm 问题: 有一个secret string,是n位的 ...

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

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

  3. 非刚性图像配准 matlab简单示例 demons算法

    2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...

  4. 如何简单解释 MapReduce算法

    原文地址:如何简单解释 MapReduce 算法 在Hackbright做导师期间,我被要求向技术背景有限的学生解释MapReduce算法,于是我想出了一个有趣的例子,用以阐释它是如何工作的. 例子 ...

  5. 简单的PHP算法题

    简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...

  6. 冒泡排序算法和简单选择排序算法的js实现

    之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...

  7. java实现简单回文算法

    算法要求 编写一个程序,判断一个字符串是否为"回文".回文串:字符串字符从前往后与从后往前一致(中心对称). 算法思路 首先将字符串等分左右两块,然后依次对称比较每一对字符是否相同 ...

  8. sklearn简单实现机器学习算法记录

    sklearn简单实现机器学习算法记录 需要引入最重要的库:Scikit-learn 一.KNN算法 from sklearn import datasets from sklearn.model_s ...

  9. 史上最简单的排序算法?看起来却满是bug

    大家好,我是雨乐. 今天在搜论文的时候,偶然发现一篇文章,名为<Is this the simplest (and most surprising) sorting algorithm ever ...

随机推荐

  1. KmdKit4D 0.01正式版发布了(0.02版已放出)(Delphi做驱动)

    此版本较0.01预览版已经有了脱胎换骨的变化,主要表现在以下几个方面:    1.对程序的结构进行了调整,将原来的ntutils.dcu分成fcall.dcu.halfcall.dcu和macros. ...

  2. C++界面库(十几种,很全)

    刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自 ...

  3. Qt - 设置程序界面风格(现成的QMacStyle等等)

    类的继承关系: QMotifStyle:OSF(开放基金协会)开发的一个工业标准的GUI(图形用户接口): QCDEStyle:公共桌面环境(Common Desktop Environment)的缩 ...

  4. String的所有方法以及解释

    capitalize() 把字符串的第一个字符改为大写 casefold() 把整个字符串的所有字符改为小写 center(width) 将字符串居中,并使用空格填充至长度 width 的新字符串 c ...

  5. Centos7 fstab盘符挂载硬盘导致重启系统失败解决办法

    服务器拥有多个硬盘插槽,在进行维护或重启时,这些硬盘的相对位置可能发生变化.利用盘符(dev/vda)方式挂载磁盘,可能由于磁盘顺序变化导致重启时读取fstab文件发生错误,从而无法正常重启服务器. ...

  6. Kafka 学习之路(三)—— Kafka生产者详解

    一.生产者发送消息的过程 首先介绍一下Kafka生产者发送消息的过程: Kafka会将发送消息包装为ProducerRecord对象, ProducerRecord对象包含了目标主题和要发送的内容,同 ...

  7. 在java项目启动时就执行某操作

    在java启动时大概有四种,此处只介绍3种 1.在启动的方法上使用通过@PostConstruct方法实现初始化bean进行操作 2.通过bean实现InitializingBean接口 @Overr ...

  8. 长春理工大学第十四届程序设计竞赛(重现赛)L

    L.Homework Stream 题目链接:https://ac.nowcoder.com/acm/contest/912/L 题目 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图 ...

  9. 如何用css实线所需要的小三角

    使用css实现三角符号 关于使用css制作三角符号,网上有很多的例子了,在这里只是为了详细的向各位解释一下三角符号的原理 下图,是一个长宽为100px,边框宽度为100px的一个元素,由此可见,在cs ...

  10. node.js + mssql 简易封装操作

    时间吧,总是这么凑巧,在我学习[node.js]还没几天,我的 Microsoft SQL Server Management Studio 18 就歇菜了,至于怎么歇菜的吧....它可能的意思就是想 ...