官术网_书友最值得收藏!

第 1 章 入門

不管你是軟件工程、計算機圖形學、數據科學等方面的專家,還是充滿好奇心的計算機愛好者,我們都希望你能通過本書開始使用量子計算機,并了解如何發揮量子計算的潛力。

為了實現上述目標,本書不會詳細解釋量子物理(量子計算的底層定律)和量子信息理論(這些定律如何決定我們處理信息的能力),而會提供示例代碼,幫助你深入理解量子計算這一令人興奮的新技術及其用途。最重要的是,你可以調整和修改本書提供的示例代碼。這樣做可以讓你以最有效的方式學習:親自動手實踐。在這個過程中,我們會在必要時解釋核心概念,但只會點到為止,目的是幫助你編寫量子計算程序,而不是精通量子力學。

我們有一個微不足道的愿望:感興趣的讀者或許能夠運用這些知識,在連物理學家可能都沒有聽說過的領域應用和拓展量子計算技術。誠然,希望幫助引發量子革命,這個愿望絕對不算微不足道,但是成為先驅者無疑令人興奮。

1.1 所需背景

理解量子計算背后的物理學需要大量的數學知識,晶體管背后的物理學也是如此,但學習 C++ 連一個物理方程都不需要涉及。本書采取所謂的以程序員為中心的方法,避開任何艱深的數學知識。下面簡要列出有助于理解書中概念的知識點。

● 熟悉程序控制結構,例如 if、while 等。本書使用 JavaScript 提供對可以在線運行的示例的輕量級訪問。如果你對 JavaScript 還不熟悉,但是有一些編程經驗,那么或許能在一小時之內就掌握閱讀本書所需的知識。有關 JavaScript 的全面介紹,請參見 Ethan Brown 的《JavaScript 學習指南(第 3 版)》。

● 掌握程序員應該了解的一些相關的數學知識,它們是必需的:

● 理解數學函數的用法;

● 熟悉三角函數;

● 熟練地操作二進制數以及在二進制表示和十進制表示之間相互轉換;

● 理解復數的基本含義。

● 對如何評估算法的計算復雜度(大 O 記法)有最基本的理解。

書中超出上述要求的部分是第 13 章,其中將研究量子計算在機器學習中的一些應用。篇幅所限,那一章僅概述每種機器學習應用,并展示量子計算機在其中有何優勢。盡管我們試圖使內容通俗易懂,但是如果讀者具備一些機器學習背景,在付諸實踐時將有更大的收獲。

本書的側重點是量子計算機編程(不是構建或研究量子計算機),這就是你在閱讀本書時不需要了解高等數學和量子理論的原因。不過,對于有興趣進一步探索這個主題的讀者來說,第 14 章提供了很好的參考,并將書中介紹的概念與量子計算研究界常用的數學符號聯系起來。

1.2 何謂QPU

盡管人們經常談及“量子計算機”,但這個詞具有誤導性。它讓人聯想到一種全新的計算機,并且這種計算機使用極具未來感的某種東西替代現有的一切軟件。

在我們編寫本書時,這是對量子計算機的一個很大卻很常見的誤解。量子計算機的前景并不在于它是“傳統計算機殺手”,而在于它能夠極大地擴展計算機處理的問題種類。一些重要的計算問題很容易在量子計算機上進行運算,而這在任何標準計算設備上都是做不到的 1

1關于這一點,我們常常舉這樣一個例子:假設可以將傳統的晶體管縮小為原子大小,即便要在質因數分解能力上與普通的量子計算機相當,傳統計算機的體積也得有倉庫那么大。此外,這臺傳統計算機中的晶體管將組裝得如此密集,以至于產生一個引力奇點。引力奇點使得計算非常困難,更別說這樣的傳統計算機能否真的存在。

重要的是,這種提升效果只適用于某些問題(后文會具體闡明)。盡管我們預計這樣的問題會越來越多,但試圖利用量子計算機解決所有的計算問題是沒有意義的。對于筆記本計算機能夠執行的大部分任務,量子計算機未必表現得更好。

換句話說,從程序員的角度來看,量子計算機實際上是協處理器。過去,計算機使用了各種各樣的協處理器,每一種都各有所長,如進行浮點運算、信號處理和實時的圖形渲染。基于這個思路,本書使用量子處理單元(quantum processing unit,QPU)來指代運行書中示例代碼的設備。我們認為,這個術語強化了量子計算的定位。

圖形處理單元(graphics processing unit,GPU)等其他協處理器一樣,對 QPU 的編程需要程序員編寫代碼,這些代碼主要在普通計算機的中央處理器(central processing unit,CPU)上運行。CPU 向 QPU 協處理器發送指令,只為啟動與其處理能力相匹配的任務。

1.3 動手實踐

