如何用個人電腦打造量子模擬器

正式開始研究生中量子計算的學習:

 

量子計算機與量子編程

1.1 量子計算機

所謂量子計算即利用量子力學現象來進行計算,例如量子疊加和量子糾纏。量子計算機是一種執行量子計算的設備。

1.2 量子編程語言

量子編程是一種能夠在量子計算機上運行的指令序列,稱爲量子程序。量子編程語言有助於使用高級結構來表達量子算法。

1.3 量子編程語言種類

量子編程語言包括命令式量子編程語言、函數式量子編程語言和多範式量子編程語言三類。命令式量子編程語言有 QCL、Quantum pseudocode、Q|SI>、Q language、qGCL、QMASM;函數式量子編程語言有 QFC 和 QPL、QML、LIQUi|>、Quantum lambda calculi、Quipper;而下面我們要介紹的 Q# 就屬於多範式量子編程語言。

2 搭建量子編程環境

量子計算機真正可以使用還有較長一段時間,目前還沒有成熟的量子編程環境和編譯工具,微軟算是在該領域發力比較早的公司。在本月11日發佈了一個量子開發工具包的免費預覽版,本文將介紹使用微軟量子開發工具包(Microsoft Quantum Development Kit,簡稱爲 QDK)在 Visual Studio 中進行 Q# 量子編程。

2.1 量子開發工具包介紹

在今天9月下旬的 Ignite 大會上,微軟將量子計算列爲三大關鍵技術之一(另外兩項爲人工智能和虛擬現實),這三項關鍵技術將會改變我們所知道的科技行業。該公司還宣佈計劃在今年晚些時候發佈量子計算機的新編程語言。

2017年即將結束,微軟也如期推出了免費的 Quantum 開發套件預覽版,該套件包括量子計算模擬器,Q# 編程語言(發音爲“Q Sharp”)以及其他資源。

微軟量子開發工具包預覽版提供了一個完整的開發和仿真環境,其中包含了以下組件:Q# 語言和編譯器、Q# 標準庫、本地量子機模擬器、量子計算機跟蹤模擬器、Visual Studio 擴展。

微軟也正在製作一套全面的開發文檔,以及庫和示例程序,爲人們提供所需要的背景知識,瞭解量子系統的獨特之處,比如量子隱形傳態。

2.1.1 Q# 量子編程語言

微軟對Q#的描述稱之爲“一種用於表達量子算法領域專用編程語言”。它被用於編寫在一個附屬量子處理器上執行的子程序,在一個經典主機程序和計算機的控制下。

藉助 Visual Studio 的強大功能,將來使用 Q# 進行量子編程操縱量子比特,就像使用 C++#、F# 或 C++ 等語言開發傳統經典應用程序一樣簡單。

2.1.2 量子模擬器

使用作爲套件一部分的量子模擬器,您可以在筆記本電腦上模擬一個約30個邏輯量子位的量子計算機。所以,你不需要依賴於某個遠程服務器。如果您願意推出邊界並模擬40多個邏輯量子位,則可以使用基於Azure的模擬器。

模擬器不僅可以運行量子程序,甚至可以在 Visual Studio 中測試和調試你的量子程序,比如設置斷點、單步調試、變量跟蹤等。

使用該開發工具包的優點在於,當我們插入量子硬件時,這個代碼不需要改變。這點其實和我們使用 iOS 模擬器或 Android 模擬器開發移動應用程序是一樣的,模擬器屏蔽了底層硬件實現的差異。

先決條件: 1. 使用該量子開發工具包,需要使用最新版本的 Visual Studio 2017。 2. 目前該模擬器只能運行在64位的 Windows 系統上。 3. 需要使用支持高級向量擴展(AVX)指令集的 CPU

當你運行程序報類似 System.DllNotFoundException:“無法加載 DLL“Microsoft.Quantum.Simulator.Runtime.dll”: 異常來自 HRESULT:0xC000001D。” 的異常時,可能就是因爲你的 CPU 不支持 AVX 指令集,請考慮換一臺電腦吧!

(按照微軟的說法,Intel 2011年第一季度以及之後出貨的 CPU 支持 AVX 功能)。你可以使用 CPU-Z 之類的工具自行檢測。如下圖所示說明你的 CPU 支持 AVX 指令集: 

2.2 下載並安裝 Visual Studio

