《关于胡小兔的博客又诈尸了这件事》
信息物理真是难啊!上节课讲了量子计算的最基础的概念和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是一个特殊的门,输入x和y,输出x和y⊕f(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)⟩−|1⊕f(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)对于恰好一半的x得0,而对另恰好一半的x得1。
求f具有以上两种性质中的哪一种。
量子算法
Deutsch-Jozsa算法的电路图:

上面那“一条”线路实际上是n条,左上角的−/n符号表示这条线路代表n条线路。输入也随之变成了|ψ0⟩=|0⟩⊗n|1⟩。可以发现,Deutsch-Jozsa算法的电路图除了把第一条线路扩成了n条之外,和Deutsch算法的电路图并没有什么区别。(是不是突然有自信看懂了!)
让我们再用熟悉的方法,逐个计算|ψ0⟩,|ψ1⟩,|ψ2⟩,|ψ3⟩。
|ψ1⟩=(H|0⟩⊗n)(H|1⟩)=1√2n(|0⟩+|1⟩)⊗(|0⟩+|1⟩)⊗⋯⊗(|0⟩+|1⟩)⊗(|0⟩−|1⟩)/√2=1√2n∑x∈{0,1}n|x⟩(|0⟩−|1⟩)/√2.|ψ2⟩=Uf|ψ1⟩=1√2n∑x∈{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|x1x2⋯xn⟩=∑z∈{0,1}n(−1)∑ixizi|z⟩/√2n.
所以
|ψ3L⟩=1√2n∑x∈{0,1}n(−1)f(x)H|x⟩=12n∑x∈{0,1}n(−1)f(x)∑z∈{0,1}n(−1)∑ixizi|z⟩.
接下来我们测量一下|ψ3L⟩,见证奇迹的时刻到了!
测得|0⟩⊗n的概率是:
⟨ψ3L|0⟩⟨0|ψ3L⟩=⎛⎝12n∑x∈{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,所以测出|0⟩⊗n的概率是1;
当f是均匀的函数时,一半(−1)f(x)=1,另一半(−1)f(x)=−1,∑x∈{0,1}n(−1)f(x)=0,平方之后依然等于0,所以测出|0⟩⊗n的概率是0。
这样,只需运行这个电路一次,就可以100%确定f的性质了!
一些常见的困惑
Q:啥是量子计算……啥是qubit……
A:反正大概是OI用不到的东西……Qiskit Textbook欢迎你!(再次免费打广告)
Q:不是啊,你连f是啥都不知道,你这个Uf咋从f构建出来的啊?
A:好问题!答案是,并不知道怎么构建……这个算法应用的场景其实是“给出一个量子黑盒Uf”,而不是给出f。(如果给出f,把f读进来、搞出一个真值表的复杂度就有2n了……总之这个算法解决的问题不是这个。)
Q:只看上面那条线路,Uf对于|x⟩不是相当于单位矩阵In一样,没有产生改变嘛?为啥第一条线路输出的不是H⊗nInH⊗n|0⟩⊗n=|0⟩⊗n呢?
A:好、好问题!问题出在“Uf对于|x⟩相当于单位矩阵In”这句话上。事实上,Uf并不能写作In⊗U′f的形式,也就是说Uf并不能分成两个矩阵分别影响上下两条线路。
Q:我还是不明白。|x⟩是|0⟩⊗n经过H门后得到的,再经过一次H门为啥没变回去???
A:换种说法,经过Uf门之后,上下两条线路(|x⟩和|y⟩⊕f(x))发生了纠缠,所以Uf门输出的“两条线路”也无法分成“|x⟩⊗(|y⟩⊕f(x))”这样的“张量积”形式,因而不能分开单独考虑了。
Q:所以这个算法有啥用处吗?
A:它的用处大概是……帮你理解量子并行计算,证明量子并行计算与传统计算机相比有优越之处。现在看起来,Deutsch-Jozsa算法解决的问题或许没啥用处,但或许以后类似的方法能解决更重要的问题吧~(现学现卖,并未深入了解 =_=|||)
以上就是Deutsch-Jozsa算法的讲解啦,我也刚学,可能有很多错误,欢迎大佬指正!>v<
Acknowledgement:感谢lpy大佬解答我的菜问题ヘ(;´Д`ヘ)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)