【量子計算機程式設計】(一)量子計算機簡介+QPU程式設計初體驗
我報名參加金石計劃1期挑戰——瓜分10萬獎池,這是我的第1篇文章,點選檢視活動詳情
什麼是量子計算?
量子計算機的前景在於:在現有的一些標準裝置上完成不了的重要計算,有望藉助量子世界的特點來完成,也即,它能極大擴充套件計算機處理的問題種類。
量子計算機更像 協處理器(一種晶片,用於減輕系統微處理器的特定處理任務)。
什麼是QPU?
QPU,(quantum processing unit,量子處理單元),是可用於執行量子計算機程式碼的裝置平臺(類似於傳統的面向CPU、GPU程式設計)。
當前還沒有通用的實體量子計算機裝置,但是已經有了線上的量子計算模擬器。我是通過搜尋引擎搜尋“QCEngine”的,這個免費的模擬器由《量子計算機程式設計:從入門到實踐》的作者開發。
模擬器連結: http://oreilly-qc.github.io/
模擬器上限
衡量GPU的其中(不是唯一)一個指標是在其上可操作的 qubit (量子位元,或者理解為量子位)的數量。
截止我參考的這本書出版(原版不清楚,翻譯本是2021.7),QPU模擬器的世界紀錄是51個量子位,公眾使用的一般是能處理26位。
每向示例新增一個量子位,都會使執行模擬器所需記憶體加倍,速度減半。
實際機器硬體上限
與傳統位相比,量子位沒有糾錯能力,易受干擾和不穩定。
截止該書出版,實際最大的QPU硬體能達到70物理量子位。
QPU程式設計的特點
(注:以下大部分表述摻雜了我個人的理解,可以說是三手資料了,建議覺得下列說法似是而非的uu去看原版或者中文翻譯本,但是出於對智慧財產權的保護考慮,還是加個引用號)
以下問題是GPU程式設計也存在的問題。 - >一般是CPU與QPU協同執行。程式CPU上執行,發出QPU指令,並在QPU上獲取結果。 (我的理解是它現在還要依附於現有的實體計算硬體) - >不是所有任務都適合QPU程式設計。 (正像用多執行緒分解素數其實作用不大) - > QPU的時鐘機制:它通過專用的硬體介面連線到外部裝置。 - > 典型的QPU有專門地隨機儲存器。 - >一塊晶片、甚至是晶片上的一小塊區域都可以成為QPU,不過更先進的需要大型附加裝置和持續的冷卻措施。 - > 計算完成時,QPU向CPU返回的是計算結果的投影(同時捨棄了大部分內部工作資料) - >對QPU除錯的最好方法就是單行單行改程式,然後輸出列印看差異。 - > 對一條QPU指令的執行速度進行優化可能會拖慢另一條指令的執行速度。
程式碼實踐
生成隨機位元組
關於had()
had()對應於量子位的HAD運算(hadamard),本質上是為某個呈|0>態或|1>態的量子位元建立相等的疊加態。
-
|0>、|1>被稱為狄拉克符號,表示處於疊加態時最終可能會被讀取到的值;真正被讀取到的值是確定的,就用純數字表示。
量子物理定律保證了had()運算有不可預測性,下列程式碼每次執行可能生成的0/1結果都不同,可以用做偽隨機數生成器應用。
qc.reset(1); // allocate one qubit
qc.write(0); // write the value zero
qc.had(); // place it into superposition of 0 and 1
var result = qc.read(); // read the result as a digital bit
生成隨機位元組
qc.reset(8);
qc.write(0);
qc.had();
var result=qc.read();
qc.print(result);
執行三次,分別輸出122,123,176
量子監聽檢測
以下程式碼完成一個簡化的量子金鑰分發(quantum key distribution,量子密碼學領域的核心協議)
監聽檢測原理
交換一些不需要加密的傳統數字資訊,測試並讀取量子位元的值看是否符合預期(因為監聽將不可避免地破壞量子態,使其成為確定態),如果不一致,說明有人監聽。
程式碼及解釋
注:英文註釋為示例程式碼原有,中文字是我加上的 ``` qc.reset(3); qc.discard();
//建立通訊物件及通道 var a = qint.new(1, 'alice'); var fiber = qint.new(1, 'fiber'); var b = qint.new(1, 'bob');
function random_bit(q) { q.write(0); q.had(); return q.read(); }
// Generate two random bits qc.label('get two random bits');
var send_had = random_bit(a); var send_value = random_bit(a); qc.label('');
// Prepare Alice's qubit(只有alice自己知道,且量子位處於不確定態) a.write(0); qc.label('set value'); qc.nop(); //根據end_had值判斷是否應用HAD if (send_value) a.not(); qc.nop(); qc.label(''); qc.nop(); qc.label('apply had'); qc.nop(); if (send_had) a.had(); qc.nop(); qc.label('');
// Send the qubit! fiber.exchange(a);
// Activate the spy var spy_is_present = true; if (spy_is_present) { var spy_had = 1; qc.nop(); qc.label('spy'); if (spy_had) fiber.had(); stolen_data = fiber.read(); fiber.write(0); if (stolen_data) fiber.not(); if (spy_had) fiber.had(); qc.label(''); qc.nop(); }
// Receive the qubit! //bob偶爾能正確解碼alice的二進位制值 var recv_had = random_bit(b); fiber.exchange(b); qc.label('apply had'); qc.nop(); if (recv_had) b.had(); qc.nop(); qc.label(''); qc.nop(); qc.label('read value'); qc.nop(); recv_val = b.read(); qc.nop(); qc.label(''); qc.nop();
// Now Alice emails Bob to tell // him her had setting and value. // If the had setting matches and the // value does not, there's a spy! if (send_had == recv_had) if (send_value != recv_val) qc.print('Caught a spy!\n');
```
參考資料
- 《量子計算機程式設計:從入門到實踐》
[美] 埃裡克·R· 約翰斯頓 , [英] 尼古拉斯·哈里根 著;
[西] 梅塞德絲·希梅諾,[中]鄭明智譯