《关于胡小兔的博客又诈尸了这件事》

信息物理真是难啊!上节课讲了量子计算的最基础的概念和Deutsch-Jozsa算法,我看了好几天才看懂……

等考完试估计我就忘了,所以今天先写个博客给未来的我讲讲!

前置技能

// 这部分暂时鸽了。

// 信女愿在博客更新量子计算基础合集,只求小学期两门A-……

// 不过安利一个网站:IBM的量子计算教程,还可以用IBM的qiskit库实践!而且这个网站的颜值真的很高2333

Deutsch算法

众所周知,量子计算机可以利用量子比特(qubit)的叠加态,实现并行计算,从而快速计算一些传统计算机上复杂度很高的问题。但是这种并行计算是怎么实现的呢……?为了理解量子并行,我们找到了一个很好的例子——Deutsch算法。顾名思义,学会这个Deutsch算法,你的Deutsch-Jozsa就学会一大半了(雾

目标

有一个未知的黑盒\(f: \{0, 1\} \rightarrow \{0, 1\}\),求\(f(0) \oplus f(1)\)(\(\oplus\)表示异或)。

传统算法

在传统计算机上,我们必须调用\(f\)函数两次,一次求\(f(0)\),一次求\(f(1)\),再异或起来,得到答案。但是在量子电路中,只需要一次计算!

量子算法

Deutsch算法就是如下的电路:

其中,中间那个大方块\(U_f\)是一个特殊的门,输入\(x\)和\(y\),输出\(x\)和\(y\oplus f(x)\)。三个\(H\)门是Hadamard门,要记得:

\[H|0\rangle = |+\rangle = (|0\rangle + |1\rangle)/\sqrt2
\]

\[H|1\rangle = |-\rangle = (|0\rangle - |1\rangle)/\sqrt2
\]

\[H|+\rangle = |0\rangle
\]

\[H|-\rangle = |1\rangle
\]

电路的输入是固定的:\(H|\psi_0\rangle = |01\rangle\)。接下来,我们来算一下\(|\psi_1\rangle, |\psi_2\rangle, |\psi_3\rangle\)都是什么,然后就知道测量结果和\(f\)的关系了!

刚刚说过,\(H|0\rangle = |+\rangle = (|0\rangle + |1\rangle)/\sqrt2, H|1\rangle = |-\rangle = (|0\rangle - |1\rangle)/\sqrt2\),所以

\[|\psi_1\rangle = (H|0\rangle)(H|1\rangle) = (|0\rangle + |1\rangle)(|0\rangle - |1\rangle)/2.
\]

接下来就要考虑这个\(U_f\)了。为了计算方便,我们先设它第一个输入值是\(|x\rangle\),第二个输入值直接代入\((|0\rangle - |1\rangle)/\sqrt2\)。那么,

\[\begin{aligned}
U_f |x\rangle (|0\rangle - |1\rangle)/\sqrt2 &= |x\rangle (|f(x)\rangle - |1\oplus f(x)\rangle)/\sqrt2 \\
&= \begin{cases}
|x\rangle (|0\rangle - |1\rangle)/\sqrt2, \text{ if }f(x) = 0, \\
|x\rangle (|1\rangle - |0\rangle)/\sqrt2, \text{ if }f(x) = 1 \\
\end{cases}\\
&= (-1)^{f(x)} |x\rangle (|0\rangle - |1\rangle)/\sqrt2.
\end{aligned}\]

看起来非常的简洁!

接下来把\(x = (|0\rangle + |1\rangle) / \sqrt2\)代进去:

\[\begin{aligned}
|\psi_2\rangle &= U_f (|0\rangle + |1\rangle)(|0\rangle - |1\rangle)/2 \\
&= \left[(-1)^{f(0)} |0\rangle + (-1)^{f(1)} |1\rangle\right] (|0\rangle - |1\rangle)/2 \\
&= (-1)^{f(0)} \left[|0\rangle + (-1)^{f(0)\oplus f(1)} |1\rangle\right] (|0\rangle - |1\rangle)/2. \\
\end{aligned}\]

其实分开写就是

\[ |\psi_2\rangle = \begin{cases}
(-1)^{f(0)}|+\rangle|-\rangle, \text{ if }f(0) \oplus f(1) = 0, \\
(-1)^{f(0)}|-\rangle|-\rangle, \text{ if }f(0) \oplus f(1) = 1. \\
\end{cases}\]

但是我们实在不喜欢\(|+\rangle\)和\(|-\rangle\),还是更喜欢\(|0\rangle\)和\(|1\rangle\)。于是我们又在第一条输出线路上加了一个H门,把\(|+\rangle\)和\(|-\rangle\)转换回\(|0\rangle\)和\(|1\rangle\)。这样,\(|\psi_{3L}\rangle\)(就是\(|\psi_3\rangle\)中的第一个qubit,即右上角被测量的那个比特)就是:

\[ |\psi_{3L}\rangle = \begin{cases}
(-1)^{f(0)}|0\rangle, \text{ if }f(0) \oplus f(1) = 0, \\
(-1)^{f(0)}|1\rangle, \text{ if }f(0) \oplus f(1) = 1. \\
\end{cases}\]

这样我们只需要沿\(|0\rangle\)测量一下\(|\psi_{3L}\rangle\),测出\(|0\rangle\)就说明\(f(0) \oplus f(1) = 0\),反之就说明\(f(0) \oplus f(1) = 1\),这样就可以100%确定\(f(0) \oplus f(1)\)的值了!至此就是Deutsch算法的内容。

神奇的地方在于:在量子版的算法中,我们只调用了一次\(U_f\)!而在传统计算机上,我们至少要调用两次\(f\)。你可能会说:差个常数2有啥大不了的嘛!确实,在Deutsch算法并没有在复杂度上体现出量子算法的优越性,但是接下来的Deutsch-Jozsa算法就能体现出本质上的差异了!

Deutsch-Jozsa算法

目标

有一个未知的黑盒\(f: \{0, 1\}^n \rightarrow \{0, 1\}\),\(f\)可能有以下两种性质之一:

  • f是常函数
  • f是均匀的(balanced)。这里均匀指的是:\(f(x)\)对于恰好一半的\(x\)得\(0\),而对另恰好一半的\(x\)得\(1\)。

求\(f\)具有以上两种性质中的哪一种。

量子算法

Deutsch-Jozsa算法的电路图:

上面那“一条”线路实际上是\(n\)条,左上角的\(\not-^n\)符号表示这条线路代表\(n\)条线路。输入也随之变成了\(|\psi_0\rangle = |0\rangle^{\otimes n}|1\rangle\)。可以发现,Deutsch-Jozsa算法的电路图除了把第一条线路扩成了\(n\)条之外,和Deutsch算法的电路图并没有什么区别。(是不是突然有自信看懂了!)

让我们再用熟悉的方法,逐个计算\(|\psi_0\rangle, |\psi_1\rangle, |\psi_2\rangle, |\psi_3\rangle\)。

\[\begin{aligned}
|\psi_1\rangle &= (H|0\rangle^{\otimes n})(H|1\rangle) \\
&= \frac{1}{\sqrt2^n}(|0\rangle + |1\rangle)\otimes(|0\rangle + |1\rangle)\otimes\cdots\otimes(|0\rangle + |1\rangle)\otimes(|0\rangle - |1\rangle)/\sqrt2\\
&= \frac{1}{\sqrt2^n} \sum_{x\in \{0, 1\}^n} |x\rangle (|0\rangle - |1\rangle) / \sqrt2.\\
|\psi_2\rangle &= U_f |\psi_1\rangle = \frac{1}{\sqrt2^n} \sum_{x\in \{0, 1\}^n} (-1)^{f(x)} |x\rangle (|0\rangle - |1\rangle) / \sqrt2.
\end{aligned}\]

最后一步,我们要计算\(|\psi_{3L}\rangle = H|\psi_2\rangle\)。这一步稍微有点难算,再坚持一下!

考虑单个qubit\(x_1\),有

\(H|x_1\rangle = \sum_{z_1 \in \{0, 1\}} (-1)^{x_1z_1} |z_1\rangle\),

那么对\(n\)个qubit组成的\(|x\rangle\),有

\[H|x\rangle = H|x_1 x_2 \cdots x_n\rangle = \sum_{z \in \{0, 1\}^n} (-1)^{\sum_i x_i z_i} |z\rangle / \sqrt2^n.
\]

所以

\[|\psi_{3L}\rangle = \frac{1}{\sqrt2^n} \sum_{x\in \{0, 1\}^n} (-1)^{f(x)} H|x\rangle = \frac1{2^n} \sum_{x \in \{0, 1\}^n} (-1)^{f(x)} \sum_{z \in \{0, 1\}^n} (-1)^{\sum_i x_i z_i} |z\rangle.
\]

接下来我们测量一下\(|\psi_{3L}\rangle\),见证奇迹的时刻到了!

测得\(|0\rangle^{\otimes n}\)的概率是:

\[\langle \psi_{3L} | 0 \rangle \langle 0 | \psi_{3L} \rangle = \left(\frac1{2^n} \sum_{x\in \{0, 1\}^n} (-1)^{f(x)}\right)^2,
\]

因为除了\(| 0 \rangle\)以外的\(| z \rangle\)都和\(| 0 \rangle\)垂直,内积是0,所以其他项都没了,只剩下\(| z \rangle = | 0 \rangle\)的这一项。

当\(f\)是常函数时,所有\((-1)^{f(x)}\)都相等,\(\sum_{x\in \{0, 1\}^n} (-1)^{f(x)} = \pm 1\),平方之后就等于\(1\),所以测出\(|0\rangle^{\otimes n}\)的概率是1;

当\(f\)是均匀的函数时,一半\((-1)^{f(x)} = 1\),另一半\((-1)^{f(x)} = -1\),\(\sum_{x\in \{0, 1\}^n} (-1)^{f(x)} = 0\),平方之后依然等于\(0\),所以测出\(|0\rangle^{\otimes n}\)的概率是0。

这样,只需运行这个电路一次,就可以100%确定\(f\)的性质了!

一些常见的困惑

Q:啥是量子计算……啥是qubit……

A:反正大概是OI用不到的东西……Qiskit Textbook欢迎你!(再次免费打广告)

Q:不是啊,你连\(f\)是啥都不知道,你这个\(U_f\)咋从\(f\)构建出来的啊?

A:好问题!答案是,并不知道怎么构建……这个算法应用的场景其实是“给出一个量子黑盒\(U_f\)”,而不是给出\(f\)。(如果给出\(f\),把\(f\)读进来、搞出一个真值表的复杂度就有\(2^n\)了……总之这个算法解决的问题不是这个。)

Q:只看上面那条线路,\(U_f\)对于\(|x\rangle\)不是相当于单位矩阵\(I_n\)一样,没有产生改变嘛?为啥第一条线路输出的不是\(H^{\otimes n}I_nH^{\otimes n}|0\rangle^{\otimes n} = |0\rangle^{\otimes n}\)呢?

A:好、好问题!问题出在“\(U_f\)对于\(|x\rangle\)相当于单位矩阵\(I_n\)”这句话上。事实上,\(U_f\)并不能写作\(I_n \otimes U_f'\)的形式,也就是说\(U_f\)并不能分成两个矩阵分别影响上下两条线路。

Q:我还是不明白。\(|x\rangle\)是\(|0\rangle^{\otimes n}\)经过H门后得到的,再经过一次H门为啥没变回去???

A:换种说法,经过\(U_f\)门之后,上下两条线路(\(|x\rangle\)和\(|y\rangle \oplus f(x)\))发生了纠缠,所以\(U_f\)门输出的“两条线路”也无法分成“\(|x\rangle \otimes (|y\rangle \oplus f(x))\)”这样的“张量积”形式,因而不能分开单独考虑了。

Q:所以这个算法有啥用处吗?

A:它的用处大概是……帮你理解量子并行计算,证明量子并行计算与传统计算机相比有优越之处。现在看起来,Deutsch-Jozsa算法解决的问题或许没啥用处,但或许以后类似的方法能解决更重要的问题吧~(现学现卖,并未深入了解 =_=|||)


以上就是Deutsch-Jozsa算法的讲解啦,我也刚学,可能有很多错误,欢迎大佬指正!>v<

笔记 | 第一个量子算法:Deutsch-Jozsa算法,非常好懂!的更多相关文章

  1. [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...

  2. 数据结构(逻辑结构,物理结构,特点) C#多线程编程的同步也线程安全 C#多线程编程笔记 String 与 StringBuilder (StringBuffer) 数据结构与算法-初体验(极客专栏)

    数据结构(逻辑结构,物理结构,特点) 一.数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关.逻辑结构包括: 集合 数 ...

  3. Python机器学习笔记:K-Means算法,DBSCAN算法

    K-Means算法 K-Means 算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means 算法有大量的变体,本文就从最传统的K-Means算法学起,在其基础上学习 ...

  4. 行为识别笔记:improved dense trajectories算法(iDT算法)(转载)

    iDT算法是行为识别领域中非常经典的一种算法,在深度学习应用于该领域前也是效果最好的算法.由INRIA的IEAR实验室于2013年发表于ICCV.目前基于深度学习的行为识别算法效果已经超过了iDT算法 ...

  5. [转]Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)

    转自http://blog.csdn.net/c406495762/article/details/75172850 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一 简 ...

  6. 深度学习课程笔记(三)Backpropagation 反向传播算法

    深度学习课程笔记(三)Backpropagation 反向传播算法 2017.10.06  材料来自:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS1 ...

  7. 《Algorithms算法》笔记:元素排序(3)——洗牌算法

    <Algorithms算法>笔记:元素排序(3)——洗牌算法 Algorithms算法笔记元素排序3洗牌算法 洗牌算法 排序洗牌 Knuth洗牌 Knuth洗牌代码 洗牌算法 洗牌的思想很 ...

  8. 《java并发编程实战》读书笔记12--原子变量,非阻塞算法,CAS

    第15章 原子变量与非阻塞同步机制 近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令(例如比较并交换指令)代替锁老确保数据在并发访问中的一致性. 15.1 锁的劣势 ...

  9. Java 中级 学习笔记 2 JVM GC 垃圾回收与算法

    前言 在上一节的学习中,已经了解到了关于JVM 内存相关的内容,比如JVM 内存的划分,以及JDK8当中对于元空间的定义,最后就是字符串常量池等基本概念以及容易混淆的内容,我们都已经做过一次总结了.不 ...

随机推荐

  1. PYTHON实战完整教程1-配置VSCode开发环境

    一.安装 为降低学习门槛,保证学习目标的聚焦,我们在windows(使用WinServer2019虚拟机)上搭建开发环境.(系列教程最后结束时,也会部署到linux上) 打开Python官网 http ...

  2. cudnn加速计算

    cudnn加速运算 torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True 第一句话是说,使用的是非确定性算 ...

  3. C# 使用代理实现线程间调用

    实现功能: 后台线程改变窗体控件(flowLayoutPanel1)的状态. 利用 this.flowLayoutPanel1.InvokeRequired == false,可以知道是主线程调用的自 ...

  4. java数组与数组异常

    一 数组的定义 1.第一种定义方法: 格式: 数据类型[] 数组名=new 数据类型[数组长度] 2.第二种定义方法: 格式: 类型[] 数组名 = new 类型[]{元素,元素,.....} 3.第 ...

  5. C#LeetCode刷题之#622-设计循环队列​​​​​​​(Design Circular Queue)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4126 访问. 设计你的循环队列实现. 循环队列是一种线性数据结构 ...

  6. C#LeetCode刷题之#717-1比特与2比特字符( 1-bit and 2-bit Characters)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3740 访问. 有两种特殊字符.第一种字符可以用一比特0来表示.第 ...

  7. do...while循环语句(水仙花)

    #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h&g ...

  8. 教你如何使用ES6的Promise对象

    教你如何使用ES6的Promise对象 Promise对象,ES6新增的一个全新特性,这个是 ES6中非常重要的一个对象 Promise的设计初衷 首先,我们先一起了解一下,为什么要设计出这么一个玩意 ...

  9. 碰到 Json_CSRF 怎么办?

    前言 在最近挖洞的时候,老是碰到 POST 传参采用 JSON 格式,而不是传统的parameter=value的格式,之前也没接触过,所以也不知道该怎么搞,所以打算学习一下,此文作为一个笔记梳理. ...

  10. (java)剑指offer二维数组中的查找

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从 上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. pu ...