本書從程序員的角度介紹了量子計算,是一本適合學生和從業(yè)人員閱讀的入門書籍。書中使用基于Python和C++開發(fā)的開源代碼庫,用完整的數(shù)學推導和經(jīng)典模擬代碼解釋了超過25種基本算法。在介紹了量子計算的基礎知識后,作者著重講解了一些基礎量子算法和高效模擬它們的基礎設施,包括量子隱形傳態(tài)、超密編碼、Bernstein-Vazirani算法和Deutsch-Jozsa算法。高級量子算法的介紹包括量子霸權(quán)實驗、量子傅里葉變換、相位估計、Shor算法、Grover算法、量子計數(shù)、振幅放大、量子隨機游走,以及用于門近似的Solovay-Kitaev算法。通過變分量子本征求解器、量子近似優(yōu)化和NP完備問題的zui大割算法以及子集和算法,探索了量子模擬的應用。書中還探討了程序員生產(chǎn)力、量子噪聲、量子糾錯,以及量子編程語言、編譯器和工具面臨的挑戰(zhàn),最后還詳細介紹了用于轉(zhuǎn)譯的編譯器技術(shù)。
1.本書作者知名,為Google杰出工程師;2.內(nèi)容通俗易懂,且配有代碼實現(xiàn);3.多位業(yè)界知名學者一致推薦;4.面向程序員,方便上手實踐。
前 言 Preface
我認為可以毫不夸張地說,沒有人完全理解量子力學。
—Feynman(1965)
許多數(shù)學理論給我留下了深刻的印象,這些理論實際上是關(guān)于特定算法的。這些理論通常用比今天的計算機科學家使用的等效表達更為冗長和不夠自然的數(shù)學術(shù)語來表述。
—Knuth(1974)
本書是從程序員的角度介紹量子計算的入門指南。大部分概念都通過代碼進行解釋,因為量子計算中常見的看起來復雜的數(shù)學知識在代碼中可能會變得非常簡單。對于許多程序員來說,閱讀代碼比閱讀復雜的數(shù)學符號更容易。代碼還可以進行實驗,有助于讓程序員建立對量子計算基本機制的直覺和理解。我相信這種方法會使入門過程變得高效而有趣。
與其他學習資源不同,本書不會使用現(xiàn)有的軟件框架,例如IBM的成熟的Qiskit工具包或Google的Cirq。相反,我們將從頭開始建立自己的基礎設施—最初基于Python的numpy庫。事實證明,學習基礎知識只需要幾百行代碼。這些初始代碼雖然速度較慢,但十分明確,易于調(diào)試和實驗,是學習的絕佳工具。
其次,我們將改進基礎設施,使用C++進行加速,并詳細介紹一種優(yōu)雅的稀疏表示方式。我們將引入基本的編譯器概念,把電路轉(zhuǎn)譯到其他平臺(如Qiskit、Cirq等)上。這使得我們能夠使用這些系統(tǒng)的高級功能,比如可擴展性能和先進的錯誤模型。
通常,在介紹量子計算之前會先對復雜的線性代數(shù)進行介紹。但是,本書不會按照這個模式來做。許多程序員有堅實的線性代數(shù)基礎,但是其他人可能缺乏這方面的背景或興趣。本書的目標是成為一個吸引人的學習資源,而不深入討論線性代數(shù)的細節(jié),因此對上述兩個群體都適用。本書假設讀者對復數(shù)、向量和矩陣有基本的了解。
在第1章中,我們將回顧一些核心概念。隨著內(nèi)容的深入,我們會介紹少量額外的數(shù)學概念,這些概念對于理解算法是必要的。我們希望這種格式對線性代數(shù)知識薄弱的讀者有所幫助,同時對專業(yè)人士來說又不會過于淺顯。在介紹基本數(shù)學概念之后,本書后續(xù)內(nèi)容將按以下方式組織。
在第2章中,我們將介紹量子計算的核心概念,并在Python中使用完整的矩陣和向量實現(xiàn)它們。我們將討論量子態(tài)、算子、糾纏和測量,展示構(gòu)造、描述和分析量子比特與量子電路的多種方法。量子力學、疊加態(tài)、糾纏和測量都是復雜而深奧的話題。但是,在本章中,我們只關(guān)注理論計算方面。
在第3章中,我們將介紹基礎算法,并利用到目前為止所開發(fā)的基礎設施。這部分內(nèi)容以詳盡的方式呈現(xiàn),包括詳細的數(shù)學推導。
到目前為止,我們所開發(fā)的基礎設施無法擴展到需要更多量子比特的復雜算法上。在第4章中,我們將詳細介紹門的快速作用,并使用C++進行加速。我們將演示稀疏表示如何在某類算法中產(chǎn)生最佳性能結(jié)果。本章將引導我們構(gòu)建高性能的量子模擬器。對基礎設施不感興趣的讀者可以瀏覽或跳過這一章。
在第5章中,我們將闡述量子計算機確實具有超越經(jīng)典計算機的能力。
第6章將詳細介紹量子計算的若干核心算法,例如Grover搜索、量子傅里葉變換、相位估計、量子隨機游走、Shor整數(shù)分解算法以及變分量子本征求解器等。本章還將詳細介紹具有里程碑意義的Solovay–Kitaev算法,該算法可以用小型通用門集中的門來近似構(gòu)造出任意酉門。前幾章所構(gòu)建的基礎足以讓我們實現(xiàn)和理解這些神奇的算法。
第7章和第8章則涉及程序員生產(chǎn)力方面的實際問題。我們將討論量子糾錯,這對于量子計算的可行性是至關(guān)重要的。我們還將討論量子編程語言設計、編譯器和工具,以進一步提高程序員的生產(chǎn)力。
附錄包含正文中沒有涉及的有趣材料。具體而言,它包含對稀疏模擬基礎設施的詳細描述。
源代碼
本書中的大部分內(nèi)容都將同時通過數(shù)學和代碼進行解釋。為了避免將本書變成一個龐大的代碼清單,我們使用諸如[...]之類的結(jié)構(gòu)來替代枯燥或重復的代碼片段。我們通常會省略掉諸如Python的import語句或C++的#include指令之類的代碼。完整的源代碼按寬松的Apache許可證托管在GitHub(https://github.com/qcc4cp/qcc)上并附有下載、構(gòu)建和運行的說明。
歡迎大家提出評論和建議。代碼排版可能會產(chǎn)生錯誤,真實的源代碼可參見在線存儲庫。代碼也可能不斷發(fā)展,導致超過此處所發(fā)布的內(nèi)容。
致 謝?Acknowledgements
本書的出版離不開許多人的幫助。Vincent Russo和Timofey Golubev在數(shù)學公式、代碼和寫作方面提出了許多建議。Gabriel Hannon提供了物理學相關(guān)概念的寶貴指導。量子計算堆棧交換(Quantum Computing StackExchange)平臺是一個非常有幫助的資源和社區(qū),我的一些問題在那里得到了解答。Wes Cowley和Sarah Schedler提供了行文編輯服務,Sue Klefstad制作了令人印象深刻的索引,Eleanor Bolton提供了出色的文本編輯服務。非常感激Tiago Leao向我推薦了Beauregard(2003),這對我實現(xiàn)Shor算法的重構(gòu)至關(guān)重要。Tiago與Rui Maia一起為社區(qū)提供了備受贊賞的參考實施方案(Leao, 2021)。
我也要感謝Google的許多同事。Dave Bennet和Michael Dorner審閱了本書的初稿,我相信這對他們來說不是一次愉快的經(jīng)歷。他們的反饋意見有助于將本書轉(zhuǎn)化為實際的學習資源。Fedor Kostritsa在文字、數(shù)學公式、推導和代碼方面提供了詳細的評論,Ton Kalker認真審查了整本書稿,并在數(shù)學表達上給予了極大的幫助,這兩位同事對嚴謹性和細節(jié)的把控都非常嚴格。Sergio Boixo和Benjamin Villalonga糾正了我對量子霸權(quán)實驗的許多誤解。Michael Broughton和Craig Gidney幫助我改進了關(guān)于Grover算法的部分。Craig還維護著優(yōu)雅的在線模擬器Quirk。感謝Mark Heffernan、Chris Leary、Rob Springer和Mirko Rossini。最后,還要感謝Aamer Mahmood的大力支持。
毫無例外,我在劍橋大學出版社的聯(lián)系人都非常優(yōu)秀。特別感謝編輯Lauren Cowles在整個過程中給予了我極大的指導。
最后,非常感謝我的家人,包括我的愛犬Charlie,感謝他們在我耗費心力寫作時給予我的愛、耐心和支持。
羅伯特·亨特(Robert Hundt)是Google杰出工程師,機器學習編譯器的技術(shù)負責人。他曾主導過Google TPU超級計算機、TensorFlow的XLA編譯器、開源CUDA編譯器的軟件開發(fā),還是開源高層次綜合工具鏈XLS的發(fā)起人。他擁有38項專利,發(fā)表過超過25篇科學論文,是IEEE的高級會員。
目 錄
譯者序
前言
致謝
第1章 數(shù)學基礎 1
1.1 復數(shù) 1
1.2 狄拉克符號、左矢和右矢 2
1.2.1 內(nèi)積 3
1.2.2 外積 4
1.3 張量積 4
1.4 酉矩陣和埃爾米特矩陣 5
1.5 公式的埃爾米特伴隨 6
1.6 特征值和特征向量 6
1.7 矩陣的跡 7
第2章 量子計算基礎 9
2.1 Tensor類 9
2.2 量子比特 12
2.3 量子態(tài) 14
2.3.1 量子比特順序 16
2.3.2 二進制表示 17
2.3.3 成員函數(shù) 18
2.3.4 量子態(tài)構(gòu)造函數(shù) 20
2.3.5 密度矩陣 22
2.4 輔助函數(shù) 22
2.4.1 比特轉(zhuǎn)換 22
2.4.2 比特迭代 23
2.5 算子 23
2.5.1 酉算子 23
2.5.2 基類 24
2.5.3 算子的作用 25
2.5.4 多量子比特 27
2.5.5 算子填充 29
2.6 單量子比特門 30
2.6.1 單位門 30
2.6.2 Pauli矩陣 31
2.6.3 旋轉(zhuǎn) 32
2.6.4 相位門 34
2.6.5 靈活的相位門 35
2.6.6 門的平方根 36
2.6.7 投影算子 38
2.6.8 Hadamard門 39
2.7 受控門 41
2.7.1 受控非門 44
2.7.2 受控–受控非門 44
2.7.3 交換門 45
2.7.4 受控交換門 46
2.8 量子電路表示方法 46
2.9 Bloch球 49
2.10 全局相位 52
2.11 量子糾纏 53
2.11.1 直積態(tài) 54
2.11.2 糾纏電路 54
2.11.3 Bell態(tài) 56
2.11.4 GHZ態(tài) 56
2.11.5 最大糾纏 57
2.12 量子不可克隆定理 57
2.13 對消計算 58
2.14 約化密度矩陣和分跡 60
2.15 測量 63
2.15.1 量子力學的基本假設 63
2.15.2 投影測量 64
2.15.3 實現(xiàn) 66
2.15.4 例子 67
第3章 簡單算法 69
3.1 隨機數(shù)生成器 69
3.2 門的等價 70
3.2.1 門的根的平方就是門 71
3.2.2 倒轉(zhuǎn)受控非門 71
3.2.3 受控Z門 72
3.2.4 非Y門 73
3.2.5 Pauli矩陣的關(guān)系 74
3.2.6 改變旋轉(zhuǎn)軸 74
3.2.7 受控–受控門 75
3.2.8 多重受控門 76
3.2.9 受控門的等價 77
3.2.10 交換門 78
3.3 經(jīng)典算術(shù) 78
3.4 交換測試 82
3.5 量子隱形傳態(tài) 86
3.6 超密編碼 90
3.7 Bernstein-Vazirani算法 93
3.8 Deutsch算法 95
3.8.1 問題:區(qū)分兩種函數(shù) 96
3.8.2 構(gòu)造Uf 98
3.8.3 計算算子 100
3.8.4 實驗 101
3.8.5 通用oracle算子 103
3.8.6 Bernstein-Vazirani算法的
oracle形式 103
3.9 Deutsch-Jozsa算法 104
第4章 可擴展、快速仿真 107
4.1 仿真復雜性 107
4.2 量子寄存器 109
4.3 電路 111
4.3.1 量子比特 112
4.3.2 門的作用 113
4.3.3 門 113
4.3.4 伴隨門 114
4.3.5 測量 115
4.3.6 交換算子 115
4.3.7 多重受控門的構(gòu)建 116
4.3.8 例子 117
4.4 門的快速作用 118
4.5 加速門的作用 122
4.5.1 電路的最終實現(xiàn) 124
4.5.2 過早優(yōu)化,第一步 125
4.6 稀疏表示 127
第5章 超越經(jīng)典 130
5.1 1萬年、2天還是200s 131
5.2 量子隨機電路算法 131
5.3 電路構(gòu)造 133
5.4 估計 136
5.5 評估 138
第6章 復雜算法 140
6.1 相位反沖 141
6.2 量子傅里葉變換 142
6.2.1 二進制分數(shù) 142
6.2.2 相位門 144
6.2.3 量子傅里葉變換理論 144
6.2.4 雙量子比特量子傅里葉
變換 146
6.2.5 量子傅里葉變換算子 148
6.2.6 在線模擬 149
6.3 量子算術(shù) 150
6.4 相位估計 157
6.4.1 特征值與特征向量 157
6.4.2 相位估計理論 157
6.4.3 推導細節(jié) 158
6.4.4 實現(xiàn) 162
6.5 Shor算法 164
6.5.1 模運算 164
6.5.2 最大公因數(shù) 165
6.5.3 因數(shù)分解 165
6.5.4 周期尋找 167
6.5.5 Playground 168
6.6 求階 170
6.6.1 主程序 174
6.6.2 支撐程序 176
6.6.3 模加法 178
6.6.4 受控模乘法 180
6.6.5 連分數(shù) 181
6.6.6 實驗 182
6.7 Grover算法 183
6.7.1 高層次概述 183
6.7.2 相位反轉(zhuǎn) 184
6.7.3 關(guān)于均值的反轉(zhuǎn) 185
6.7.4 簡單的數(shù)字例子 186
6.7.5 雙量子比特的例子 186
6.7.6 迭代次數(shù) 188
6.7.7 相位反轉(zhuǎn)的實現(xiàn) 190
6.7.8 相位反轉(zhuǎn)算子 191
6.7.9 關(guān)于均值的反轉(zhuǎn)的實現(xiàn) 191
6.7.10 關(guān)于均值反轉(zhuǎn)的算子 194
6.7.11 Grover算法的實現(xiàn) 195
6.8 振幅放大 198
6.9 量子計數(shù) 200
6.10 量子隨機游走 204
6.10.1 一維游走 204
6.10.2 付諸行動 206
6.11 變分量子本征求解器 208
6.11.1 系統(tǒng)演化 209
6.11.2 變分原理 210
6.11.3 用Pauli基測量 211
6.11.4 VQE算法 213
6.11.5 測量特征值 215
6.11.6 多量子比特 217
6.12 量子近似優(yōu)化算法 220
6.13 最大割算法 221
6.13.1 NP算法的Ising公式 221
6.13.2 最大割/最小割 221
6.13.3 構(gòu)造圖 223
6.13.4 計算最大割 223
6.13.5 構(gòu)造哈密頓量 225
6.13.6 窺視法的VQE 227
6.14 子集和算法 228
6.14.1 實現(xiàn) 229
6.14.2 實驗 230
6.15 Solovay–Kitaev定理與算法 231
6.15.1 通用門 232
6.15.2 SU(2) 232
6.15.3 Bloch球的角度和軸 232
6.15.4 相似性度量 234
6.15.5 預計算門 234
6.15.6 算法 235
6.15.7 平衡的群交換子 236
6.15.8 評估 239
6.15.9 隨機門序列 240
第7章 量子糾錯 242
7.1 量子噪聲 242
7.1.1 量子操作 244
7.1.2 比特翻轉(zhuǎn)和相位翻轉(zhuǎn)信道 245
7.1.3 去極化信道 245
7.1.4 振幅阻尼和相位阻尼 246
7.1.5 非精確門 246
7.2 量子糾錯理論 247
7.2.1 量子重復碼 248
7.2.2 糾正比特翻轉(zhuǎn)錯誤 249
7.2.3 糾正相位翻轉(zhuǎn)錯誤 251
7.3 9量子比特Shor碼 252
第8章 量子編程語言、編譯器和
工具 254
8.1 量子編譯面臨的挑戰(zhàn) 255
8.2 量子編程模型 255
8.3 量子編程語言 256
8.3.1 QASM 257
8.3.2 QCL 257
8.3.3 Scaffold 259
8.3.4 Q語言 260
8.3.5 Quipper 261
8.3.6 Silq 262
8.3.7 商業(yè)系統(tǒng) 263
8.4 編譯器優(yōu)化 263
8.4.1 經(jīng)典編譯器優(yōu)化 264
8.4.2 簡單門變換 265
8.4.3 門融合 265
8.4.4 門調(diào)度 266
8.4.5 窺孔優(yōu)化 267
8.4.6 高性能模式庫 268
8.4.7 邏輯到物理的映射 268
8.4.8 物理門的分解 269
8.5 轉(zhuǎn)譯 269
8.5.1 中間表示 270
8.5.2 中間表示節(jié)點 270
8.5.3 中間表示基類 271
8.5.4 量子電路擴展 271
8.5.5 電路的電路 272
8.5.6 代碼生成 273
8.5.7 QASM 274
8.5.8 LIBQ 275
8.5.9 Cirq 276
8.5.10 開源模擬器 277
附錄 稀疏實現(xiàn) 279
參考文獻 290