第六屆·2024 MindSpore量子計算駭客松火熱進行中。本次大賽由量子資訊網路產業聯盟主辦,昇思MindSpore Quantum社群承辦,多所高校和單位聯合舉辦。開發者將全面體驗全新一代通用量子計算框架MindSpore Quantum。
熱身賽為量子計算基礎學習和程式設計演練。完成熱身賽的前100名選手將有機會獲得定製文化衫1件,數量有限,不容錯過。
第一步:關注MindQuantum程式碼倉,參見量子軟體程式設計指南
第二步:註冊並完成華為雲賬號實名認證。
第三步:登入HiQ量子計算雲平臺進行線上答題。
熱身賽參考文件:https://competition.huaweicloud.com/information/1000042022/noise
每道題目的上方都有兩個連結:MindQuantum教程和MindQuantum API參考。兩個連結中都能找到題目的解答。小技巧:在MindQuantum API參考中搜尋題目中的關鍵詞,可以快速找到對應的內容。
熱身賽透過攻略影片回放:https://www.koushare.com/live/details/33684
第一題
這道題考的是如何線上路中用on的方式新增量子門,在MindQuantum中,每個量子門都有on方法,比如X.on(0, 1)就意味著將X門作用在第0個位元上,並且受第1個位元控制。本題要求X門作用在第2個位元上,受第0個和第1個位元控制。因此可以用X.on(2, [0, 1])來表示。可以看到,on方法的第二個引數可以接受包含多個控制位的列表,因此可以方便的新增多控制門。詳細用法可以參考 on方法的API文件。
第二題
這道題考的是如何對量子線路進行壓縮。在MindSpore Quantum中,Circuit類是量子線路模組,其中實現了很多操作量子線路的方法。其中就有一個方法可以壓縮線路,介面名就叫作compress()。因此,這道題呼叫compress()方法就可以成功透過了。
第三題
這道題考的是線路翻轉,也就是說,我們需要將線路的位元順序上下顛倒。題中給出了一個很長的線路,但是我們並不需要關心線路的具體內容,因為Circuit類中有一個方法可以直接實現線路翻轉的功能——reverse_qubits(),我們在程式碼中直接呼叫該方法就可以成功透過了。
第四題
這道題考的是如何給引數化量子線路中的變數名新增字尾,掌握這種技巧就可以很方便的搭建變分量子線路了。在mindquantum.core.circuit模組中,add_suffix()函式就可以實現新增字尾的功能。具體來說,它需要接受一個量子線路和一個字尾字串作為輸入引數,然後返回一個新增了字尾的新的量子線路。選手只需要將這個新的量子線路透過+=的方式新增到新構造的線路後面,就可以構造出多層的變分線路了。題中的程式碼如下:
首先我們需要將add_suffix()函式 import 進來。題目中需要搭建3層線路,因此可以用一個迴圈實現,在每次迴圈中都對 new_circ 用+=的方式新增add_suffix()函式返回的新線路,字尾字串設定為迴圈計數器的值p,就可以成功透過題目了。
第五題
題目中給出了所有需要用到模組的連結,點選即可檢視用法。其中,第三個門——RY受控門可以用RY門簡單搭建出來:circ += RY(0.1).on(1, 0) 。QubitOperator可以構造泡利運算元,Hamiltonian則是構造哈密頓量的類,因此題中的哈密頓量可以這樣構建:ham = Hamiltonian(QubitOperator(“X0 Y1”)) 。最後,執行 sim.get_expectation(ham, circ) 就得到哈密頓量的期望值了。
第六題
mindquantum.algorithm.nisq 中可以看到各種已實現的Ansatz線路,只需要傳入位元數和層數即可構造(題中ansatz為RYCascade),構造完成後,circ = RYCascade(n_qubits, depth).circuit 就得到ansatz線路了。
第七題
這題考的是Rn門的構造,以及如何求變分線路引數關於哈密頓量的期望值和梯度。Rn門有3個引數,因此可以像這樣構造含參線路: circ += Rn(‘a’,’b’,’c’).on(0) ,哈密頓量的構造方法與第五題類似:ham = Hamiltonian(QubitOperator(“Z0”)) ,梯度運算元需要呼叫模擬器的類方法來得到:grad_ops = sim.get_expectation_with_grad(ham, circ) ,得到的梯度運算元可以傳入線路引數的具體數值,並返回相應的期望值和梯度: f, g = grad_ops(np.array([alpha, beta, gamma])) ,由於題目需要求α的導數值,最後將得到的梯度值的第一個引數的實部返回即可:return np.real(g[0,0,0]) 。
第八題
此題中涉及的數學概念較多,但總的來說考的是TimeEvolution模組的使用,下面我們詳細分析一下。
TimeEvolution類屬於mindquantum.core.operator模組,主要功能是根據哈密頓量生成式子對應的量子線路。它接受兩個輸入引數:第一個是哈密頓量H,第二個是演化時間t。呼叫TimeEvolution().circuit方法將返回一個量子線路,對應於算符。在某些情況下,生成的線路只是理論值的一種近似,因此會出現精度問題,而這種近似可以透過增加近似階數 n 來提高精度(具體近似公式如題中所述)。在本題中,我們需要用TimeEvolution生成 n 階的近似線路,並與理論計算得到的精確值相比較。
可以看到,在題目程式碼中已經給出了哈密頓量H(第7行)和精確值 m1(第8行),並且在迴圈中給出了線路對應的矩陣m2(第14行),以及m1與m2比較的程式碼(第15行)。我們只需要補充第12行,即:用TimeEvolution生成 n 階的近似線路。
在近似公式中可以發現,所謂n階近似,就是將演化時間t除以n,變成,再將該式子作用 n次,即。這個式子可以這樣構造:括號中的式子可以用TimeEvolution模組生成量子線路,然後將該線路重複n次,即可得到n階近似線路。我們可以很簡潔的實現整個過程:TimeEvolution(h, 1.0/n).circuit*n,一行簡短的程式碼就構造出了n階近似。
之後這個線路的矩陣m2會與理論解m1相比較,如果達到精度1e-2的話,則跳出迴圈,這樣就得到了達到精度所需的最小的n。
第九題
本題考的是如何線上路中新增噪聲。在MindQuantum中,透過ChannelAdder可以構建噪聲模型。首先我們透過GateSelector設定需要新增噪聲的門,然後用MixerAdder結合想要新增的噪聲,例如:MixerAdder([GateSelector('x'),DepolarizingChannelAdder(0.05, 1)]) 。Y門和CNOT門以此類推,最後,透過SequentialAdder結合成一個噪聲模型:
第十題
本題考慮的是執行真實量子硬體的情況,此時我們無法直接求得關於哈密頓量的期望值,只能透過處理多次取樣獲得的位元串來得到結果。 假設線路末態為
,則期望值為(因為)。在取樣10000次後,得到的位元串分佈應當近似於相應的係數,因此可以認為:a=res.data.get('00', 0)/shots,以此類推,最後將計算出的期望值返回即可。
大賽報名&邀請好友參賽
點選檢視獎品和操作步驟:https://competition.huaweicloud.com/information/1000042022/invite
大賽連結:https://competition.huaweicloud.com/information/1000042022/introduction
點選關注,第一時間瞭解華為雲新鮮技術~