csdn 对数学公式支持不好,影响阅读体验,请前往 bahutou.cn 。谢谢。
本文章中涉及到的数学知识和解释,均是结合量子计算机来的,并不代表数学本身的严谨表达。使用数学建立起的一套模型或者理论,其本身就有很多的应用场景,实例化(描述量子计算机)只是作为理解其理论的一个方面,研究数学本身需要屏蔽掉具体实现细节,研究其严谨性、完备性等。亦即研究数学本身的时候要从各种物理实体中抽象出本质和共性进行研究,你不能依赖于任何物理实体去研究数学理论,也不能完全脱离物理实体。理论和实践是相辅相成的,希望大家理解这层窗户纸。避免无意义的口水仗。
自己本身是计算机科学与技术专业毕业的学生,本身对“自动计算”这种可爱的装置就很有兴趣,看计算机发展史也能了解到除了现有的PC和Server(你懂我的意思,哈)这种计算机之外,还有一些基于机械原理的计算装置,可见各路大神对制造“自动计算”装置可谓情有独钟。一路看下来计算机发展史,也发自内心地对各位计算机大牛产生敬畏,是他们的努力工作才使我们现在的生活如此便捷(从大量重复的计算中解脱出来去做更有意义的事情)。现在看各大科技新闻网站上都报道一种新的计算装置—–量子计算机,说是运算速度超快,可以替代经典计算机,好像还弄出一个词叫量子霸权(请大家原谅一些新闻稿的小编们一心想弄个大新闻的心情)。作为一名专业的业余爱好者的我当然要看看是什么东东了。
tag:想了解计算机发展史的童鞋们,可以参考 Structured Computer Organization(Andrew S.Tanenba)计算机组成—结构化方法
第一章节的内容 和计算机硬件发展史
Structured Computer Organization(Andrew S.Tanenba)
计算机硬件发展史
下面是我针对量子计算机的来龙去脉(why、what、how)提的一些问题,本文致力于说清楚这些问题,感觉有用请接着往下阅读,感觉没兴趣的请做自己感兴趣的事情。
算法好坏的评估依据是什么?(时间复杂度、空间复杂度)
tag:计算装置+优秀的算法才能解决问题。
大家已经看到了太多的关于量子计算机比经典计算机牛逼的多的多,这种报道了。这种标题才能吸引眼球,提高各类小编的点击量。作为一名计算机科学爱好者的我看了各种报道后的第一个疑问是:量子计算机如何表示信息,处理信息?表示、处理信息上有啥新玩意?如果有新特性,那利用这些特性需要新的Idea吗?是在经典计算机思维上添加还是得另谋出路?
看了上面的一系列问题,是不是有点紧张,别怕,先来看一段科普视频,以缓解一下紧张的小情绪。
看youtube要哦,什么?你不会!好吧,吓死宝宝了。
计算机可以实现高速的计算,那是否意味着一切可计算的问题都能被计算机解决呐?我看未必,因为解决问题是人类的事情,人类需要把问题抽象—提出解决的方法—转换成具体的计算步骤—–得出结果—-还原成现实世界的具体操作。计算机仅仅是一个计算工具罢了,你让它咋计算它就咋计算☺☺☺。所以关键问题是人怎么提出有意义的问题,然后再提出解决步骤解决之。解决问题的步骤在计算机科学领域有一个专有行话—算法。针对某些问题,我们找到了比较好的算法,还有一些问题虽然有算法,但是算法不够好。那位同学举手了,是不是想问:“算法好不好我咋知道?” 。这个问题其实也好回答,能解决你的问题就是好算法。但是更通用的评判一个算法是好算法的方法是:随着待解决问题的规模逐渐变大时,你所需要的资源(运算次数、存储空间)成对数、线性、多项式增长。就是说,这个算法对解决统一类型的小问题、大问题都有效。我们大家对各类常见的增长模式有无思考?我从慢到快排个序:对数(log)、线性、多项式( n2、n3 n 2 、 n 3 etc )、指数( ex e x )、 n! n ! 。为表示诚意,还是来张图吧。
大家可以看看,随着问题规模的线性增长,算法运算次数的增长模型里最猛烈的是 n! n ! ,简直不可理喻,这货增长的实在是太快了,可以自己实际计算试试。 3!=6 3 ! = 6 ,但是 20!=2432902008176640000 20 ! = 2432902008176640000 。
大家注意看,和它突飞猛进的势头差不多的是 2n 2 n , 22=4 2 2 = 4 ,但是 220=1048576 2 20 = 1048576
关于指数增长模型,有一个很著名的故事:国际象棋和米粒的故事。故事就不讲了,上张图看看吧。
怎么样,还是挺震惊吧。
计算机专业的人分析算法好坏的方法叫算法复杂度分析,且用O(x)的形式表达算法复杂度,你可以理解为增长部分的关键部分。比如说算法的复杂度是 n2+n3 n 2 + n 3 ,表示成O(x)的形式当然是:O( n3 n 3 )了,因为随着n不断变大, n3 n 3 的增长量明显占主要地位, n2 n 2 虽然也有贡献,但和 n3 n 3 比起来就可以忽略了。算法分析你可以认为是微积分里, n→∞ n → ∞ 时的情况,是一种分析行为。
真是人比人得死,货比货得扔。
“等会,你问的问题是为什么研究量子计算,你却给我讲解算法复杂度,骗子。”哎,那位同学你先把枪放下,咱有话好好说。啰里啰嗦说了这么多,其实就是想引出算法复杂度的分类问题。直接上张图吧。
人类社会需要解决的问题千千万万,但是仔细分分类,也没几种。P、NP、NPC。P(polynomial)问题是复杂度是多项式一类的问题,比如 O(n2) O ( n 2 ) 、 O(n3) O ( n 3 ) 等等。NP(non polynomial)问题,这一类问题具有的特点就是:给一个答案,很容易就能验证正确与否,但是要找到正确答案却需要非多项式的时间复杂度(指数复杂度)。这一类问题大部分都为找最优解的问题,比如:走迷宫找最短路径、吃饭的时候如何安排座位等等问题。一旦一个问题目前能找到的算法的复杂度是指数级的,那就意味着问题规模稍微大一点,你的运算量就是巨大的,有可能全世界的计算机都凑到一块,几百年也计算不完。那基本上就认为这个问题不可解。关于N problem 、NP problem 问题请参考N问题、NP问题 。
了解了上述情况,我们知道了,有些问题不是你想解,想解就能解的。目前有好多问题是不可解的(指数级的复杂度),那要想解决这些“不可解”问题,有以下几种方法:
研制更快的计算装置。
在这样的背景下,研制像量子计算机这样的计算机就有了实际意义。传统的计算机新算法的发明速度到了瓶颈,传统的计算机计算速度提升也到了一定的瓶颈(量子隧穿效应)。
还是有图有真相,上张图。
而新研制的量子计算机再配上量子算法,在几个具体的问题领域表现出了较高的效率和活力。例子:shor算法可以将素因子分解问题从NP问题变成P问题。grover搜索算法把复杂度从N变成了 N−−√ N 。
以上,是针对“为什么要研究量子计算机?”这个问题的一些思索。
算法复杂度问题前面也提到了,就是评价一个算法性能的一种方法。在业内评估一个算法的算法复杂度一般考量时间复杂度和空间复杂度这两个方面的内容。关于算法复杂度超出了本文要讨论的主题,请参考计算机数据结构和算法相关书籍。我推荐一本入门的数据结构与算法分析—C语言描述 Mark Allen Weiss。
算法是解决一些问题的思路,计算机算法是适合用计算机作为运算载体的一般算法。经典的计算机算法有好多,每一个都是凝聚了大量人的思想精华。我们这里举三个例子。
上述算法的概述,大家一下就能看出来,第一个例子简单的连小学生都会做,后面两个例子都是求实数的例子。我们学过计算机的人都知道,经典计算机是离散思想的产物,要表示整数(自然数、浮点数)仅需要编码这个简单的思想就能搞定。其中自然数的编码使用的是补码的形式,浮点数的编码使用的是IEEE 754标准。实数呐,怎么表示实数?我们大家都知道实数是一个连续统的数域,要想表达和计算实数就要借助微积分思想或者类似的迭代思想。我们这里的求 1+2 1 + 2 使用了最朴素的自然数和编码思想。求 2–√ 2 使用微积分思想,求 π π 使用概率思想。主要说明两个问题,有了计算机并不能解决实际问题,还需要一些人的 Idea;也用来说明经典确定算法、基于微积分的逼近算法、和基于概率论的概率算法之间的区别和联系。
1+2 1 + 2 的例子我就不多说了。
下面直接说 2–√ 2 的例子。还是说说这个数的来历吧,大家应该都知道古希腊毕达哥拉斯(Pythagoras)学派吧,他们的价值观是数能统治一切,数是万能的。不过他们说的数主要是指有理数(自然数+分数)。其中一个弟子希帕索斯(Hippasus)发现了一个惊人的事实,一个正方形的对角线与其一边的长度是不可公度的(若正方形边长是1,则对角线的长不是一个有理数)这一不可公度性与毕氏学派“万物皆为数”(指有理数)的哲理大相径庭。这一发现使该学派领导人惶恐、恼怒,认为这将动摇他们在学术界的统治地位。希帕索斯因此被囚禁,受到百般折磨,最后竟遭到沉舟身亡的惩处。这也产生了数学上的第一次数学危机。解决这个危机,人类花了很长的时间,从而也说明了人类思维中确定的、离散的 占据核心的地位,你像连续的、曲的 这种概念着实不好理解和应用。好在,我们现在是站在巨人的肩膀上进步的,实数论—微积分可以解决上述危机。
咦,又扯远喽。求平方根的方法很多,比较知名的有newton method(牛顿迭代法)、二分法等等。这里具体就不做详细的分析和代码实现。有兴趣的可以自行实现,并分析不同算法的算法复杂度。
重点介绍概率算法实现求 π π 。先插一句,概率算法的基本特征和基于微积分思想的算法一样,都是无限逼近原理。都有一个共性:无穷性。下面就来看看咋用概率思想算 π π 。
先来张图:
一张图道出了所有的机密了吧,下面简要说明下基本步骤和思想。
下面是伪代码:
npoints = 10000
circle_count = 0
do j=1,npoints
generate 2 randomnumbers between 0 and 1
xcoordinate = random1
ycoordinate = random2
if(xcoordinate,ycoordinate) inside circle
then circle_count=circle_count+1
enddo
PI=4.0*circle_count/npoints
通过上面的描述,我们可以看到影响计算 π π 精度的主要由两个方面:
- 产生的随机数总量
- 产生随机数的质量(是否是真正的随机数,越随机越好)。
经典计算机发展了这么长的时间,已经发展出来了一套很完整的生态圈。我的意思是说有了很稳定的体系结构,有了自我扩展,解决实际问题的环境。用计算机解决实际问题一般分为分析现实问题——进行建模—–转换成计算机高级语言—-编译、调试——用计算机运行——得出结果——转换成实际问题的解决方案。这一套流程本身就可以使用经典计算机来完成,像高级语言编码、编译调试、运行等环节都是在经典计算机上运行的。这就是经典计算机生态圈的含义,一种半自动化的机器,前人的伟大发明,着实让人为之惊叹,为之着迷。
目前,量子计算机属于初期发展阶段。要想理解量子计算机的一些概念,最好的方法是和经典计算机做类比,以便更好地了解量子计算机。
来张经典计算机的层次结构图。
大家熟悉的冯诺依曼机:
大家很明显可以看到,经典计算机体系结构是分层次设计开发的,越往上走越面向用户、也越简单,但同时牺牲了效率,用更容易利用牺牲了效率性。越往下走越面向电磁学理论、也越复杂,但同时掌握下层的知识可以更有效地利用硬件资源,但是这样不利于计算机工程化、推广化,也不利于用户使用计算机全身心解决现实世界的问题。
经典计算机里,我们现在解决实际问题的编程语言都很高级,类似于自然语言,这就需要一个翻译,将高级语言表达的含义变换为计算机能够理解的指令,然后计算机去执行指令。不过这一整套计算机体系理论基础是布尔代数,工程化是图灵机和冯诺依曼等各位大神的思想。因此,这套体系发展到现在是一脉相承的。举例来说,他的理论基础和数学模型以及后来的工程化实现都在我们基础教育的范畴内。计算没有接受过系统的计算机知识培训的人在第一次接受这些概念时也会觉着比较自然。而且经典计算机的高级语言,确实屏蔽了很多计算机物理实现细节,我们使用的计算机实际上是经过抽象的虚拟机。你像高级语言里面的加法、乘法、循环等等概念和我们解决实际问题的思路和数学表达方法基本一致。
说了这么多,我想大家也知道我想表达什么了,现在的计算机这么好用,是经过了几代人努力的结果,我们是站在巨人的肩膀上工作的。我们使用高级语言编写的一个简单的hello world程序要是放到ENIAC时代还是很复杂的工程的。
目前量子计算机处于刚刚发展的阶段,也是有一些在经典计算机世界看起来很简单的事情,放到量子计算机世界里就需要很多新的idea和灵感来实现。比如:怎么让普通程序员使用量子计算机解决实际问题?量子计算机怎么存储数据?量子计算机整个体系结构是怎样的?等等还有很多很多问题。
那有人问了,量子计算机是和经典计算机一样,是一种完全独立的生态圈吗?是和像经典计算机一样有一套完美的生态圈吗?答案是否定的。原因有两个:1,目前最具有可实现性的超导是需要超低温运行环境的(0.0145297 K)。2,qbits的扩展的工程并不容易。通俗地说,量子计算芯片需要绝对0度的运行环境,不能像经典计算机一样在正常的办公室就能使用,这一点对通用的量子计算机的推广有着制约。当然实现量子效应的物理载体有很多[超导、半导体、离子阱],我们是以超导为例子,目前像IBM、INTEL的量子IC都是基于超导的。像经典计算机一样,最小的信息载体是bit,经典叫bit,量子世界叫qbit。经典计算机世界里几亿个bit的集成现在都不是问题,但是在量子计算机世界里,50qbits的制作都有困难。也就是说qbits的扩展还没有找到很好的工程化方法。基于以上两点原因,真正通用的量子计算机离我们还有一定的距离。现在发展的方向是在经典计算机的基础上加上一个专用的量子IC。对,也就是说目前我们见到的IBM的量子计算机从板级到编程等等各个方面都是异构[经典计算机控制+量子IC]的。
好了,说这么多就是想引出,现在所说的量子计算机并不是传统意义上和经典计算机一样是个通用计算机,而是在经典计算机基础上怎加了个量子计算专用IC,为了管理这个QPU,还需要一系列的测试控制设备,我们编程控制的最底层也就是控制这个测控设备喽,因此我们讨论量子计算机、量子编程的时候应该时时刻刻记着异构这个词语。
这里先说下这里的基调,只是从一个抽象层面理解量子计算机原理及使用方法,制作qbit、量子计算机的内容不涉及。
Get ready to think outside a box you didn’t know existed.
—Charlie Bennett
介绍的关键点有 :如何描述单个qibt—-如何描述多个qbits—-什么是superposition(叠加态)—–什么是entanglement (纠缠态)—–测量—–如何利用上述特性存储信息并加速运算。
先说qbit,是一个量子物理学和信息科学融合的一个抽象概念。和bit进行对比着来比较好理解。表示信息一般都需要个载体,经典bit的载体是半导体开关电路。只能用来表示0或者1,这两个状态。而与之对应的qbit可以表示0或者1,也可以表示0和1的任意叠加态。嗯?不好理解,没事。我们在实际中也是用过“叠加”这样的思想解决过一些问题。比如物理分析中力的合成与分解、描述二维空间里的一个向量。这些都蕴含着叠加的思想。我们以描述二维空间中的一个向量为例,说明一些叠加的基本思想。
来张图:
我们描述一个苹果,一个橘子这种概念,自然数 1 1 就够用了,再复杂点一个蛋糕分一半可以用有理数 1/2 1 / 2 表示,再复杂点单位正方形的对角线怎么表示,用一个无理数 2–√ 2 就可以了,只不过需要点微积分的思想而已。那问题来了,一个空间里的向量怎么表示呐?你注意到了吗,前面的自然数、有理数、无理数都是只有大小属性的数,向量是一个量,具有大小和方向的量。自然地,使用复数来描述既有大小又有方向的量是比较可行的方法。复数有很多种表示方法,我最喜欢的是 aeiθ a e i θ 这种表示方法。大小就是a,角度就是 θ θ ,比较自然。
二维空间中的向量是可以使用复数来进行表达,但是三维空间的向量呐?这里是时候引入一些新的idea了,如何使用一种通用的方法描述不同维度空间里的向量?
下面看个三维空间中的向量。
我们可以构造一种新的数来描述这种空间中的量,显然这种方式不是最好的,这里蕴含着一些通用的idea,我们定义一种新的数学实体,这个实体由多个数组成。什么意思呐?显然地,我们描述空间中一个量需要有一个好的参考系,比如我们常用的x-y-z正交坐标系。有了参考系,我们就容易描述在这个空间里面的量。直觉告诉我们每一个在这个空间里的量都有3个分量,我们可以认为这个量有3个简单的量叠加态。对了,那位同学你说对了,这就是向量的一种表达方式。
我们本身不好理解3维空间里的一个任意量,但是如果我们把这个量分解成3个更简单的量,这样就容易分析,容易计算了。上面的向量其实是这样的。
有了上述基本的线性代数的思想,就可以很容易地去理解qbit了。本节的最一开始说过,qbit能表示0态、1态这样的基态,还能表示基态的任意线性叠加。那就需要点线性代数的思想来表达qbit对应的数学抽象模型,上面介绍的线性代数的key idea就用上了。
上面我们举例子的空间是我们比较熟悉的3维空间,那一个qbit对应的是什么空间呐?答案是一个 C2 C 2 空间,一个复数空间。这样的空间选择一组基的话,需要几个向量?两个。很自然对吧。我帮你选择一组基。
[10][01] [ 1 0 ] [ 0 1 ]
我给出一个 C2 C 2 空间中的向量,
一个量子比特具有4个任意常数(αreal、αimag、βreal、βimag),也就是说,有4个自由度。但实际上,一个量子比特只有2个自由度。其原因是因为在这4个任意常数之间,规定了如下2个约束:一是α、β需要满足几率归一化的条件:( |α|2+|β|2=1 | α | 2 + | β | 2 = 1 。二是两个复数α、β中,只有它们相对的相位差才有物理意义,量子叠加态的绝对相位是不可观测的,没有物理意义。因此,我们就干脆将α简化表示成一个实数,即 cos(θ/2) c o s ( θ / 2 ) 的形式,而α、β之间的相位差记为 ϕ ϕ 。
Bloch球虽然是形象化工具,可以帮助理解qbit,我个人认为还是使用线性代数的space思维进行数学运算和表达,这样比较具有通用性。
现在我们已经掌握和明白了如何使用线性代数方法描述一个抽象的Qbit,也很容易明白一个Qbit能够表示的信息量是无穷大的,那如何使用Qbit表示信息呐?怎么把Qbit表示的信息取出来呐?表示信息还是挺简单的,如:表示0,可以使用 1|0⟩+0|1⟩ 1 | 0 ⟩ + 0 | 1 ⟩ 表达;表示1,可以使用 0|0⟩+1|1⟩ 0 | 0 ⟩ + 1 | 1 ⟩ ;表示0和1的叠加态,可以使用 2√2|0⟩+2√2|1⟩ 2 2 | 0 ⟩ + 2 2 | 1 ⟩ 。注意上述表示方法中,都满足 |α|2+|β|2=1 | α | 2 + | β | 2 = 1 的规约。那表示的信息我可以读取到吗?很遗憾,量子力学的大牛们目前发现的规律是,你一旦读取了Qbit,Qbit的叠加态就会塌陷到组成这种叠加态的基态上,且各个基态成概率分布,概率值等于|α|^2和|β|^2,概率加和等于1,符合概率思想。还是以我们上面的例子来说明,表示0的 1|0⟩+0|1⟩ 1 | 0 ⟩ + 0 | 1 ⟩ ,经过测量会得到概率为1的 |0⟩ | 0 ⟩ 基态和概率为0的 |1⟩ | 1 ⟩ 。表示1的 0|0⟩+1|1⟩ 0 | 0 ⟩ + 1 | 1 ⟩ ,经过测量会得到概率为0的 |0⟩ | 0 ⟩ 基态和概率为1的 |1⟩ | 1 ⟩ 。这和经典bit一样,没什么稀奇的。有意思的是 2√2|0⟩+2√2|1⟩ 2 2 | 0 ⟩ + 2 2 | 1 ⟩ 这种叠加态,经过测量我们会得到概率为 12 1 2 的 |0⟩ | 0 ⟩ 基态和概率为 12 1 2 的 |1⟩ | 1 ⟩ 基态。 12|0⟩+3√2|1⟩ 1 2 | 0 ⟩ + 3 2 | 1 ⟩ ,这种叠加态,测量就会得到概率为 14 1 4 的 |0⟩ | 0 ⟩ 基态和概率为 34 3 4 的 |1⟩ | 1 ⟩ 基态。
这就是Qbit表示信息和提取信息的基本原理。这样看来,想利用Qbit表示信息,加速运算还是需要一些特殊的trick 的。
我们已经掌握了单个Qbit的控制大法,那多个Qbits要怎样描述呐?先从两个Qbit开始吧,理解了两个Qbit,再去理解三个Qbit,然后你就可以理解任意数量的Qbits了。
所谓一生二,二生三,三生万物。
行了,别扯这么多了。直接来干货,两个Qbits代表的空间是一个 C4 C 4 空间。“那个举手的同学又有啥问题?” “你咋知道是 C4 C 4 空间的???” 说实话,我也不知道,你有机会问问搞微观物理的吧。 但是事实上,满足归一化条件( |α1|2+|β1|2+|α2|2+|β2|2=1 | α 1 | 2 + | β 1 | 2 + | α 2 | 2 + | β 2 | 2 = 1 )的 C4 C 4 空间确实可以描述两个Qbits所有的量子效应。那很自然地,我给出描述 C4 C 4 这个空间的一组基:
⎡⎣⎢⎢⎢1000⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0100⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0010⎤⎦⎥⎥⎥⎡⎣⎢⎢⎢0001⎤⎦⎥⎥⎥ [ 1 0 0 0 ] [ 0 1 0 0 ] [ 0 0 1 0 ] [ 0 0 0 1 ]
我想描述两个Qbit组成的世界,我得用4个 C4 C 4 的向量组成的一组基来进行描述。这样书写太麻烦, 不符合狄拉克他老人家的本意,另外我们还需要引入 张量积 运算的概念。定义这样一种运算:
[10]⨂[10]=⎡⎣⎢⎢⎢1000⎤⎦⎥⎥⎥ [ 1 0 ] ⨂ [ 1 0 ] = [ 1 0 0 0 ]
实在不知道怎么用LateX公式表达张量积的运算过程,看下这个手写的这款吧,一不小心让你们看到了我的笔记,看啥呐,赶紧收藏啊,坐等升值☺。
定义这个张量积干啥?我的理解是要表示两个状态的同时存在的情况,像第一个qbit处于0态,并且第二个qbit同时也处于0态,怎么描述这样的一种情况呐?注意,这里关注的是真正的同时,这种状态可以用一个向量表示,也可以认为是两个向量的向量积。换句话说,若一个系统的整体状态能分解成两个向量的向量积,也说明这样的系统具有一定程度的离散性,测量这样的整体系统的其中一个Qbit时,并不影响另一个Qbit的状态。从空间角度来分析,一个Qbit张成的空间是一个 C2 C 2 空间,那要想表达具有两个Qbit 张成的空间,是一个 C4 C 4 空间。一个 C4 C 4 空间里的一个向量若能表达成两个 C2 C 2 空间里的向量的张量积的话,我们可以理解成第一个Qbit处于一个基态,同时另一个Qbit处于一个基态。这样可以简化系统的表示。
用狄拉克符号表示:
|00⟩=⎡⎣⎢⎢⎢1000⎤⎦⎥⎥⎥ | 00 ⟩ = [ 1 0 0 0 ]
|0⟩=[10] | 0 ⟩ = [ 1 0 ]
|1⟩=[01] | 1 ⟩ = [ 0 1 ]
|00⟩ | 00 ⟩ 就代表 |0⟩⨂|1⟩ | 0 ⟩ ⨂ | 1 ⟩ 的张量积。
那 C4 C 4 空间里的4个基向量可以表达为 |00⟩、|01⟩、|10⟩、|11⟩ | 00 ⟩ 、 | 01 ⟩ 、 | 10 ⟩ 、 | 11 ⟩ 。
明白了多个Qbit描述的方法,我们可以现在来聊聊叠加态和纠缠态了。
叠加态来个两个Qbit的例子:
先说向量:
⎡⎣⎢⎢⎢⎢⎢12121212⎤⎦⎥⎥⎥⎥⎥ [ 1 2 1 2 1 2 1 2 ]
上面的向量可以代表两个Qbits组成的一个叠加态。上面的系统状态使用狄拉克符号表示:
|00⟩+|01⟩+|10⟩+|11⟩2 | 00 ⟩ + | 01 ⟩ + | 10 ⟩ + | 11 ⟩ 2
上面的系统可以分解为两个向量的张量积。
|0⟩+|1⟩2√⨂|0⟩+|1⟩2√ | 0 ⟩ + | 1 ⟩ 2 ⨂ | 0 ⟩ + | 1 ⟩ 2
不知道大家懂了没有?这种 C4 C 4 空间的叠加态可以分解为独立的两个 C2 C 2 空间的叠加态的张量积。
再来看看这种状态的测量后的概率分布: 14 1 4 的 |00⟩ | 00 ⟩ , 14 1 4 的 |01⟩ | 01 ⟩ , 14 1 4 的 |10⟩ | 10 ⟩ , 14 1 4 的 |11⟩ | 11 ⟩ 。概率是成等概论分布的,你有没有发现,2 Qbits 确实可以表示出4个状态,也就说说可以表示4种信息。这是使用经典bit 无法实现的。畅想一下,3个Qbits张成的空间是几维的?8维,对吧。需要8个基向量。这个空间里的一个向量可以同时表示8种基态的叠加,表示的信息量是成指数增加的,AMAZING。 因为前面看过的国际象棋和米粒 故事的图片。 这是好消息,但是坏消息是测量只能得到各个基态的概率值。利用叠加特性来表示信息量确实有得天独厚的优势,但是利用叠加态来进行加速运算确实需要一些 new idea。因为你表示这些信息后,得利用各种旋转门对这些叠加态的信息进行处理,以向你想要的结果趋近。最后通过测量得出结果。从这一点上来看,能利用这个特性解决问题的想法还真不多,发现新的能利用这个特性的算法还是很有挑战性的。目前,已知的也就是 grover算法和shor算法。
和这种特性对应的是纠缠态。
还是先说向量:
⎡⎣⎢⎢⎢⎢⎢2√2002√2⎤⎦⎥⎥⎥⎥⎥ [ 2 2 0 0 2 2 ]
狄拉克表示法:
|00⟩+|11⟩2√ | 00 ⟩ + | 11 ⟩ 2
这种结构的态不能分解成两个态的张量积。就是说这个系统状态就是一个整体,没有任何办法将他们分开来分析。这也许就是 纠缠态 的含义吧,处于纠缠态的Qbits 有着千丝万缕的关联。来看测量时的概率, 12 1 2 的 |00⟩ | 00 ⟩ , 12 1 2 的 |11⟩ | 11 ⟩ 。看出这个东西也很 AMAZING 了吧,这两个qbit 要不都处于0态,要不都处于1态,是有关联的,不会出现一个是0态,另一个是1态的情况。这就有意思了,你可以提前制备好两个qbits处于纠缠态,然后把他们物理上分离(扯开一定的距离)开来,通过测量其中一个Qbit的状态,我就可以知道另一个的状态。点到为之吧,国内的 潘教授团队 做的量子通讯就是这种情况的应用。
3个Qbits的情况这里就不展开阐述了,只是 C8 C 8 空间,且满足那个归一化规约而已。留个作业,感兴趣的自己琢磨琢磨,或者拿出纸笔画画。
描述量子计算机的模型,一般主流有3种:quantum circuit model , one way quantum computation model , adiabatic quantum computation model。IBM描述量子计算机的模型使用的是quantum circuit model(量子线路模型)。啥意思,就是在基态上添加各种门操作,然后通过测量得到结果。看图说话:
所以说,了解量子线路模型首先要先了解各种量子操作门。我们还是按照之前线性代数里space的思维模式进行各种门的解释。其实各种门就是针对空间里的向量的一种变换操作,也就是基的各种线性叠加。在量子计算机中的门的变换其实是各种旋转变换,即大小长度不变,只是在各种space里进行各种角度的旋转变换。用行话表达就是,量子计算机的门都是酉变换。
U†U=1 U † U = 1 ( A† A † represents the complex conjugation and transpose of any matrix A A )。
在说量子门之前,先说说空间里的变换怎么表达?答案是使用矩阵。举个例子你就很明白了,
tag:qbit的 |01⟩ | 01 ⟩ 的第一个qibt 是左边的这个,和经典的bits序列正好相反。01的第一位是右边的这个。
所有的量子门都是可逆的,也好理解,旋转嘛,当然可以再旋转回来
我们很多人看了量子叠加态之后提出一个疑问,这个量子叠加态和传统的叠加有什么本质上的区别?这个是个好问题,生活中叠加的例子其实也着实不少,比如3个不同音调的声音混合成一个声音,这个叠加的声音可以一下子传到人的耳朵,就可以产生美妙的声音效果。其实不同音调的声音具有不同的频率。由3个不同频率的声音叠加成的声音,最多只能恢复出3个不同频率的声音。而量子叠加态和这个有着本质的区别,通过上面的介绍我们得知,由3个Qbits组成的叠加态可以表示 23 2 3 个状态,表示的状态数量比传统叠加态多。
我们看到,量子测量得出的是各个基态的概率值,那概率我们也很熟悉啊。经典世界中也有很多概率的物理载体。想象这样一个系统,这个系统由3枚质地均匀的硬币组成,每次有规律地摇动这个系统,然后停止摇动,重复多次实验之后也可以得出8种情况的概率值。如果用 H表示正面,T表示背面。有8种可能:HHH、HHL、HLH、HLL、LHH、LHL、LLH、LLL 。通过大量的实验,可以得出符合概率分布,每种情况的概率是 18 1 8 。但是这个概率系统和Qbits 组成的概率系统还是存在本质的区别的。
对这种概率的控制力度也存在很大的差异,抛硬币很难控制让其每次都是正面朝上或者每次都是反面朝上。或者让其 14 1 4 的概率朝上, 34 3 4 的概率朝下。但Qbits就可以通过各种门的操作实现精准的控制。
也就是我们拥有了一个更好的概率载体,这个载体还能控制概率分布,AMAZING。
既然量子计算机具有指数级加速功能,又在一定程度上使用概率思想。那很自然的一个问题就是,经典概率算法、量子叠加态、和 2n 2 n 个机器真并行相比,那个蕴含的能力大?或者说那个性能更高?关于这个问题 经典概率<量子叠加< 2n 2 n 个机器真并行。经典概率性能小于量子叠加上一下小节已经说过了。那量子叠加态和 2n 2 n 个机器真并行之间谁性能高呐?当然是 2n 2 n 个机器真并行性能要高些。举个例子:从n个items中搜索指定的item,如果使用量子叠加特性,目前grover算法的算法复杂度是O( n−−√ n )。若使用 2n 2 n 个机器并行搜索,算法复杂度是O(1)。显然 2n 2 n 个机器并行完胜。但是问题是随着问题规模的增大,没有那么多的计算机可以让你使用。其实, 2100 2 100 的数量级可以表示世界上所有的一切了。所以使用 2n 2 n 个机器并行进行搜索也只能是一种很美好的愿望罢了。
经典计算机算法解决问题的一般步骤是:
使用量子算法解决问题的一般步骤:
前面说了,目前阶段的量子计算机都为经典计算机+量子芯片的异构结构。为了管理这个量子芯片,还需要一系列的测试控制设备,我们编程控制的最底层也就是控制这个测控设备喽,因此我们讨论编程架构的时候应该时时刻刻记着异构 这个词语。
量子计算机的编程架构框图:
其实,量子计算机编程框架的研究是一个很活跃的领域,有很多个人和机构都在推出各种编程架构和语言框架。我们以IBM的编程框架为例:
详细点的图:
关于这个的资料请参考:QISKit
这里需要注意的是,虽然我们使用的量子编程语言是Python、Q#这样的高级语言,但因为量子算法并不使用经典算法的思想,而是一套新的思维方法,故量子编程实际上还是利用量子操作门来操作Qbits。在解决问题上,本质上的思维还处于Qasm这一级别。但目前确实也看到一些通用量子库的研究,比如量子算法里快速傅里叶变换是一个很基本的操作,因此有些编程框架内将这些作为通用的编程库来使用。再比如,有一些特定领域有可能产生完全屏蔽掉qbits的编程模型,但也仅仅限制在很小的领域内。
总之,目前的情况,量子计算机并没有向通用计算机的方向发展,而是向着辅助经典计算机的辅助单元去发展的。而且现在看来经典计算机在解决人机交互,低速运算领域已经能很好地完成工作,并不会完全被量子计算机替代。当然,随着量子计算机技术的发展,量子计算机有可能成为通用计算机并普及,到那时候的量子计算机编程也许就会想现在的经典计算机一样,只关心问题就好了,怎么转化为计算机能听懂的话完全是自动的。