本書的核心是能夠動手實踐的示例代碼。但是在編寫本書時,還不存在成熟通用的 QPU,那么該如何運行本書中的代碼呢?幸運的是,在編寫本書時,已經有了一些可通過云端訪問和使用的原型 QPU,這令人興奮。此外,對于較小的問題,可以在傳統計算機上模擬 QPU 的表現。盡管無法模擬大型 QPU 程序,但對于簡短的代碼片段來說,這是一種學習如何控制實際 QPU 的簡便方法。本書中的示例代碼符合上述要求,并且即便以后出現更復雜的 QPU,這些代碼也將保持可用性和教學性。

目前有許多可用的 QPU 模擬器、庫和系統。你可以在 http://oreilly-qc.github.io 上找到一份列表,其中列出了幾個具有良好支持的系統。在該網頁上,我們以多種編程語言提供了本書的示例代碼。不過,為了避免書中出現過多的代碼,我們僅在本書中列舉用于 QCEngine 的 JavaScript 示例。QCEngine 是免費的在線量子計算模擬器,利用它,用戶可以在瀏覽器中運行示例代碼,無須額外安裝任何軟件。QCEngine 由本書作者開發,初衷是自用,現在作為本書的配套工具使用。QCEngine 對我們特別有用,這不僅因為它無須下載任何軟件即可運行,還因為它集成了我們在整本書中用作可視化工具的圓形表示法

QCEngine入門

由于我們將大量使用 QCEngine,因此值得花點時間來了解這個模擬器的用法。你可以在 http://oreilly-qc.github.io 上找到它。

運行代碼

如圖 1-1 所示,利用 QCEngine 的 Web 界面,能夠輕松地實現所需的各種可視化效果。只需在 QCEngine 的代碼編輯器中輸入代碼,即可生成圖像。

圖 1-1:QCEngine 的 Web 界面

要運行本書中的示例代碼,請從代碼編輯器頂部的下拉列表中選擇它,然后單擊“運行程序”(Run Program)按鈕。在屏幕上將出現一些新的交互式界面元素,用于將代碼的運行結果可視化,如圖 1-2 所示。

圖 1-2:用于可視化 QPU 結果的 QCEngine 界面元素

量子電路可視化工具

該界面元素用可視化方式表示代碼所代表的量子電路。第 2 章和第 3 章會介紹量子電路所用的表示符號。可以通過它交互式地單步執行程序。

圓形表示法可視化工具

該界面元素以圓形表示法將 QPU(或模擬器)寄存器可視化。第 2 章會解釋如何理解和使用圓形表示法。

輸出控制臺

輸出控制臺用于顯示通過命令 qc.print() 打印的任何文本(用于調試)。使用標準的 JavaScript 函數 console.log() 打印的任何內容仍將在 Web 瀏覽器的 JavaScript 控制臺上輸出。
 

調試代碼

調試 QPU 程序有一定的難度。要理解程序背后的邏輯,最簡單的方法通常是慢慢地單步執行,同時查看每個步驟的可視化效果。將鼠標懸停在量子電路可視化工具上,應該會看到一條橙色豎線出現在固定位置,此時若移動鼠標,還會看到一條灰色豎線跟隨鼠標移動。橙色豎線表示圓形表示法可視化工具當前顯示的信息在量子電路及程序中的位置。它默認在程序的結束位置,但是通過單擊量子電路的其他部分,可以讓圓形表示法可視化工具顯示程序中單擊處的 QPU 配置情況。來看一個例子,圖 1-3 顯示了當在默認 QCEngine 程序的兩個步驟之間切換時,圓形表示法可視化工具的變化情況。

圖 1-3:使用量子電路可視化工具和圓形表示法可視化工具單步執行 QCEngine 程序

用過 QPU 模擬器后,你可能會忍不住開始擺弄它。請盡管嘗試!在第 2 章中,我們會看到越來越復雜的 QPU 程序。

1.4 原生QPU指令

可以用多種工具運行和檢查 QPU 代碼,QCEngine 就是其中之一。可是,QPU 代碼究竟是什么樣子的呢?通常使用傳統的高級語言來控制低級 QPU 指令(我們已經在基于 JavaScript 的 QCEngine 中看到過例子)。本書將帶你在高級語言和低級指令間穿梭。一方面,學習真正的量子計算機級的 QPU 編程有助于掌握全新的 QPU 基本邏輯;另一方面,了解如何通過 JavaScript、Python、C++ 等更高級的傳統編程語言執行這些操作,有助于掌握更務實的編碼范式。對專用、新的量子編程語言的定義仍在火熱進行中。本書不會過多地闡述這個話題,若對此感興趣,請參閱第 14 章。

為了滿足你的好奇心,表 1-1 列出了一些基本的 QPU 指令。后文將詳細地解釋其中每一條指令。

表1-1:基本的QPU指令集

