Visual Studio 2017 中加装Microsoft Quantum Development Kit开发包后,就可以使用Q#语言编写量子算法程序。量子编程的新世界就在眼前,我们要不要先打声招呼“Hello, QUANTUM world!”。
 
量子计算机是基于量子特性设计的计算机,我们在使用量子计算机之前,需要考虑一个问题:如何使用,或者说,按照什么模式来使用。粗略的做个类比,核弹是基于核反应的zha弹,威力无穷。当我们拥有了核弹这样的神器,我们应该构建一种怎样的策略来使用:是把常规武库全部报废,任何问题都用核弹来说话;还是同时持有常规武库和核武库,针对不同问题采用不同策略。
 
理论上,任何算法都能够在量子计算机上实现,输出一行字符串也不例外。但这样的应用,几乎不会用到任何量子特性,也不会发挥量子计算的任何优势。因此,一种合理的方案是,将量子计算机作为一个相对独立模块来使用,就像显卡、声卡、网卡一样。经典计算机做主机,运行主程序,遇到需要量子计算来解决的问题时,就调用子程序,在量子计算模块上运行量子算法。
 
在Visual Studio 2017中进行量子算法编程,采用的就是这种将量子计算作为相对独立模块对待的方式。用通用编程语言C#写主程序,用量子编程语言Q#编写子程序。
 
当建立了一个Q#应用工程HelloQ后,系统自动生成两个源程序文件,一个是C#主控程序Driver.cs,一个是Q#量子编程源程序Operation.qs。我们将Operation.qs改名为HelloQ.qs。 

量子计算III690.png


写完第一个量子计算程序之后,两个文件中的代码长的下面这个样子。
Driver.cs

量子计算III734.png

 
HelloQ.qs

量子计算III746.png

 
可是这程序看上去平平无奇啊。

量子计算III760.png

 
实际上,这两段源码确实平平无奇,既不能秒解上古宝藏密文,也不能让AI智商暴涨。它所做的,是模拟了一个量子逻辑门操作哈达玛门(在图中,这个量子逻辑门操作还被注释掉了),也就是红框中这一句代码的功能。


经典计算机由晶体管构成,用高低电位表示二进制0和1数字信号。能够对数字信号进行逻辑运算的电路称为逻辑门,比如非门、与门、与非门、或非门、或门、异或门、异或非门,施密特触发门、缓冲器、驱动器等。


相应的,量子计算机由二态量子系统构成,比如一个光子,有水平偏振态和竖直偏振态,用两种不同偏振态表示量子态|0>和|1>。数学上,|0>表示向量{{1},{0}},|1>表示向量{{0},{1}}。

方便起见,以后分别用{{1},{0}}和{{0},{1}}分别表示向量量子计算III1093.png量子计算III1095.png


哈达玛门传输函数为
 

量子计算III1107.png

方便起见,以后用sqrt()表示开平方根。H可以写作H=(1/sqrt(2))·{{1, 1}, {1, -1}}


可以算出:
H·|0> = 1/sqrt(2)*|0> + 1/sqrt(2)*|1> ------------ (1)
H·|1> = 1/sqrt(2)*|0> - 1/sqrt(2)*|1> ------------ (2)


上面两个式子右边都是|0>和|1>的线性组合。一般的,对于|ψ>=α·|0> + β·|1>,我们称其为叠加状态。也就是,在同一时刻,这个量子位即处于|0>态、也处于|1>态。如果我们对该量子位进行测量,量子位的叠加状态就坍塌了,坍塌的意思是一旦被测量,量子位就处于|0>态或者|1>态了。是测量这个过程使得量子位出现在某一固定状态。其中,测得为|0>的概率为α的平方,测得为|1>的概论为β的平方。特殊的,测量|0>态的量子位,100%测得|0>态,测量|1>态的量子位,100%测得|1>态。


那么,对上面(1)式和(2)式所表达的量子态进行测量,得到|0>态和|1>态的概率分别是多少?对于(1)式,测得|0>态的概率为(1/sqrt(2))的平方,即0.5;测得|1>态的概率为(1/sqrt(2))的平方,即0.5。对于(2)式,测得|0>态的概率为(1/sqrt(2))的平方,即0.5;测得|1>态的概率为( - 1/sqrt(2))的平方,即0.5。


模拟哈达玛门,如果只经过一次实验,是看不出哈达玛门的特性的。进行一次测量,处于重叠态的量子位要么坍塌为|0>、要么坍塌为|1>,看不出概率特性。因此,要实验哈达玛门特性,需要反复测量多次。上面的代码对初始状态为|0>和|1>的量子位分别测量1000次。


如果将哈达玛门这一句代码注释掉,得到的结果为:

量子计算III1871.png


也就是,不经过哈达玛门,直接测量。初始态为|0>,测量1000次,1000次均为|0>态;初始态为|1>,测量1000次,1000次均为|1>态。


如果将哈达玛门这一句代码启用,得到的结果为:

量子计算III1970.png

 
也就是,经过哈达玛门,再测量。初始态为|0>,测量1000次,489次为|0>态(接近0.5的概率),511次为|1>(接近0.5的概率);初始态为|1>,测量1000次,486次为|0>态(接近0.5的概率),514次为|1>(接近0.5的概率)。这个结果和哈达玛门的数学概率结果吻合。实际上,如果我们再运行一次,具体次数可能不一样了,不过基本还是会和数学期望吻合。比如:

量子计算III2160.png


至此,可以认为这次仿真实验是成功的,实现了对哈达玛门的模拟,得到了与理论预期一致的结果。也就是,完成了量子计算的第一个程序。可以看到,量子编程不是科幻影视作品中的瑰丽想象。量子编程也是编程,需要实实在在的工作,也要一句句敲代码、编写量子计算机能够运行的程序。



未经允许请勿转载