如果你還沒有安裝 Visual Studio 集成開發環境,請先下載 Visual Studio 2017 並進行安裝。注意在安裝時,在“工作負載”選項卡下選中“通用 Windows 平臺開發”和“.NET 桌面開發”兩個複選框。

2.3 下載並安裝量子開發工具包

2.3.1 方式一:在 Visual Studio 市場下載

2.3.1.1 下載

在 Visual Studio Marketplace 市場下載量子開發工具包 ,它是一個 Visual Studio 擴展包,名稱爲 QsharpVSIX.vsix,非常小,只有1MB左右大小。該量子開發工具包爲 Q# 編程語言開發量子算法提供支持。

如果你希望收到工具包或開發資源的更新消息,可以點擊試用Quantum開發套件,在線填寫一份表格。內容包括姓名、郵箱、電話和公司信息等,工具包或開發資源一旦有更新,會將最新消息發送到你的填寫的郵箱。(注意:填寫信息後在試用頁面點擊下載,國內網絡是乎不會跳轉到上述下載頁面)。

2.3.1.2 安裝

找到下載的 QsharpVSIX.vsix 文件雙擊運行,等待片刻即可安裝完成。

2.3.2 方式二:Visual Studio 擴展和更新

如果知道擴展的名稱或關鍵字,使用這種方式安裝是最簡單快捷的,只需要搜索相應關鍵字找到想要的擴展,點擊即可下載和安裝。

2.3.2.1 下載

打開 Visual Studio 2017,選擇“工具(T)”->“擴展和更新(U)…”,在彈出的擴展和更新窗口中選擇“聯機”菜單,在右側搜索框中輸入 “Quantum” 並回車,點擊 “Microsoft Quantum Development Kit” 中的“下載(D)”會彈出對話框進行下載。搜索下載 QDK 擴展如下圖所示: 

2.3.2.2 安裝

等待下載完成後,關閉所有 Visual Studio 窗口後將自動執行開始安裝。

2.4 驗證安裝

如果不出意外,安裝成功後,新建項目時會看到多出3個模板,分別爲:Q# Application、Q# Library 和 Q# Test Project。如下圖所示: 

同時在 Visual Studio 中,選擇“幫助(H)”->“關於 Microsoft Visual Studio” 也可以看到 “Microsoft Quantum Development Kit - 0 and 1” 的字樣。如下圖所示: 

3 第一個量子程序

你可以到 GitHub 上克隆微軟的 Microsoft Quantum Developer Kit Samples and Libraries 示例項目,然後直接運行驗證安裝並查看效果。這裏我們從新建項目開始,手動編寫一些代碼,對量子位(Qubit)執行一些操作,讓量子位呈現疊加狀態或兩個量子進行糾纏,然後測試並輸出結果。演示量子世界裏最簡單的量子糾纏--貝爾態。

3.1 創建解決方案和項目

打開 Visual Studio 2017,選擇“文件(F)”->“新建(N)”->“項目(P)…”,在“已安裝”->“Visual C#”,然後選擇 Q# Application 模板。填寫項目名稱和解決方案名稱,並選擇一個存放項目的目錄,然後點擊“確定”按鈕。

項目創建後 Visual Studio 會生成並打開兩個文件,分別爲 Operation.qs 和 Driver.cs。後綴爲 .qs 的 Q# 文件是量子程序的代碼文件,但其本身不能直接運行,需要使用 C# (也可以使用其他編程言來調用,如 F#、VB、C++ 或 Python 等)程序作爲驅動進行調用。項目結構如下圖所示: 

3.2 編寫 Q# 代碼

