科學無國界
我們是知識的搬運工
福利時間
今天我們將送出由北京聯合出版公司提供的優質科普書籍《宇宙地圖》。
我們生活的地球是太陽系的一部分,太陽系屬於更大的銀河系,而銀河系本身則位於拉尼亞凱系團內。我們該如何精準確定自己在宇宙中的位置?2014 年誕生的第一幅三維宇宙全景圖,標誌著我們有了新的宇宙地址!這正是 20 年來,本書作者、法國天體物理學家海倫·庫爾圖瓦及其國際研究 團隊一起探索宇宙,致力於繪製近域宇宙圖的成果。
本書為普通非專業讀者而寫,庫爾圖瓦用人人能懂的語言帶領我們重溫繪製宇宙地圖的過程。本書糅雜了宇宙科學知識與許多生動有趣的故事,可謂一部極簡宇宙史。讀者不僅踏上了一場奇妙的星際旅行,還得以窺見庫爾圖瓦作為天文學家的學術人生。
只要你認真閱讀下面的這篇文章,思考文末提出的問題,嚴格按照 互動:你的答案 格式在評論區留言,就有機會獲得獎品!
作者:Quentin Truong翻譯:Nuor審校:YQH
這是一段從量子比特到真實量子程序的量子編程演練。
量子計算機
量子計算機被發現之後,量子編程也在不斷發展。本文將帶你入門量子編程,介紹量子計算機與傳統電腦的區別,解釋量子編程的基本概念,最後教你如何在一個當今免費的量子計算機上運行程序。
在開始之前,請注意,本文是為希望了解量子編程的完整技術細節的人們準備的。本文建立在量子比特(qubit),量子門(quantum gates)和量子電路圖(quantum circuit diagrams)的數學基礎之上。(本文不涉及解釋量子算法。)
由於我們將涉及到有關量子編程的基礎數學,因此你需要了解向量、矩陣、線性組合和複數的概念。
量子計算機
讓我們首先了解一下什麼是量子計算機,其與傳統的計算機有什麼區別?
量子計算機是使用量子力學進行運算的機器。
那麼,這與其他計算機有何不同?我們知道,計算機最基本的形式是用來執行運算,有許多類型的計算機,在計算機時代的早期,我們實際上是有過機械計算機的——查爾斯·巴貝奇在1837年設計了一款機械計算機來執行基本的計算過程。現今,我們的計算機基於數字電子設備,利用位和邏輯門來進行運算。與之不同的是,量子計算機使用量子力學來進行運算,利用量子比特和量子門,而不是位和邏輯門。
那麼,什麼是量子比特和量子門呢?物理上來說,它們可以用許多方式實現——Google、IBM、微軟、Rigetti等公司都有自己的方案。我們現階段無需關心量子比特和量子門的物理性質,因為初次學習量子程序並不需要了解這些。
量子編程
在開始編程之前,強烈建議你摒棄大腦中有關編程的一切固有概念,不要想著聲明設置變量,循環語句,定義函數等,任何先入之見都沒有用。量子編程不是簡單地將現在的程序運行更快的一種方法,其與現有的程序在根本上就是完全不同的。(按語:「量子編程」用是類似HDL的硬體描述語言,而不是如C之類的面向過程式語言。兩者無法類比。)
了解量子比特
一個量子比特是具有單位長度的兩份複數的矢量。為什麼使用量子比特?量子比特的含義是什麼?我們不妨把它和傳統的位(即比特)作比較。
對於初學者來言,「一個位」是一個非0即1的數。而「一個量子比特」是一個非0即1的概率分布:若有兩個相同的量子比特,分別測量,可以測到不同的值。仔細想一想,就可以發現,基於量子比特的量子計算,本質上也是概率性的!
第二個重要的區別是,一個傳統的位可以被無限次讀取,而量子比特一旦被讀取過,就會失去量子性,坍縮成一個傳統的位。想想薛丁格的貓,「測量」就是打開盒子,看看貓有沒有死。一旦發現它死了,即使合上蓋子再打開,貓也不會再活過來。用量子力學的話說,「波函數發生了坍縮」。
我們假設一個量子比特可以測到0的概率為|α|2,測到1的概率為|β|2。由於測到的值非0即1,所以:
其中,包含α和β的列向量是一個量子比特,α和β上方的橫線表示復共軛。之所以把概率寫成α和β模長的平方,是因為α和β本質上是兩個波函數的幅值,而任何測量手段都是在取各自的模平方。
總結:量子比特是兩個複數的α和β的單位向量。量子比特被測量概率為0的是|α|2,被測量為1。α和β在被測量之前,是不得而知的,測過之後則坍縮。
量子比特符號
我們通常使用狄拉克標記(也稱作bra-ket標記)表示量子比特。bra代表行向量,用 |表示,ket代表列向量,用| 表示。例如,我們可以按照以下的方式在狄拉克表示中寫入測到的「0」狀態和「1」狀態。(注意不要將bra/ket的表示和向量內的內容混淆。)
量子比特有純態和混合態的區別。如果一個量子比特的態可以完全用|0和|1線性表示,這就是一個純態:
還有一些純態的簡單表示例子:
其他量子比特需要純態的混合才能充分描述它們,被稱為混合態量子比特。換句話說,混合態量子比特是通過純態的概率分布來描述的。在本文稍後的部分,我們將看到一個混合態量子比特的示例。
多個量子比特
到目前為止,我們僅定義了單個量子比特的狀態。多個量子比特的組合狀態是什麼樣的?
多個量子比特的組合狀態其實就是所有量子比特的張量積。
如果你不知道張量積是什麼,請不要擔心。我們將通過一個簡單的示例來進行介紹(是張量積運算的符號)。
通常,我們可以通過以下兩個步驟對任何兩個矩陣進行張量積:
1. 將第一個矩陣中的每個元素乘以第二個矩陣;
2. 根據第一個矩陣中元素的原始位置,合併乘出來的矩陣。
這是一個如何處理二維矩陣的示例:
我們還可以將狄拉克表示中的多個量子比特表示為|0|1。作為簡寫,我們可以省略,僅寫|0|1;更簡略些,寫成|01。
了解量子門
現在讓我們了解一下量子門。
量子門是一個么正矩陣。
為什麼是么正矩陣?
首先,量子門將由物理設備實現,因此它們必須遵守量子物理定律。物理學的定律表明:信息在過去和未來的點轉換時,不會丟失,這被稱為么正性(unitarity)。由於我們的量子門定義了狀態的轉變,因此它們也必須遵守么正性。
其次,請注意,量子門是作用在量子比特上的。之前提到,量子比特實際上只是矢量,因此這意味著量子門必須以某種方式對矢量起作用。幸運的是,我們記得矩陣實際上是向量的線性變換!
結合這兩種思想,我們將量子門視為么正矩陣。么正矩陣是複數的任何方陣,它的共軛轉置等於它的逆。作為快速變換,可以通過取矩陣中每個元素的共軛(a + bi → a - bi),然後取矩陣的轉置(元素ij→元素ji),可以找到矩陣的共軛轉置。我們通常用「」表示共軛轉置。
關於么正矩陣的一個重要性質是範數(即向量的長度)不變性。否則,一個量子比特被量子門處理過後,其概率和不為1!這沒有任何意義,因為所有概率的總和必須始終等於1。
還應注意,根據定義,么正矩陣有逆。這意味著我們不能將量子比特「分配」到任意狀態。為了理解,我們假設有一個可以「分配」值的量子門,因此,可以將含有兩個複數的任何矢量轉換為含有兩個複數的特定矢量。作為么正矩陣,這個量子門具有的一些特定的表示,且該矩陣具有能夠將特定矢量轉換回操作前狀態的逆矩陣!但是,在測量之前,量子比特可能處於任何狀態,並且無法知道是哪個!因此,我們不能將量子比特「分配」到任意狀態。在更高的層次上,所有量子門都是可逆的,這就是為什麼我們經常將量子計算視為可逆計算的一種形式。
最後,請注意,因為我們的量子門是么正矩陣,從定義上來說它們是方陣,所以我們的量子門必須具有相等數量的輸入和輸出量子比特(因為正方形矩陣將n個標準基向量映射到n列)!這與大多數邏輯門完全不同。例如,「與」門取兩個輸入並產生一個輸出。
H和CNOT量子門
現在我們已經對我們將要做的事情有了一點了解了,現在以Hadamard門為例,矩陣H:
我們可以通過計算矩陣的共軛轉置(H)是否等於矩陣的逆(H-1)來確定H的么正性:
另一個重要的量子門是「控制非門」,也稱為CNOT。CNOT作用於兩個量子比特,一個控制量子比特和一個目標量子比特。我們可以將CNOT視為 「if語句」——如果控制量子比特等於1,則CNOT將NOT(非門)應用於目標量子比特。因此CNOT又叫控制非門。
這是代表CNOT的矩陣。此矩陣將控制量子比特視為右矢內的最右值,將目標量子比特視為最左值。
將其作用到|00上,得:
在此示例中,我們看到CNOT不會修改「00」的值,這是被預期的行為,因為CNOT僅在控制態為1時才反轉目標態。
讓我們來看看它對|01的影響。
在這裡,我們可以看到控制態等於1,因此CNOT發生概率反轉。因此,結果是|11。
嘗試找出另外兩種情況,|10和|11,你可以發現CNOT具有以下行為:
請注意,這恰恰是傳統計算機中控制位為1時對目標位應用「非」的行為。
總結:量子門是一個么正矩陣,么正性需得保證其概率之和為1,且量子計算機可逆。由於么正矩陣是方陣,因此輸入和輸出的數目是一樣的。我們了解到Hadamard和CNOT兩個重要的量子門。(還存在著更多的其他量子門。)
量子電路圖
在已經了解量子比特和量子門的基礎上,進一步學習第一個量子電路圖。
量子電路圖是我們對於量子程序的思考構建。將量子比特定義為行,從左到右應用量子門,構建量子電路圖。遍歷圖的每一個部分。首先,我們有兩個量子比特,每一行匹配一個量子比特,最上面的一行對應著x0的量子比特,下面對應著下x1的量子比特。將x0視為第0個量子比特,從0開始計數,標號x0:|0和x1:|0代表從狀態|0開始。
H是Hadamard門,應用於量子比特x0。●-⊕是CNOT門,●是控制量子比特,⊕是目標量子比特。「-」是為了幫助我們表示受影響的兩個量子比特。換句話說,我們正在應用CNOT量子門,其中控制態為量子比特x0,目標態為x1。注意,我們這些門的應用順序很重要。在此圖中,我們首先應用H,然後應用CNOT。
翻譯量子電路圖
量子電路圖只是量子編程的一種表達方式。它幫助我們了解量子計算機,但是其他的表示方法也是很有用的。我們能將我們的圖形式變為字符串符號的形式,能夠更好地幫助我們寫作代碼。以字符串表示能使之更輕鬆地轉換為基礎的數學,這個數學公式將告訴我們程序的預期輸出。
首先,將圖轉換為字符串符號。我們使用狄拉克表示法,像寫二進位數一樣,第0個量子比特將是|00中最右邊的量子比特。這意味著量子比特x1是|00中最左邊的量子比特。(請注意,順序的定義可以不同,但前後要保證統一。)
我們還需要轉換「門」。
由於我們將H作用於量子比特x0而不作用任何東西到量子比特x1(等同於應用單位門,I),因此我們將其寫為(IH)。最後,我們翻譯CNOT門,指定哪個量子比特是控制態,哪個是目標態。結果為CNOT [control = 0,target = 1](IH)|00(注意,從右到左讀取此字符串)。當編寫將在量子計算機上運行的代碼時,這些都將非常有用。
寫出基礎數學
寫出了量子電路圖的字符串表示形式之後就可以輕鬆地將我們的程序轉換為基礎數學公式表達的形式。可以分為三個部分,即CNOT [control = 0,target = 1],(IH)和|00。每一部分都可以轉換成矩陣,如下圖的第一行所示:
我們甚至可以將矩陣相乘以找到結果狀態向量,如上所示。該狀態向量是量子計算完成後我們兩個量子比特的預期狀態。另外,我們可以將其視為程序的輸出。它告訴我們每種可測量狀態的概率幅度。
另外,還記得我們的混合態量子比特嗎?請注意,我們無法再次編寫量子比特x0和量子比特x1的純態了,因為沒有任何方法可以用張量積分解向量,因此我們的量子比特處於混合態!
測量狀態向量
如果我們現在測量量子比特會怎麼樣?我們會收到什麼結果?我們可以通過將狀態向量分解為可測量狀態來找出其結果。用標準基(也稱為|0和|1)(我們也可以測量其他基數,但現在不用擔心)來衡量量子比特。因此,我們兩個量子比特系統的可測量狀態為|00、|01、|10和|11。
就像我們可以使用|α|2來確定單個量子比特的|0的概率一樣,我們可以用同樣的方法來確定測量值的概率。由於|01和|10的概率振幅為0,因此我們知道我們永遠也不會測到該狀態。並且我們將以(1 / sqrt(2)) = 1/2的概率來測量到|00和|11。
現在,假設我們要將這兩個量子比特分開很長的距離,然後再測量其中一個。在我們測量它的那一刻,我們也將知道另一個量子比特的值!這是因為我們知道量子比特只能是|00或|11。
這就是愛因斯坦所說的「幽靈般的超距離作用」,也稱為量子糾纏(參見EPR佯謬)。
在量子計算機上運行
了解了量子比特、量子門和量子電路圖的原理之後,讓我們看看如何在真實的量子計算機上運行程序。可以使用Rigetti的量子計算機,因為他們目前向測試用戶免費開放。我們也可以使用IBM的量子計算機。
這是Rigetti量子編程過程的基本概述:
1. 編寫一個Python程序來指定您的量子電路和任何其他必需的代碼;
2. 使用量子模擬器測試該Python程序;
3. 給Rigetti的量子計算機預留出時間;
4. 將您的程序發送到Rigetti的伺服器;
5. 在Rigetti的伺服器上執行程序(他們會將您的量子程序發送給他們的量子計算機)。
這是上面的量子電路圖的Python版本:
from pyquil.quil import Programfrom pyquil.api import *from pyquil.gates import *# Apply H to qubit 0, then CNOT to qubit 0 and 1p = Program(H(0), CNOT(0, 1))# Get info for a 2-qubit quantum virtual machineqc = get_qc('2q-qvm')# Simulate programresults = qc.run_and_measure(p, trials=10)print(list(zip(results[0], results[1])))# Apply H to qubit 1, then CNOT to qubit 1 and 2p = Program(H(1), CNOT(1, 2))# Get info for a real 2-qubit quantum computer named Aspen-4-2Q-Aqc = get_qc('Aspen-4-2Q-A')# Send program to the quantum computer and run itresults = qc.run_and_measure(p, trials=10)print(list(zip(results[1], results[2])))結果是:
[(0, 0), (1, 1), (1, 1), (0, 0), (0, 0), (0, 0), (1, 1), (0, 0), (0, 0), (1, 1)][(0, 0), (0, 1), (1, 1), (1, 1), (1, 1), (0, 0), (0, 0), (1, 1), (1, 0), (0, 0)]第一行對應於模擬器,結果似乎合理——得到的[0, 0]與[1, 1]各佔一半。但是,使用真實的量子計算機,我們還收到不可能存在的[0, 1]和[1, 0]。這是怎麼回事?
問題在於,如今(2019年)的量子計算機仍然很容易出錯。例如,當嘗試將量子比特初始化為0時,會有2-3%的錯誤率。每個量子比特門操作的錯誤率為1-2%,而兩個量子比特門操作的錯誤率約為3-4%。甚至在測量量子比特時也會有錯誤率!這些錯誤會累積並導致錯誤的結果。
結尾
在本文中,我們可以知道,儘管錯誤率很高,但量子計算機實際上確實存在並且可以正常工作。儘管因不同公司的物理實現有所差別,對其編程的許多概念卻保持一致。
我們認為量子比特是具有單位長度的兩個複數的向量,並將量子門視為可逆的么正矩陣。量子計算是概率性的,因為一旦測量,兩個相同的量子比特可能具有不同的值。在較高的層次上,我們可以將量子編程視為對複數應用的線性代數。
我們使用量子電路圖來表示我們的量子程序,然後將其轉換為Python以在真實的量子計算機上運行。
至此,希望你已經可以寫出自己的量子程序了。
參考文獻:
[1] L. Susskind, Lecture 1 Quantum Entanglements, Part 1 (2008)
[2] Basis vector ordering in Qiskit (2019), Qiskit
[3] R. Smith, Someone Shouts 「01000」! Who is excited? (2017), arxiv
[4] Qubit Quality (2019), Quantum Computing Report
原文連結:https://towardsdatascience.com/introduction-to-quantum-programming-a19aa0b923a9
【互動問題:精通量子力學之後,你能做什麼?】
請大家嚴格按照 互動:問題答案的格式在評論區留言參與互動,格式不符合要求者無效。
截止到本周四中午12點,點讚數前三名的朋友將獲得我們送出的圖書一本。
註:此活動僅限於微信平臺
編輯:aki
↓ 點擊標題即可查看 ↓
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.