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.
写完第一个量子计算程序之后, 两个文件中的代码长的下面这个样子.
Driver.cs
HelloQ.qs
可是这程序看上去平平无奇啊.
实际上, 这两段源码确实平平无奇, 既不能秒解上古宝藏密文, 也不能让 AI 智商暴涨. 它所做的, 是模拟了一个量子逻辑门操作哈达玛门(在图中, 这个量子逻辑门操作还被注释掉了), 也就是红框中这一句代码的功能.
经典计算机由晶体管构成, 用高低电位表示二进制 0 和 1 数字信号. 能够对数字信号进行逻辑运算的电路称为逻辑门, 比如非门, 与门, 与非门, 或非门, 或门, 异或门, 异或非门, 施密特触发门, 缓冲器, 驱动器等.
相应的, 量子计算机由二态量子系统构成, 比如一个光子, 有水平偏振态和竖直偏振态, 用两种不同偏振态表示量子态 | 0 > 和 | 1>. 数学上,|0 > 表示向量{{1},{0}},|1 > 表示向量{{0},{1}}.
方便起见, 以后分别用 {{1},{0}} 和{{0},{1}}分别表示向量 和
哈达玛门传输函数为
方便起见, 以后用 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 次.
如果将哈达玛门这一句代码注释掉, 得到的结果为:
也就是, 不经过哈达玛门, 直接测量. 初始态为 | 0>, 测量 1000 次, 1000 次均为 | 0 > 态; 初始态为 | 1>, 测量 1000 次, 1000 次均为 | 1 > 态.
如果将哈达玛门这一句代码启用, 得到的结果为:
也就是, 经过哈达玛门, 再测量. 初始态为 | 0>, 测量 1000 次, 489 次为 | 0 > 态(接近 0.5 的概率),511 次为 | 1>(接近 0.5 的概率); 初始态为 | 1>, 测量 1000 次, 486 次为 | 0 > 态(接近 0.5 的概率),514 次为 | 1>(接近 0.5 的概率). 这个结果和哈达玛门的数学概率结果吻合. 实际上, 如果我们再运行一次, 具体次数可能不一样了, 不过基本还是会和数学期望吻合. 比如:
至此, 可以认为这次仿真实验是成功的, 实现了对哈达玛门的模拟, 得到了与理论预期一致的结果. 也就是, 完成了量子计算的第一个程序. 可以看到, 量子编程不是科幻影视作品中的瑰丽想象. 量子编程也是编程, 需要实实在在的工作, 也要一句句敲代码, 编写量子计算机能够运行的程序.
未经允许请勿转载
来源: http://blog.51cto.com/13763747/2122710