说说量子力学里,最晦涩难懂,但又最知名的技术——量子计算。
可谓是新一代商业热门「风口」。
在各种新闻媒体的报道中,量子计算似乎无所不能。
有文章说,它比传统的超级计算机要快亿亿亿倍(这亿字都快不值钱了)。
有的新闻里说,真正的人工智能最终得依靠量子计算机来实现。
还有什么量子计算一旦突破就能实现「量子霸权」,似乎量子计算强大到无所不能的地步。
可是,量子计算机真的有新闻标题里这么厉害吗?
要弄清楚这些问题,最好的办法自然是我们自己弄明白量子计算到底是怎么回事,让我们自己具有判断这些新闻背后的信息可信度的能力。
那量子计算到底是什么原理呢?
普通的计算机很好理解,实在不行拿算盘也能大致明白机器是怎么做加减乘除的。
可是到了量子计算机这里,什么纠缠态、叠加态、量子比特、量子电路,各种名词一出来,大多数非专业读者肯定都是一脸懵 X,完全不理解到底用量子怎么做计算的。
那么,我们普通人怎么才能搞清楚量子计算机是怎么运作的,它到底比传统计算机厉害在哪里呢?
为什么说量子计算能解决传统计算机无法解决的问题,能瞬间完成传统计算机千百万年都无法完成的运算呢?
对量子计算原理的解释有没有能让小白也能理解的版本,或者也能用我们熟悉的虚拟世界的视角去理解它呢?
那就让我们来试试看吧。
我们要从哪里开始理解呢?
还是要从那个最简单的实验——「双缝干涉」讲起。
这个实验虽然简单,但是其中蕴含的知识真的是相当丰富,所以让我们再解读看看还能发现什么。
我们简单回顾一下:
当一个单光子从光源被发射出来后,就变成了系统中虚无的概率波函数。
然后系统开始根据概率波的扩散速度(光速)监控概率波传播路径上一切即将发生的观测事件。
当观测事件即将发生之时,系统就会瞬间结算概率波经过的空间和路径上的所有传播情况,在观测位置汇总波函数然后进行坍缩,最后得到一个光子的具体测量结果,如果是光屏则得到了一个屏上的光点。
当然我们也可以测量光子的其他属性,比如偏振角、速度或者能量等等。
总之,你想知道什么就测量什么好了,系统会从波函数中立即计算并呈现给你。
等等,大家发现什么没有?
我在这段描述里面使用了计算这个词:「系统会从波函数中立即计算并呈现给你」。
我们正好要讲量子计算,这里就出现了计算,大家觉得是不是有点关联呢?
可能大家要想,这也能算计算吗?这不就是波函数的自然坍缩么?
这里面看不出和我们所理解的计算有什么关联啊?
当然有关联。
大家试想一下。
如果我们把光线传播的距离,拉长到比较遥远的尺度上。
那么当波函数穿越了漫长的空间距离,途中经历了各种干涉、衍射、散射等等复杂的光学变化。
如果尺度达到天文级别,波函数跨越的距离可能更加惊人,经历的改变也更多。
光子可能要飞跃几百上千万光年,经历引力透镜、多普勒效应等等各种影响,最后才能到达我们观测它的位置。
在延迟选择实验,我们就知道,波函数在被观测的最后一刻,它瞬间就会坍缩变成光子。
而这个光子里所蕴含的特性,自然包括了这漫长传播路径上的各种各样事件的概率叠加结果。
这个坍缩的过程其实已经包含了两个进行计算的最重要的特征:
一个是存储,波函数能叠加路径上的各种可能概率事件,这本身就存储了大量信息;
一个则是运算,从复杂叠加的概率组合里瞬间完成了坍缩并呈现结果,这不就是运算能力吗?
事实上,如果我们想要计算某个复杂光路里多个光子之间发生纠缠和干涉的结果,用传统计算机还真解决不了,必须使用光量子设备来计算。
我国之前潘建伟教授的团队研制的「九章」系列量子计算机就是这样的机器。
在处理光子高尔顿式的复杂光路下的仿真计算的时候,能达到相当传统计算机百亿倍的计算效率。
所以如果说整个宇宙就是一台计算机模拟出来的仿真世界,那这台计算主机的算力一定强大到我们难以想象。
这种恐怖算力强大到,我们都看不出,光子在实验室里,传播几十厘米,和在宇宙中传播千万,甚至亿万光年,在最后坍缩的一瞬间,有任何时间上的差别。
在光子的坍缩瞬间,波函数的叠加结算似乎是不需要时间的。
哪怕其中蕴含的计算量无比惊人的庞大,宇宙的母机似乎都在一个系统周期里就轻易算完了。
那么,就有一些科学家开始琢磨了,我们的宇宙背后有这么强大的算力在支撑,那我们能借来用用么?
这个想法真的很诱人啊。
你想想,这可是造物主用的装备,那可是神级装备哦!
在现实中使用神级装备是什么感觉?这太令人向往了。
但其实,这种利用现实中的客观物理现象,来帮助人类进行复杂计算的事情,并不是现在才有的创意。
人类很早以前就开始做类似的骚操作了。
这种操作在之前,人们一般都叫它仿真实验。
比如说现在航空工业经常使用的风洞我们就可以把它理解成一种仿真计算工具:
我们发现用普通计算机计算在高速飞行中,飞机遇到的气流情况,非常困难。
因为高速气流变化过于复杂,飞行外形的一点点改变可能就会造成异常复杂的空气动力学影响,这很难用计算机来精确模拟。
于是人们干脆制造了一个模拟飞机高速航行的风洞设备。
把飞机放到风洞中吹一吹,就可以模拟出各种飞行情况,测试飞机在不同的速度,高度或者是姿态下的实际数据。
系统可以在实时的仿真过程中,用各种传感设备直接观测气流的变化,并同时随时获取飞机各部分的受力数据。
人们用风洞获得数据的成本不仅比用计算机模拟更低,而且更接近真实情况。
毕竟用计算机模拟的话,精度可是达不到真实场景的水平,我们不可以模拟出每个气体分子的运动轨迹,所以用计算机再怎样模拟也只能是近似。
所以,从这个角度理解,其实风洞就相当于一台计算设备了。
我们把需要计算的一些条件和数据输入进去,然后风洞根据输入直接通过物理仿真的方式,得到我们需要的结果。
然后我们再通过测量,来得到结果。
这样得到的仿真数据不仅真实准确而且速度也远远超过了电子计算机。
可能你觉得这不能算是一台计算机。
因为在我们概念中的计算机都是通用计算机。
可以通过编程的方式,组合各种基本逻辑运算,来解决各种各样的问题。
而风洞只能解决特定的问题。
其实,你非要用空气动力学的方式设计通用逻辑元件,也能实现各种计算机的基础元件。
比如与门、非门、与非门等等,从而设计出一台用气流运算的通用计算机来。
其实以前的机械计算机(比如差分机)正是这么干的,只不过用的是齿轮和杠杆而已。
但这显然是在舍近求远。
风洞就应该去解决适合风洞解决的问题。
量子计算机面临的情况和风洞也有点类似。
人们在日常观测量子现象中,发现量子的纠缠和坍缩过程中,也蕴含了强大的对现实世界规律的仿真能力。
虽然量子计算机不像风洞那么难以通用化,但是量子仿真实际上也是只适合解决某些特定类型的问题。
那么量子仿真究竟适合解决什么类型的问题呢?
量子计算在特定问题上的优势又到底有多大呢?
这里我们要再回顾一下量子的特性,我们了解过量子具有三个主要的特点:
第一个特点,是量子可以具有复杂的叠加态。
它特别擅长将各种各样的可能性(也就是概率)叠加在同一个量子上。
比如,某一个光子的波函数,在传播中,我们可以使用偏振片将它调制成不同方向的波。
我们也可以再继续添加很多不同性质的偏振片或者 1/2、1/4 的波片或者其他器件,反复通过不同的光学器件,不断给波函数叠加复杂的概率变化。
这些事件的概率,都会层层叠加到光的量子态上。
从而使最后量子态,包含了光路上全部的元件组合形成的叠加逻辑。
第二个特点,是可以在不同的量子之间发生纠缠。
这种纠缠能力能在多个不同的量子之间产生逻辑关联,将它们链接成为一个整体,从而能形成更复杂的逻辑运算能力。
第三个特点,就是瞬间坍缩。
当我们测量量子的时候,波函数就瞬间坍缩了,不管之前量子上叠加了多少不同的概率,在一瞬间,几乎不消耗任何时间的情况下,函数就可以完成无数的概率计算并输出结果。
那么,这就给了我们一个启示。
我们只需要把代表某些问题的可能性,不断叠加到一些量子上。
在叠加和纠缠的过程中,利用量子态的特性,自然完成「可能性」与「可能性」之间的逻辑运算。
等到我们把叠加完成后,再通过坍缩的办法,来瞬间得到取样结果。
岂不是就可以完成某种计算了?
听起来是不是还是有点晕?
没关系,我们还是换成虚拟世界的视角再来分析一下吧。
假设在虚拟世界的游戏里,我们有一个宝箱需要用正确的密码打开,而密码的输入是用十个 10 面的骰子,骰子的十面上分别刻着 0-9 的数字。
然后要把正确的号码,向上朝前放到宝箱的十个小孔里面,才能开启宝箱。
假如我们并不知道宝箱的开启密码,那么我们就需要尝试 100 亿次才能穷举完所有的组合。
假设我们尝试到 50% 的时候能试出密码,那么也需要尝试 50 亿次。
假设我们动作敏捷,每秒就能尝试一次,那么大概我们花 1585 再加半年的样子就可以成功了,这真是十几代人都无法完成的宏大工程。
那么,怎么办呢?
我们决定不要用经典的骰子来尝试了,我们换成能随机生成 0-9 的骰子函数,也就是量子骰子来尝试。
我们先制造 10 个量子骰子,每个骰子都能平均表示 0-9 的叠加态,我们把这 10 个量子骰子全都塞入到宝箱的密码口里。
现在宝箱也被量子骰子给影响了,它也变成了不确定的状态。
10 个量子骰子能把宝箱变成什么样的叠加态呢?自然是变成两种状态的叠加态,一种是开启,一种是关闭。
为什么宝箱会有开启的状态叠加进去?
因为 10 种骰子的全排列的组合里,必定有一种的正确的组合是可以打开宝箱的。
而 10 个量子骰子组合,就代表了全部 100 亿种的密码组合可能。
那么量子骰子的叠加态里面,就一定包含有那个正确的组合。
我们再用骰子去和宝箱叠加,所以得到的宝箱叠加态里面,也就一定有百亿分之一的状态,是被成功打开的。
到这里,大家应该还觉得似乎还算说得通是吧。
接下来,请大家深吸一口气。
因为我们要开始进行骚操作了......
我们现在用一种量子比较器,将那个宝箱开启状态的微弱可能性给选择出来(实际是翻转其概率)。
这实际上是可以做到的,我们能在无数的叠加态中把我们希望找到的那种状态用量子电路给选择出来。
好了,我们知道这肯定是极小极小的概率,只有百亿分之一,但是不重要,只要存在我们就能给它选择出来。
然后我们用一种量子放大器来放大这个开启状态的几率,反复地千百遍乃至几十万遍的放大,直到这个几率接近 100% 为止。
好了,我们的最后一步就是测量这个被我们篡改过状态的量子宝箱。
按照我们之前的了解,我们知道这时候宝箱会立即坍缩。
因为我们之前已经把宝箱开启状态的可能性给大大放大了,所以现在坍缩的宝箱接近 100% 的可能性就是开启的,那么宝箱有极大可能就是坍缩成开启状态(如果不是就再来一遍好了)。
当然,我们的目的不是得到这个坍缩的宝箱,我们知道量子宝箱如果一坍缩的话,宝箱里面的 10 个量子骰子也自然会跟着一起坍缩。
如果宝箱坍缩成了开启状态,那么 10 个量子骰子也就只能坍缩成为能开启宝箱的的密码组合,因为它们之间的逻辑关联必须被符合。
然后,我们只要去看看坍缩后的骰子状态就轻松得到了那个用传统方法要尝试十几代人的正确密码!
是不是很惊喜,是不是很意外?
有没有觉得不真实,感觉就像是你考试的时候偷看了标准答案一样。
是啊,我们几乎什么都没尝试,就让这些量子们自动帮我们「选」出了唯一正确的答案,而这个神奇的操作居然能让我们实实在在节省了一千多年的常规计算时间,我们也不用等十几代人才知道结果了,这可以说是神迹。
可能大家还有点蒙是吧,这是正常的,这是典型的量子眩晕症状。
任何第一次听说这种奇怪逻辑的朋友都有可能出现这种眩晕症状,但是不要怕,我们要学会享受这种量子微醺状态,这是普通人接触到神迹后的一些正常反应而已,我们习惯就好了。
不过为了缓解大家的这种症状,我再尝试用比较通俗的语言把量子计算的过程分步解释一遍。
第一步,我们首先用若干量子比特模拟了十只骰子的全部组合排列,获得了一组代表 100 亿种可能性的量子骰子。
第二步,我们接着用这组量子骰子输入到加密宝箱,就得到了「输入全部骰子组合后的全部宝箱的组合」,这个全部宝箱的组合就相当于我们把 100 亿种的骰子密码全部输入后得到的 100 亿种宝箱的状态的集合。而这个集合很显然是由 1 种开启状态和 99 亿 9999 万 9999 种关闭状态组合在一起的,而且这 100 亿种状态的概率目前全部都是相同的(都是 100 亿分之一)。
第三步,我们用量子比较器把宝箱组合里面唯一的那种开启状态先选择出来,再用放大器把这个特定状态的概率翻转后再不断放大(相当于同时降低其他关闭状态的概率)。
如果我们将这个开启概率放大到 99.9%,其实就是相当于我们把叠加后的结果人为给扭曲成了 99.9% 的概率是开启状态。
第四步,我们用测量的方式去坍缩这个被我们扭曲了概率的结果,从而带动模拟十个骰子的量子比特也一起坍缩。
因为结果已经被扭曲成大概率是开启状态了,那么量子比特坍缩出的结果也大概率就是正确的开启密码组合,如果运气不好还不是的话,那么就把上面步骤多来几遍好了。
你看,我们分四步就把大象装进了冰箱,神不神奇。
大家可能会怀疑,难道量子计算的操作这么节省时间吗?
用那个什么比较器还有放大器操作的话,难道不需要很多计算时间吗?
我们就姑且认为现在量子计算中的这些操作要比我们经典计算机里面的传统运算操作的单位速度要慢一些吧,不过这种慢只是单一指令上的慢,而量子计算带来的快却是计算量在数量级上的减少带来的快。
你认真试想一下我们刚才寻找宝箱密码的整个计算过程,量子计算和经典计算相比,在第一步就出现了绝对的优势,量子计算一次就拿出了 10 个处于叠加态的量子十面骰子(当然具体计算的时候肯定是用量子比特来编码模拟 10 面骰),这相当于传统计算机的什么概念,相当于传统计算机 10^10=100 亿个普通的数据。
如果我们要用传统计算方式的话,肯定要用 10×10 的循环结构来遍历这个 10 个骰子的组合数字,逐一尝试,但是就算我们能飞速地跑这个循环,再快也只能是以线性串行的方式进行比较。
而量子计算机就不同了,它可以将 10 个量子骰子的全部组合一次性输入宝箱并尝试完毕,这就相当于做了把 100 亿次的比较用一次并行操作给完成了,剩下的当然就是把操作以后的结果拿来慢慢挑出正确结果了。
而结果只有两种:关闭和开启。在两种结果里选一显然比在 100 亿种组合里找一要容易的多。
所以,过程中量子的各种操作不管怎样慢,那也比用传统方式进行 100 亿次串行式的逐一比较要快太多了。
事实上,量子计算机的确也还要做不少次的计算操作,比如需要把那个极小极小的开启状态的概率给放大很多倍,但是这个操作次数也远远小于逐次比较。
科学家已经证明了,如果我们用传统计算机来逐一比较的话,N 个数平均需要比较 N/2 次,这很好理解,至少平均要比较一半嘛,但是用量子计算机呢,我们只需要做 N^{\frac{1}{2}} N^{\frac{1}{2}} 次放大操作就够了,显然 N^{\frac{1}{2}} N^{\frac{1}{2}} 是远远小于 N/2 的,而且 N 越大,我们要查找的信息量越大,那么量子计算机的优势就越明显,而这就是所谓的量子计算的优越性。
在这整个过程中,可能大家最好奇的就是我们怎样制作出量子骰子呢?
我们要怎样才能用电子设备模拟出一个「没有扔出的骰子」来呢,或者说模拟出一个具有量子特性的计算元素呢?
其实,这也很简单,想要让计算元素有量子的特性,最简单的办法就是用量子本身来当作电路元件就好了,我们去找一个量子来(当然不是去抓一个野生量子,野生的不好养活,这个还是要在人工环境里制备出来的),然后放到计算机里当作基础元件,这个元件的名字就叫做「量子比特」。
现在制备量子比特元件的方案有很多,比如光量子、超导、离子阱、中性原子等等,总之就是用某种技术把一个可操作的量子态粒子给固定到计算元件里,然后就成为了可用的量子比特。
我们知道普通的比特就是储存在我们计算机里面集成电路芯片上的晶体管里面的。
半导体晶体管是传统计算机处理数据的最基本单元,从功能上来说它像个开关,可阻挡或允许电流通过,开关形成的高低电信号便组成了 0 和 1 的数据,即比特。
传统计算机的比特位数越多,能表示的数也就越大,所以如今晶体管越做越小,现在已经可以做到几纳米的大小,在一片芯片上集成十几亿个晶体管以应对庞大的运算量。
那么量子比特和传统比特的区别是什么呢?
其实它们之间的区别就相当于双缝实验里没有被观测的波函数和被观测后的粒子的区别。
波函数没有被观测的时候状态是充满不确定性的,它可以既走左缝隙,又走右缝隙,它把各种可能性都包含在一起,而被观测后的粒子就只能走两条缝隙中的一条,不是 1 就是 0。
所以,量子比特最重要的特点就是能同时表达 0 和 1,而且还能同时表达 0 和 1 之间的不同概率组合,它表达的不是一个精确的状态,而是一种混合的可能性。
在量子计算机里的量子比特在制备出来后就是处于不确定的多种态,这种状态即我们常说的量子叠加态,只要我们不观测,我们就可以用处于叠加态的量子比特进行逻辑运算操作,利用这种混合的可能性来进行运算。
量子比特因为能处于 0 和 1 之间的任何可能概率上,比如可以是 50% 的 0 可能性+50% 的 1 可能性,或者是 25% 的 0 可能性+75% 的 1 可能性等等,我们为了方便理解,一般用图形把它的可能性的范围表示出来。一位量子比特的概率空间是一个圆,而如果两位量子比特所包含的空间那么就会是一个球。
我们一般把二阶量子比特的可能状态映射到一个半径为 1 的想象球面上,球面上的任何一个点,都代表一种可能存在的状态,这个球被称作布洛赫球面(Bloch 球)。
传统比特的两种状态只相当于这个球的南北极的两个极点,而量子比特混合状态则相当于整个球面。
因此,从传统比特到量子比特蕴含的信息量级就相当于从点到面,你想想看,这是对传统计算能力多大的增强。
当然,这都是在量子比特未被测量的时候的描述,量子比特一旦被测量,也一样会坍缩成为传统比特,只剩下 0 和 1 了。
就像一个肥皂泡被戳破一样,所有可能性都消失了,只剩下北极或者南极的某个点,确定的 0 和 1。
毕竟,无论我们怎么进行量子运算,最后我们还是需要得到一个确切的结果。
但我们要的就是在泡泡还没被戳破的时候进行计算,这时候每个量子比特都拥有着强大的信息量,它们之间的每一次叠加计算,都等同于经典计算机数万亿次的常规运算。
所以,量子比特就是量子计算机的真正灵魂所在,它也是强大的量子计算能力的来源。
那么我们怎么用这样的量子比特来表示传统比特表示的数据呢?
我们举个例子,比如传统比特我们要表示 4 个数字(0-3),那么我们就需要用 2 位传统比特用两位二进制数字的组合表示,分别是:00,01,10,11。
同理,越大的数字我们就需要用到越多的传统比特来表示。
如果我们要表示 16 个数字(0-15),那么需要用到 4 位传统比特来表示,这 4 个二进制的传统比特 16 种组合才能表示 16 个数,所以我们一共需要 4*16=64 个传统比特表示这 16 个数字。
换成量子比特的话,我们知道量子比特可以同时表达 0 和 1 的叠加态,所以在表示 3 位以上组合的时候,量子比特的状态容纳能力就超过了传统比特。
因此,4 位二进制数字,也就是 16 以内的数字,我们只需 4 个量子比特就可以同时表示出来,这就已经比传统比特大大节省了存储容量。
刚才在我们的宝箱运算里,用到的量子骰子实际上就是用量子比特模拟出来的。
我们可以用 4 个量子比特模拟出最多 16 面的骰子。
而且,4 位量子比特不仅是能模拟出 16 面骰子扔出的最后结果,还能在没有测量前,每组量子比特模拟出的还未扔出的拥有 16 种可能性的骰子。
当然我们现在只用模拟 10 面骰就够了。
我们用 10 组 4 位量子比特模拟 10 个骰子,这样我们只用了 40 个量子比特的容量就模拟出了高达 100 亿的数字组合,而这要用传统计算机的比特表示出来则需要高达 4768 多 G 的存储空间,这实在是太省了!
所以,如果有人说我们的宇宙是虚拟的,那也一定是用量子计算机虚拟的,只有量子方式才能存储这么大的数据容量。
理论上,N 个量子比特就可以表示 2^N2^N 个数,所以我们只需要用 300 个量子比特就足以表示宇宙中所有原子的数量了,这就是量子态的威力。
当我们让量子比特之间发生纠缠的时候,实际上就是用波函数和波函数之间进行运算。
这种说法可能会令人疑惑,波函数之间怎么能互相运算呢?
其实这在数学上是可以的,函数之间的运算其实就相当于把两个函数的数值空间拿来计算,在数学上可以用矩阵算法来表示,比如波函数之间的乘法叫做张量积,在数学上就是一种矩阵和矩阵之间的乘积。
不过,这些计算的计算量都非常大,而且中间过程非常消耗存储空间和算力,数字稍微大点,传统计算机就无法完成了。
但是我们如果在计算过程中,不把这些波函数开展来计算,而是就用代码逻辑来表示它们之间的运算,那就省事了。
所以换到虚拟世界的视角来看量子计算机正是如此工作的。
每一个量子比特,实际上就相当于一段可执行的函数代码,而量子比特之间的运算,就相当于代码和代码层级之间进行逻辑编程。
传统计算机只能用具体的数字来进行逻辑计算,而量子计算机能用函数进行逻辑运算,所以量子计算机实际上在计算逻辑上是比传统计算机要更高一个逻辑维度的。
在量子计算机中,当两个波函数要做加减乘除的时候,我们不需要先去运算(测量)它们,而是直接用量子本身进行叠加运算来得到新的量子态,这就相当于把两个波函数的代码混合重新编程,并打包成为一个新的函数。
这样反复计算占用的就只是代码空间的资源,而不需要输出任何中间结果,等待全部计算完成得到最后我们需要的函数之后,我们再进行测量的取样即可。
这种省略中间过程输出的方法自然就节省了大量不必要的资源和时间,而且就连最后的测量过程都还是交给世界母机去完成的,这种两头占便宜的感觉实在是太爽了。
不过量子计算虽然很强大,但也并不是万能的,在我们日常的各种电脑应用场景里,比如办公、绘图、视频解码、玩游戏、上网冲浪等等,这些日常应用其实大多数都不需要强大的并行计算能力,所以并不能体现出量子计算机的优势。
所以,如果真的造出量子计算机了,其实我们普通人在大多数情况下是用不着的。
我们之前就说过,量子计算机其实也只是一种特殊类型的计算机,只适合解决某些特定类型的问题。
那么,量子计算机究竟应该用在什么地方,解决什么问题呢?
我们在下一站,将继续探讨这个问题,看看我们利用上帝的算力究竟能干些什么。备案号:YXA10KMPRrTLP9rYB1f0Pv8