具體的指令和時序取決于 QPU 的品牌和架構。不過,表 1-1 中的是一組基本指令,應該在所有 QPU 中都可用。這些指令構成了 QPU 編程的基礎,就像 MOV 和 ADD 這樣的指令之于 CPU 程序員一樣。

1.4.1 模擬器的上限

盡管模擬器在運行小型 QPU 程序時非常方便,但與真正的 QPU 相比,它們的性能仍然不夠強大。衡量 QPU 性能的一個指標是在其上可操作的量子比特(qubit)的數量 2。量子比特就是量子位,稍后會詳細說明。

2盡管媒體很喜歡將硬件可以處理的量子比特數作為衡量量子計算機性能的基準,但這樣做過于簡單化。要想評估 QPU 的真正能力,還需考慮更微妙的因素。

截至本書原版出版之時,測試得出的 QPU 模擬器的世界記錄是 51 個量子比特。在實踐中,公眾可以使用的模擬器和硬件通常能夠在停止運行之前處理約 26 個量子比特。

本書中的示例考慮到了上述限制。對量子計算初學者來說,這些示例是很好的著手點。每向示例中添加一個量子比特,都會使運行模擬器所需的內存加倍,速度減半。

1.4.2 硬件的上限

在本書寫作之時,實際可用的最大 QPU 硬件大約有 70 個物理量子比特(physical qubit),而通過 Qiskit 開源軟件開發工具包向公眾提供的最大 QPU 包含 16 個物理量子比特 3。與邏輯量子比特(logical qubit)不同的是,這 70 個物理量子比特沒有糾錯能力,易受干擾,且不穩定。與傳統比特相比,量子比特要脆弱得多,與周圍環境發生輕微的相互作用,就會令計算出錯。

3當本書出版時,這個數字可能會過時!

在使用邏輯量子比特時,程序員無須了解 QPU 硬件即可實現任何教科書介紹的算法,并且不必擔心特定的硬件限制。本書專注于用邏輯量子比特編程,書中的示例代碼都可以在較小的 QPU 中(比如本書出版時可用的 QPU)運行。忽略物理硬件細節意味著,即使未來硬件進一步發展,你掌握的技能和擁有的經驗也仍然極具價值。

1.5 QPU與GPU的共同點

盡管在 Stack Exchange 網站上已經有了關于 QPU 編程的討論區,但在一種全新的處理器上編程的想法仍會令人望而卻步。下面是一些關于 QPU 編程的事實。

● 一個程序完全在 QPU 中運行的情況十分罕見。通常是由在 CPU 上運行的程序發出 QPU 指令,然后獲取結果。

● 有些任務非常適合在 QPU 中執行,有些任務則不適合。

● QPU 時鐘與 CPU 時鐘不同,QPU 往往通過專用的硬件接口連接到外部設備(如光學輸出設備)。

● 典型的 QPU 有專用的隨機存儲器,CPU 不能高效地訪問它。

● 簡單的 QPU 可以是由筆記本計算機訪問的一塊芯片,甚至可以只是芯片上的一塊區域。更先進的 QPU 可以是昂貴的大型附加設備,并一直需要特殊的冷卻措施。

● 即便是簡單的類型,早期的 QPU 也有冰箱大小,需要特殊的大電流電源插座。

● 當計算完成時,QPU 向 CPU 返回計算結果的投影,并舍棄大部分內部工作數據。

● QPU 調試可能非常棘手,需要特殊的工具和技術。單步執行一個程序可能很困難,通常最好的方法是更改程序,并觀察更改對輸出的影響。

● 對一條 QPU 指令的執行速度進行優化可能會拖慢另一條 QPU 指令的執行速度。

雖然聽上去似乎不太可能,但這是一個事實:對于上述每一項,都可以用 GPU 替換 QPU,并且表述仍然成立。

可以說,QPU 是具有超能力且與眾不同的技術。盡管如此,QPU 編程面臨的問題并不新鮮,軟件工程師前輩早已遇到過。的確,QPU 編程與傳統編程存在一些細微的差別,這些差別是非常新穎的(否則本書就沒有存在的必要!),但二者有很多共同點。相信自己,你一定能掌握 QPU 編程!

主站蜘蛛池模板: 泾源县| 喀喇| 杭州市| 饶河县| 张家界市| 吉木萨尔县| 余干县| 平南县| 全州县| 益阳市| 定襄县| 瑞丽市| 平江县| 上犹县| 苗栗市| 镇平县| 静乐县| 丰都县| 巴彦淖尔市| 乌审旗| 汕头市| 邳州市| 博乐市| 郴州市| 呼和浩特市| 类乌齐县| 余江县| 张家港市| 赫章县| 四子王旗| 随州市| 西城区| 清远市| 余庆县| 靖远县| 深州市| 太和县| 汝阳县| 绵竹市| 双流县| 福泉市|