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

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

信息物理真是难啊!上节课讲了量子计算的最基础的概念和Deutsch-Jozsa算法,我看了好几天才看懂……
等考完试估计我就忘了,所以今天先写个博客给未来的我讲讲!

前置技能

// 这部分暂时鸽了。
// 信女愿在博客更新量子计算基础合集,只求小学期两门A-……
// 不过安利一个网站:IBM的量子计算教程,还可以用IBM的qiskit库实践!而且这个网站的颜值真的很高2333

Deutsch算法

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

目标

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

传统算法

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

量子算法

Deutsch算法就是如下的电路:

其中,中间那个大方块Uf是一个特殊的门,输入xy,输出xyf(x)。三个H门是Hadamard门,要记得:

H|0=|+=(|0+|1)/2

H|1=|=(|0|1)/2

H|+=|0

H|=|1

电路的输入是固定的:H|ψ0=|01。接下来,我们来算一下|ψ1,|ψ2,|ψ3都是什么,然后就知道测量结果和f的关系了!

刚刚说过,H|0=|+=(|0+|1)/2,H|1=|=(|0|1)/2,所以

|ψ1=(H|0)(H|1)=(|0+|1)(|0|1)/2.

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

Uf|x(|0|1)/2=|x(|f(x)|1f(x))/2={|x(|0|1)/2, if f(x)=0,|x(|1|0)/2, if f(x)=1=(1)f(x)|x(|0|1)/2.

看起来非常的简洁!

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

|ψ2=Uf(|0+|1)(|0|1)/2=[(1)f(0)|0+(1)f(1)|1](|0|1)/2=(1)f(0)[|0+(1)f(0)f(1)|1](|0|1)/2.

其实分开写就是

|ψ2={(1)f(0)|+|, if f(0)f(1)=0,(1)f(0)||, if f(0)f(1)=1.

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

|ψ3L={(1)f(0)|0, if f(0)f(1)=0,(1)f(0)|1, if f(0)f(1)=1.

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

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

Deutsch-Jozsa算法

目标

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

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

f具有以上两种性质中的哪一种。

量子算法

Deutsch-Jozsa算法的电路图:

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

让我们再用熟悉的方法,逐个计算|ψ0,|ψ1,|ψ2,|ψ3

|ψ1=(H|0n)(H|1)=12n(|0+|1)(|0+|1)(|0+|1)(|0|1)/2=12nx{0,1}n|x(|0|1)/2.|ψ2=Uf|ψ1=12nx{0,1}n(1)f(x)|x(|0|1)/2.

最后一步,我们要计算|ψ3L=H|ψ2。这一步稍微有点难算,再坚持一下!

考虑单个qubitx1,有
H|x1=z1{0,1}(1)x1z1|z1
那么对n个qubit组成的|x,有

H|x=H|x1x2xn=z{0,1}n(1)ixizi|z/2n.

所以

|ψ3L=12nx{0,1}n(1)f(x)H|x=12nx{0,1}n(1)f(x)z{0,1}n(1)ixizi|z.

接下来我们测量一下|ψ3L,见证奇迹的时刻到了!

测得|0n的概率是:

ψ3L|00|ψ3L=(12nx{0,1}n(1)f(x))2,

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

f是常函数时,所有(1)f(x)都相等,x{0,1}n(1)f(x)=±1,平方之后就等于1,所以测出|0n的概率是1;
f是均匀的函数时,一半(1)f(x)=1,另一半(1)f(x)=1x{0,1}n(1)f(x)=0,平方之后依然等于0,所以测出|0n的概率是0。

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

一些常见的困惑

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

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

Q:只看上面那条线路,Uf对于|x不是相当于单位矩阵In一样,没有产生改变嘛?为啥第一条线路输出的不是HnInHn|0n=|0n呢?
A:好、好问题!问题出在“Uf对于|x相当于单位矩阵In”这句话上。事实上,Uf并不能写作InUf的形式,也就是说Uf并不能分成两个矩阵分别影响上下两条线路。

Q:我还是不明白。|x|0n经过H门后得到的,再经过一次H门为啥没变回去???
A:换种说法,经过Uf门之后,上下两条线路(|x|yf(x))发生了纠缠,所以Uf门输出的“两条线路”也无法分成“|x(|yf(x))”这样的“张量积”形式,因而不能分开单独考虑了。

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


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

Acknowledgement:感谢lpy大佬解答我的菜问题ヘ(;´Д`ヘ)

posted @   胡小兔  阅读(9631)  评论(7编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示