爲了方便說明,我們將 Operation.qs 重命名爲 Bell.qs(該文件中會定義一個名爲 BellTest 的操作,編譯後在 C# 中使用 BellTest 調用時,IED 會有智能感知提示。雖然不改名稱代碼也可以正常運行,但在 C# 驅動程序中會有紅線錯誤出現)。

在 Q# 中是通過定義“操作”來獲取或設置量子位狀態的,在定義操作之前,我們需要先引入操作量子位的原語 Microsoft.Quantum.Primitive 命名空間,該命名空間定義了很多基本的量子邏輯門操作,例如:M()、X()、Z()、H()、CNOT()等。

在 Bell.qs 中定義一個 Set 操作,其作用非常簡單,判斷給定的量子位狀態是否與期望的結果一致。如果一致,則啥也不做;若不一致,就將其進行翻轉過來。代碼如下所示:

operation Set(desired: Result, q1: Qubit) : () {    body    {        // 測量(M)q1 量子位的狀態        let current = M(q1);        if (desired != current)        {            // 如果與期望的不相等,將其進行翻轉(X)            X(q1);        }    } }

定義操作的方式非常簡單,只需要使用 operation 關鍵字,緊跟着是操作的名稱,名稱後面用一個元組作爲操作的參數,參數包含名稱和類型。操作參數後面跟上一個冒號,然後用一個元組來表示操作的返回值,返回值只需要提供數據類型,不需要名稱;如果沒有返回值,則直接寫上一對小括號即可。需要注意的是:具體的操作代碼應當寫在用大括號包裹的操作體 body {} 中。

下面定義一個操作 BellTest 來測試兩個量子位的糾纏,將操作代碼添加到 Bell.qs 文件的 Set 操作下方,代碼如下所示:

operation BellTest() : (Result, Result) {    body    {        // 用於保存量子位狀態的可變局部變量        mutable s1 = Zero;        mutable s2 = Zero;        // 分配兩個量子位        using (qubits = Qubit[2])        {            // 將第一個量子位執行阿達馬門實現狀態疊加            H(qubits[0]);            // 通過可控非門將兩個量子進行糾纏            CNOT(qubits[0], qubits[1]);            // 測量兩個量子位的狀態            set s1 = M(qubits[0]);            set s2 = M(qubits[1]);            // 釋放量子位前需要將其重置0狀態            Set(Zero, qubits[0]);            Set(Zero, qubits[1]);        }        // 返回兩個量子位的狀態        return (s1, s2);    } }

上述操作分配了兩個量子位,並對第一個量子位執行阿達馬門 H 操作,使其處於疊加狀態,然後通過可控非門 CNOT 將兩個量子進行糾纏,最後分別測量兩個量子的狀態並以元組方式返回。

需要注意的是:使用 using 分配量子位後,會在程序離開結束的大括號 { 時進行自動釋放,在釋放時需要先將量子位狀態重置爲 0 狀態。

3.3 使用 C# 調用 Q# 操作

前面提到需要使用 C# 作爲驅動程序來調用 Q# 程序,那它是怎麼做到的呢?事實上 Visual Studio 在編譯的時候,會把每個 xxx.qs 文件都會生成一個對應的 xxx.q.cs 文件,保存在項目下的 obj\qsharp\src 目錄下。

在 xxx.g.cs 文件中,會將每個操作生成對應的類,比如上述 Bell.qs 中的 Set 操作和 BellTest 操作,會生成對應的 Set類和 BellTest 類。這兩個類繼承至 Operation 抽象類,每個類中都包含一個靜態的異步 Run 方法。

在 C# 驅動程序中,首先定義一個量子模擬器,然後循環 10 次測試兩個量子位糾纏後的狀態,並輸出到控制檯。具體代碼如下所示:

static void Main(string[] args) {    using (var sim = new QuantumSimulator())    {        for (int i = 0; i < 10; i++)        {            var (s1, s2) = BellTest.Run(sim).Result;            Console.WriteLine($"第{i}次:Q1狀態 {s1,-5} Q2狀態 {s2,-5}");        }    }    Console.WriteLine("按任意鍵繼續...");    Console.ReadKey(); }

創建量子模擬器前需要導入 Microsoft.Quantum.Simulation.Simulators 命名空間,如果你的代碼用到量子 Result 狀態枚舉,你還需要導入 Microsoft.Quantum.Simulation.Core 命名空間。

3.4 運行結果

從運行結果可以看出,不管運行多少次,第一個量子位的狀態始終與第二個量子位的狀態保持一致。運行結果如下圖所示: 

4 參考資料

Microsoft Quantum Development Kit

Setting up the Q# development environment | Microsoft Docs

Microsoft Quantum Developer Kit Samples and Libraries

The future is quantum: Microsoft releases free preview of Quantum Development Kit

Microsoft Quantum Development Kit: Introduction and step-by-step demo

Quantum Computing - Top 3 Microsoft Breakthroughs with Krysta Svore

Quantum mechanics

Quantum programming

Quantum algorithm

Quantum annealing

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章