本书指导读者使用Python和Q#语言学习量子计算,揭开量子计算的神秘面纱。本书尽量避免复杂的数学概念,试图直接通过量子编程来帮助读者建立对量子计算机的理解。读者可以通过使用Python创建自己的量子模拟器来学习量子计算的基础知识,然后使用QDK和Q#来编写和运行与经典计算不同的算法。
通过阅读本书,读者将能够把量子编程技术应用于量子密钥分发等应用程序中,并处理真实的示例,如进行化学模拟和搜索未排序的数据库等。
·剖析量子计算机工作的基本机制;
·使用Python模拟量子位;
·介绍Q#和Microsoft Quantum开发工具包;
·将量子算法用于现实应用。
萨拉·凯泽在滑铁卢大学的量子计算研究所取得了物理学(量子信息)博士学位。萨拉职业生涯的大部分时间都在实验室开发新的量子硬件,从建造卫星到研究量子密码学硬件。沟通量子的奇妙领域是她的激情所在,她喜欢建立新的演示和工具来帮助量子社区的发展。在不编写代码的时候,萨拉喜欢划皮划艇和为所有年龄的人编写关于科学的书。
卡桑德拉·格拉内德在滑铁卢大学量子计算研究所取得了物理学(量子信息)博士学位,现在在微软的量子系统组开发?Q#的标准库。作为根据经典数据对量子设备进行统计表征的专家,卡桑德拉还帮助斯科特·阿伦森把其报告整理成书Quantum Computing Since Democritus(剑桥大学出版社,2013年)。
第 一部分 量子入门
第 1章 量子计算简介 3
1.1 为什么量子计算很重要? 4
1.2 什么是量子计算机? 5
1.3 如何使用量子计算机? 7
1.3.1 量子计算机能做什么? 9
1.3.2 量子计算机不能做什么? 10
1.4 什么是程序? 11
什么是量子程序? 12
小结 14
第 2章 量子位:构建块 15
2.1 为什么需要随机数? 16
2.2 什么是经典位? 19
2.2.1 我们能用经典位做什么? 21
2.2.2 抽象是我们的朋友 23
2.3 量子位:状态和操作 25
2.3.1 量子位的状态 25
2.3.2 操作的游戏 27
2.3.3 测量量子位 31
2.3.4 一般化测量:基独立 35
2.3.5 用代码模拟量子位 37
2.4 编程一个工作的QRNG 42
小结 47
第3章 用量子密钥分发来分享秘密 48
3.1 在爱情和加密中一切都很公平 48
3.1.1 量子NOT操作 51
3.1.2 借助量子位共享经典位 55
3.2 双组基的故事 56
3.3 量子密钥分发:BB84 59
3.4 使用密钥发送秘密消息 64
小结 67
第4章 非本地游戏:使用多量子位 68
4.1 非本地游戏 68
4.1.1 什么是非本地游戏? 69
4.1.2 测试量子物理学:CHSH游戏 69
4.1.3 经典策略 72
4.2 处理多量子位状态 73
4.2.1 寄存器 74
4.2.2 为什么很难模拟量子计算机? 76
4.2.3 用于状态制备的张量积 77
4.2.4 张量积对寄存器的量子位操作 78
小结 81
第5章 非本地游戏:实现多量子位模拟器 82
5.1 QuTiP中的量子对象 82
5.1.1 升级仿真器 87
5.1.2 测量起来:如何测量多量子位? 91
5.2 CHSH:量子策略 94
小结 98
第6章 隐形传态和纠缠:量子数据的移动 99
6.1 移动量子数据 99
6.1.1 换出模拟器 102
6.1.2 还有哪些双量子位门? 106
6.2 所有的单(量子位)旋转 108
6.3 隐形传态 116
小结 119
第 一部分:结语 119
第二部分 在Q# 中对量子算法进行编程
第7章 改变胜率:关于Q#的介绍123
7.1 量子开发工具包介绍 124
7.2 Q#中的函数和操作 127
7.3 将操作作为参数传递 133
7.4 在Q#中玩莫甘娜的游戏 138
小结 140
第8章 什么是量子算法 141
8.1 经典算法和量子算法 141
8.2 多伊奇-约萨算法:对搜索的适度改进 144
8.3 oracle:在量子算法中表示经典函数 149
8.3.1 梅林的变换 150
8.3.2 推广我们的结果 153
8.4 在Q#中模拟多伊奇-约萨算法 157
8.5 对量子算法技术的思考 161
8.5.1 鞋子和袜子:应用和撤销量子操作 161
8.5.2 用阿达马指令来翻转控制和目标 164
8.6 相位反冲:我们成功的关键 166
小结 170
第9章 量子传感:不仅仅是相位 172
9.1 相位估计:利用量子位的有用属性进行测量 172
9.2 用户定义的类型 177
9.3 从Python中运行Q# 184
9.4 特征态和局部相位 189
9.5 受控应用:将全局相位变成局部相位 193
9.6 实现兰斯洛特的相位估计游戏的最佳策略 199
小结 201
第二部分:结语 201
第三部分 应用量子计算
第 10章 用量子计算机解决化学问题 205
10.1 量子计算的实际化学应用 205
10.2 通往量子力学的多条路径 207
10.3 用哈密顿算符描述量子系统如何随时间演化 210
10.4 用泡利操作围绕任意轴旋转 214
10.5 在系统中做出想要的变化 221
10.6 经历(非常小的)变化 222
10.7 整合在一起 225
小结 230
第 11章 用量子计算机搜索 232
11.1 搜索非结构化数据 232
11.2 关于状态的反射 238
11.2.1 关于全一状态的反射 239
11.2.2 关于任意状态的反射 240
11.3 实现格罗弗算法 246
11.4 资源估算 252
小结 257
第 12章 用量子计算机进行算术运算 258
12.1 将量子计算纳入安全因素 258
12.2 将模算术与因数分解联系起来 262
12.3 经典代数和因数分解 267
12.4 量子算术 270
12.4.1 用量子位相加 271
12.4.2 处于叠加态的量子位相乘 272
12.4.3 舒尔算法中的取模乘法 275
12.5 整合在一起 278
小结 282
临别赠言 283
附录A 安装所需软件 285
A.1 在线运行示例 285
A.1.1 使用Binder 285
A.1.2 使用GitHub Codespaces 286
A.2 使用Anaconda进行本地安装 286
A.2.1 安装Anaconda 286
A.2.2 用Anaconda安装软件包 286
A.3 安装QDK 288
A.3.1 安装.NET Core SDK 289
A.3.2 安装项目模板 289
A.3.3 安装Visual Studio Code扩展程序 290
A.3.4 为Jupyter Notebook安装IQ# 290
附录B 术语和快速参考 291
B.1 术语 291
B.2 狄拉克符号 293
B.3 量子操作 294
B.4 Q#语言 296
B.4.1 类型 296
B.4.2 Q#的声明和语句 297
B.4.3 Q#表达式和操作符 300
B.4.4 Q#标准库 301
B.4.5 IQ#魔法命令 303
附录C 线性代数 304
C.1 走近向量 304
C.2 亲自体验矩阵 306
附录D 通过实例探索多伊奇-约萨算法 316
D.1 使用我们的技能,尝试做点什么 316
D.2 步骤1:为多伊奇-约萨制备输入状态 317
D.3 步骤2:应用oracle 318
D.3.1 例1:“id”oracle 320
D.3.2 例2:“not”oracle 321
D.3.3 例3:“zero”oracle 322
D.4 步骤3和4:撤销对目标量子位的制备,并测量 323