在 Visual Studio 中使用 Q# 进行量子编程
1 量子計(jì)算機(jī)與量子編程
1.1 量子計(jì)算機(jī)
Quantum computing is computing using quantum-mechanical phenomena, such as superposition and entanglement. A quantum computer is a device that performs quantum computing.
所謂量子計(jì)算即利用量子力學(xué)現(xiàn)象來(lái)進(jìn)行計(jì)算,例如量子疊加和量子糾纏。量子計(jì)算機(jī)是一種執(zhí)行量子計(jì)算的設(shè)備。
1.2 量子編程語(yǔ)言
Quantum programming?is the process of assembling sequences of instructions, called quantum programs, that are capable of running on a quantum computer.?Quantum programming languages?help express?quantum algorithms?using high-level constructs.
量子編程是一種能夠在量子計(jì)算機(jī)上運(yùn)行的指令序列,稱為量子程序。量子編程語(yǔ)言有助于使用高級(jí)結(jié)構(gòu)來(lái)表達(dá)量子算法。
1.3 量子編程語(yǔ)言種類
量子編程語(yǔ)言包括命令式量子編程語(yǔ)言、函數(shù)式量子編程語(yǔ)言和多范式量子編程語(yǔ)言三類。命令式量子編程語(yǔ)言有 QCL、Quantum pseudocode、Q|SI>、Q language、qGCL、QMASM;函數(shù)式量子編程語(yǔ)言有 QFC 和 QPL、QML、LIQUi|>、Quantum lambda calculi、Quipper;而下面我們要介紹的 Q# 就屬于多范式量子編程語(yǔ)言。
2 搭建量子編程環(huán)境
量子計(jì)算機(jī)真正可以使用還有較長(zhǎng)一段時(shí)間,目前還沒有成熟的量子編程環(huán)境和編譯工具,微軟算是在該領(lǐng)域發(fā)力比較早的公司。在本月11日發(fā)布了一個(gè)量子開發(fā)工具包的免費(fèi)預(yù)覽版,本文將介紹使用微軟量子開發(fā)工具包(Microsoft Quantum Development Kit,簡(jiǎn)稱為 QDK)在 Visual Studio 中進(jìn)行 Q# 量子編程。
2.1 量子開發(fā)工具包介紹
在今天9月下旬的 Ignite 大會(huì)上,微軟將量子計(jì)算列為三大關(guān)鍵技術(shù)之一(另外兩項(xiàng)為人工智能和虛擬現(xiàn)實(shí)),這三項(xiàng)關(guān)鍵技術(shù)將會(huì)改變我們所知道的科技行業(yè)。該公司還宣布計(jì)劃在今年晚些時(shí)候發(fā)布量子計(jì)算機(jī)的新編程語(yǔ)言。
2017年即將結(jié)束,微軟也如期推出了免費(fèi)的 Quantum 開發(fā)套件預(yù)覽版,該套件包括量子計(jì)算模擬器,Q# 編程語(yǔ)言(發(fā)音為“Q Sharp”)以及其他資源。
微軟量子開發(fā)工具包預(yù)覽版提供了一個(gè)完整的開發(fā)和仿真環(huán)境,其中包含了以下組件:Q# 語(yǔ)言和編譯器、Q# 標(biāo)準(zhǔn)庫(kù)、本地量子機(jī)模擬器、量子計(jì)算機(jī)跟蹤模擬器、Visual Studio 擴(kuò)展。
微軟也正在制作一套全面的開發(fā)文檔,以及庫(kù)和示例程序,為人們提供所需要的背景知識(shí),了解量子系統(tǒng)的獨(dú)特之處,比如量子隱形傳態(tài)。
2.1.1 Q# 量子編程語(yǔ)言
微軟對(duì)Q#的描述稱之為“一種用于表達(dá)量子算法領(lǐng)域?qū)S镁幊陶Z(yǔ)言”。它被用于編寫在一個(gè)附屬量子處理器上執(zhí)行的子程序,在一個(gè)經(jīng)典主機(jī)程序和計(jì)算機(jī)的控制下。
借助 Visual Studio 的強(qiáng)大功能,將來(lái)使用 Q# 進(jìn)行量子編程操縱量子比特,就像使用 C#、F# 或 C++ 等語(yǔ)言開發(fā)傳統(tǒng)經(jīng)典應(yīng)用程序一樣簡(jiǎn)單。
2.1.2 量子模擬器
使用作為套件一部分的量子模擬器,您可以在筆記本電腦上模擬一個(gè)約30個(gè)邏輯量子位的量子計(jì)算機(jī)。所以,你不需要依賴于某個(gè)遠(yuǎn)程服務(wù)器。如果您愿意推出邊界并模擬40多個(gè)邏輯量子位,則可以使用基于Azure的模擬器。
模擬器不僅可以運(yùn)行量子程序,甚至可以在 Visual Studio 中測(cè)試和調(diào)試你的量子程序,比如設(shè)置斷點(diǎn)、單步調(diào)試、變量跟蹤等。
使用該開發(fā)工具包的優(yōu)點(diǎn)在于,當(dāng)我們插入量子硬件時(shí),這個(gè)代碼不需要改變。這點(diǎn)其實(shí)和我們使用 iOS 模擬器或 Android 模擬器開發(fā)移動(dòng)應(yīng)用程序是一樣的,模擬器屏蔽了底層硬件實(shí)現(xiàn)的差異。
先決條件:?
1. 使用該量子開發(fā)工具包,需要使用最新版本的 Visual Studio 2017。?
2. 目前該模擬器只能運(yùn)行在64位的 Windows 系統(tǒng)上。?
3. 需要使用支持高級(jí)向量擴(kuò)展(AVX)指令集的 CPU。
當(dāng)你運(yùn)行程序報(bào)類似?System.DllNotFoundException:“無(wú)法加載 DLL“Microsoft.Quantum.Simulator.Runtime.dll”: 異常來(lái)自 HRESULT:0xC000001D。”?的異常時(shí),可能就是因?yàn)槟愕?CPU 不支持 AVX 指令集,請(qǐng)考慮換一臺(tái)電腦吧!
(按照微軟的說(shuō)法,Intel 2011年第一季度以及之后出貨的 CPU 支持 AVX 功能)。你可以使用?CPU-Z?之類的工具自行檢測(cè)。如下圖所示說(shuō)明你的 CPU 支持 AVX 指令集:?
2.2 下載并安裝 Visual Studio
如果你還沒有安裝 Visual Studio 集成開發(fā)環(huán)境,請(qǐng)先下載?Visual Studio 2017?并進(jìn)行安裝。注意在安裝時(shí),在“工作負(fù)載”選項(xiàng)卡下選中“通用 Windows 平臺(tái)開發(fā)”和“.NET 桌面開發(fā)”兩個(gè)復(fù)選框。
2.3 下載并安裝量子開發(fā)工具包
2.3.1 方式一:在 Visual Studio 市場(chǎng)下載
2.3.1.1 下載
在 Visual Studio Marketplace 市場(chǎng)下載量子開發(fā)工具包?,它是一個(gè) Visual Studio 擴(kuò)展包,名稱為 QsharpVSIX.vsix,非常小,只有1MB左右大小。該量子開發(fā)工具包為 Q# 編程語(yǔ)言開發(fā)量子算法提供支持。
如果你希望收到工具包或開發(fā)資源的更新消息,可以點(diǎn)擊試用Quantum開發(fā)套件,在線填寫一份表格。內(nèi)容包括姓名、郵箱、電話和公司信息等,工具包或開發(fā)資源一旦有更新,會(huì)將最新消息發(fā)送到你的填寫的郵箱。(注意:填寫信息后在試用頁(yè)面點(diǎn)擊下載,國(guó)內(nèi)網(wǎng)絡(luò)是乎不會(huì)跳轉(zhuǎn)到上述下載頁(yè)面)。
2.3.1.2 安裝
找到下載的 QsharpVSIX.vsix 文件雙擊運(yùn)行,等待片刻即可安裝完成。
2.3.2 方式二:Visual Studio 擴(kuò)展和更新
如果知道擴(kuò)展的名稱或關(guān)鍵字,使用這種方式安裝是最簡(jiǎn)單快捷的,只需要搜索相應(yīng)關(guān)鍵字找到想要的擴(kuò)展,點(diǎn)擊即可下載和安裝。
2.3.2.1 下載
打開 Visual Studio 2017,選擇“工具(T)”->“擴(kuò)展和更新(U)…”,在彈出的擴(kuò)展和更新窗口中選擇“聯(lián)機(jī)”菜單,在右側(cè)搜索框中輸入 “Quantum” 并回車,點(diǎn)擊 “Microsoft Quantum Development Kit” 中的“下載(D)”會(huì)彈出對(duì)話框進(jìn)行下載。搜索下載 QDK 擴(kuò)展如下圖所示:?
2.3.2.2 安裝
等待下載完成后,關(guān)閉所有 Visual Studio 窗口后將自動(dòng)執(zhí)行開始安裝。
2.4 驗(yàn)證安裝
如果不出意外,安裝成功后,新建項(xiàng)目時(shí)會(huì)看到多出3個(gè)模板,分別為:Q# Application、Q# Library 和 Q# Test Project。如下圖所示:?
同時(shí)在 Visual Studio 中,選擇“幫助(H)”->“關(guān)于 Microsoft Visual Studio” 也可以看到 “Microsoft Quantum Development Kit - 0 and 1” 的字樣。如下圖所示:?
3 第一個(gè)量子程序
你可以到 GitHub 上克隆微軟的?Microsoft Quantum Developer Kit Samples and Libraries?示例項(xiàng)目,然后直接運(yùn)行驗(yàn)證安裝并查看效果。這里我們從新建項(xiàng)目開始,手動(dòng)編寫一些代碼,對(duì)量子位(Qubit)執(zhí)行一些操作,讓量子位呈現(xiàn)疊加狀態(tài)或兩個(gè)量子進(jìn)行糾纏,然后測(cè)試并輸出結(jié)果。演示量子世界里最簡(jiǎn)單的量子糾纏--貝爾態(tài)。
3.1 創(chuàng)建解決方案和項(xiàng)目
打開 Visual Studio 2017,選擇“文件(F)”->“新建(N)”->“項(xiàng)目(P)…”,在“已安裝”->“Visual C#”,然后選擇 Q# Application 模板。填寫項(xiàng)目名稱和解決方案名稱,并選擇一個(gè)存放項(xiàng)目的目錄,然后點(diǎn)擊“確定”按鈕。
項(xiàng)目創(chuàng)建后 Visual Studio 會(huì)生成并打開兩個(gè)文件,分別為 Operation.qs 和 Driver.cs。后綴為 .qs 的 Q# 文件是量子程序的代碼文件,但其本身不能直接運(yùn)行,需要使用 C# (也可以使用其他編程言來(lái)調(diào)用,如 F#、VB、C++ 或 Python 等)程序作為驅(qū)動(dòng)進(jìn)行調(diào)用。項(xiàng)目結(jié)構(gòu)如下圖所示:?
3.2 編寫 Q# 代碼
為了方便說(shuō)明,我們將 Operation.qs 重命名為 Bell.qs(該文件中會(huì)定義一個(gè)名為 BellTest 的操作,編譯后在 C# 中使用?BellTest?調(diào)用時(shí),IED 會(huì)有智能感知提示。雖然不改名稱代碼也可以正常運(yùn)行,但在 C# 驅(qū)動(dòng)程序中會(huì)有紅線錯(cuò)誤出現(xiàn))。
在 Q# 中是通過定義“操作”來(lái)獲取或設(shè)置量子位狀態(tài)的,在定義操作之前,我們需要先引入操作量子位的原語(yǔ)?Microsoft.Quantum.Primitive?命名空間,該命名空間定義了很多基本的量子邏輯門操作,例如:M()、X()、Z()、H()、CNOT()等。
在 Bell.qs 中定義一個(gè)?Set?操作,其作用非常簡(jiǎn)單,判斷給定的量子位狀態(tài)是否與期望的結(jié)果一致。如果一致,則啥也不做;若不一致,就將其進(jìn)行翻轉(zhuǎn)過來(lái)。代碼如下所示:
operation Set(desired: Result, q1: Qubit) : () {body{// 測(cè)量(M)q1 量子位的狀態(tài)let current = M(q1);if (desired != current) { // 如果有期望的不相等,將其進(jìn)行翻轉(zhuǎn)(X) X(q1); } } }?
定義操作的方式非常簡(jiǎn)單,只需要使用?operation?關(guān)鍵字,緊跟差是操作的名稱,名稱后面用一個(gè)元組作為操作的參數(shù),參數(shù)包含名稱和類型。操作參數(shù)后面跟上一個(gè)冒號(hào),然后用一個(gè)元組來(lái)表示操作的返回值,返回值只需要提供數(shù)據(jù)類型,不需要名稱;如果沒有返回值,則直接寫上一對(duì)小括號(hào)即可。需要注意的是:具體的操作代碼應(yīng)當(dāng)寫在用大括號(hào)包裹的操作體?body {}?中。
下面定義一個(gè)操作?BellTest?來(lái)測(cè)試兩個(gè)量子位的糾纏,將操作代碼添加到 Bell.qs 文件的?Set?操作下方,代碼如下所示:
operation BellTest() : (Result, Result) {body{// 用于保存量子位狀態(tài)的可變局部變量mutable s1 = Zero;mutable s2 = Zero;// 分配兩個(gè)量子位using (qubits = Qubit[2]) { // 將第一個(gè)量子位執(zhí)行阿達(dá)馬門實(shí)現(xiàn)狀態(tài)疊加 H(qubits[0]); // 通過可控非門將兩個(gè)量子進(jìn)行糾纏 CNOT(qubits[0], qubits[1]); // 測(cè)量?jī)蓚€(gè)量子位的狀態(tài) set s1 = M(qubits[0]); set s2 = M(qubits[1]); // 釋放量子位前需要將其重置0狀態(tài) Set(Zero, qubits[0]); Set(Zero, qubits[1]); } // 返回兩個(gè)量子位的狀態(tài) return (s1, s2); } }?
?
上述操作分配了兩個(gè)量子位,并對(duì)第一個(gè)量子位執(zhí)行阿達(dá)馬門?H?操作,使其處于疊加狀態(tài),然后通過可控非門?CNOT?將兩個(gè)量子進(jìn)行糾纏,最后分別測(cè)量?jī)蓚€(gè)量子的狀態(tài)并以元組方式返回。
需要注意的是:使用 using 分配量子位后,會(huì)在程序離開結(jié)束的大括號(hào)?{?時(shí)進(jìn)行自動(dòng)釋放,在釋放時(shí)需要先將量子位狀態(tài)重置為 0 狀態(tài)。
3.3 使用 C# 調(diào)用 Q# 操作
前面提到需要使用 C# 作為驅(qū)動(dòng)程序來(lái)調(diào)用 Q# 程序,那它是怎么做到的呢?事實(shí)上 Visual Studio 在編譯的時(shí)候,會(huì)把每個(gè) xxx.qs 文件都會(huì)生成一個(gè)對(duì)應(yīng)的 xxx.q.cs 文件,保存在項(xiàng)目下的 obj\qsharp\src 目錄下。
在 xxx.g.cs 文件中,會(huì)將每個(gè)操作生成對(duì)應(yīng)的類,比如上述 Bell.qs 中的?Set?操作和?BellTest?操作,會(huì)生成對(duì)應(yīng)的?Set類和?BellTest?類。這兩個(gè)類繼承至?Operation?抽象類,每個(gè)類中都包含一個(gè)靜態(tài)的異步 Run 方法。
在 C# 驅(qū)動(dòng)程序中,首先定義一個(gè)量子模擬器,然后循環(huán) 10 次測(cè)試兩個(gè)量子位糾纏后的狀態(tài),并輸出到控制臺(tái)。具體代碼如下所示:
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狀態(tài) {s1,-5} Q2狀態(tài) {s2,-5}"); } } Console.WriteLine("按任意鍵繼續(xù)..."); Console.ReadKey(); }?
?
創(chuàng)建量子模擬器前需要導(dǎo)入?Microsoft.Quantum.Simulation.Simulators?命名空間,如果你的代碼用到量子?Result?狀態(tài)枚舉,你還需要導(dǎo)入?Microsoft.Quantum.Simulation.Core?命名空間。
3.4 運(yùn)行結(jié)果
從運(yùn)行結(jié)果可以看出,不管運(yùn)行多少次,第一個(gè)量子位的狀態(tài)始終與第二個(gè)量子位的狀態(tài)保持一致。運(yùn)行結(jié)果如下圖所示:?
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
- 量子計(jì)算機(jī)解釋 - 人類技術(shù)的壁壘
- 出處?https://blog.csdn.net/li2008kui/article/details/78867791
轉(zhuǎn)載于:https://www.cnblogs.com/Justsoso-WYH/p/9018542.html
總結(jié)
以上是生活随笔為你收集整理的在 Visual Studio 中使用 Q# 进行量子编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3实现ICMP远控后门(上)
- 下一篇: Eclipse如何从SVN更新和上传修改