這篇“Python中的魔法函數(shù)與量子計(jì)算模擬怎么實(shí)現(xiàn)”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Python中的魔法函數(shù)與量子計(jì)算模擬怎么實(shí)現(xiàn)”文章吧。
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、雅安服務(wù)器托管、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、撫順網(wǎng)站維護(hù)、網(wǎng)站推廣。
ProjectQ是一個(gè)非常優(yōu)雅的開(kāi)源量子計(jì)算編程框架,其原作者是來(lái)自與瑞士聯(lián)邦理工的博士Damian和Thomas。該量子計(jì)算編程框架是一個(gè)從量子計(jì)算應(yīng)用->量子線(xiàn)路編譯->哈密頓量模擬->量子計(jì)算模擬->量子硬件API對(duì)接都有相應(yīng)實(shí)現(xiàn)的、非常全面的量子計(jì)算編程框架。支持使用pip進(jìn)行安裝:python3 -m pip install projectq --upgrade。
下面來(lái)看一個(gè)例子,關(guān)于如何使用projectq進(jìn)行量子計(jì)算的模擬:
[dechin@dechin-manjaro simulator]$ ipython Python 3.8.5 (default, Sep 4 2020, 07:30:14) Type 'copyright', 'credits' or 'license' for more information IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: from projectq import MainEngine In [2]: from projectq.ops import X In [3]: eng = MainEngine() In [4]: qubits = eng.allocate_qureg(2) In [5]: X | qubits[0] In [6]: from projectq.ops import CX In [7]: CX | (qubits[0], qubits[1]) In [8]: eng.flush() In [9]: print (eng.backend.cheat()[1]) [0j, 0j, 0j, (1+0j)]
在這個(gè)案例中,我們一共分配了2個(gè)量子比特,這2個(gè)比特的初始狀態(tài)都是|0⟩態(tài),對(duì)應(yīng)于projectq輸出的amplitude矢量應(yīng)為[1, 0, 0, 0]。這個(gè)矢量中的4個(gè)元素,分別對(duì)應(yīng)00,01,10,11這四個(gè)量子態(tài)可能出現(xiàn)的概率幅,如果需要計(jì)算某一個(gè)態(tài)被測(cè)量所出現(xiàn)的概率的話(huà),需要對(duì)其進(jìn)行取模平方操作:
P(00)=(a00+b00i)(a00−b00i)
注意概率幅是一個(gè)復(fù)數(shù)(Complex Number),因此需要取厄米共軛之后再進(jìn)行點(diǎn)乘操作。
那么回到上述projectq的使用案例,這個(gè)案例在分配了兩個(gè)比特之后,對(duì)其中的第一個(gè)比特執(zhí)行了泡利矩陣σX操作,然后又執(zhí)行了一個(gè)糾纏門(mén)操作CX。這里CX(i,j)量子門(mén)操作對(duì)應(yīng)的操作為:如果量子比特i處于|0⟩態(tài),不進(jìn)行任何的操作;但是如果量子比特i出于|1⟩態(tài),則對(duì)量子比特j執(zhí)行取反操作,也就是說(shuō),如果原來(lái)j是|0⟩就會(huì)變成|1⟩,如果原來(lái)j是|1⟩就會(huì)變成|0⟩。這就是量子糾纏在量子計(jì)算中的作用,而多比特的門(mén)操作在實(shí)際的硬件體系中的高質(zhì)量實(shí)現(xiàn),目前依舊是一大難題。而量子疊加特性就體現(xiàn)在,一個(gè)量子比特可能處于|0⟩態(tài),也可能處于|1⟩態(tài),還有可能處在|0⟩和|1⟩的中間態(tài),這種中間態(tài)會(huì)以上述提到的概率幅的形式來(lái)對(duì)|0⟩和|1⟩進(jìn)行劃分:
P(0)=(a0+b0i)⋅(a0−b0i)
P(1)=(a1+b1i)⋅(a1−b1i)
這些的概率幅就可以用一個(gè)矢量的形式組織起來(lái):
|ψ⟩=(a0+b0i,a1+b1i)T
最終這個(gè)矢量的元素個(gè)數(shù)會(huì)隨著比特?cái)?shù)的增加而指數(shù)增長(zhǎng),當(dāng)比特?cái)?shù)增長(zhǎng)到41時(shí),所需要存儲(chǔ)的內(nèi)存空間需要32TB以上!要注意的是,因?yàn)橛?jì)算過(guò)程中需要將所有的概率幅加載到內(nèi)存中,所以這里區(qū)別于硬盤(pán)存儲(chǔ)空間,單指內(nèi)存就需要到32TB的大??!因此,使用經(jīng)典計(jì)算機(jī)去模擬量子計(jì)算,其實(shí)是一種非常消耗資源的手段。當(dāng)然,量子計(jì)算模擬器依然有其研究的價(jià)值,在現(xiàn)階段量子芯片規(guī)模和質(zhì)量無(wú)法提升的狀態(tài)下,模擬器就起到了重要的作用。
如果讀者需要了解詳細(xì)全面Python的魔法函數(shù)的實(shí)現(xiàn)方案,可以從本文的參考鏈接中獲取兩篇不錯(cuò)的文章。這里我們僅針對(duì)上述projectq的代碼用例中所可能使用到的部分功能:__or__和__str__,并且可以針對(duì)其進(jìn)行一個(gè)簡(jiǎn)單的復(fù)現(xiàn)。
Python的魔法函數(shù)可用于定義一個(gè)類(lèi)(class)的特殊運(yùn)算算符,如:類(lèi)的加減乘除等,在引入魔法函數(shù)之后,就不需要單獨(dú)對(duì)類(lèi)中的元素進(jìn)行操作,而可以用魔法函數(shù)對(duì)操作進(jìn)行封裝。最后的效果,我們可以直接在代碼中使用操作符對(duì)不同的類(lèi)進(jìn)行操作,比如可以自定義class1 + class2這樣的二元操作算符。在本章節(jié)我們不詳細(xì)展開(kāi)介紹,可以參考下述的具體使用示例或者參考鏈接中的博文。
根據(jù)第一個(gè)章節(jié)中對(duì)量子態(tài)矢量的介紹,這里我們可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的量子態(tài)的類(lèi),我們可以?xún)H考慮兩個(gè)量子比特的簡(jiǎn)單系統(tǒng):
# QubitPair.py import numpy as np class QubitPair: def __init__(self): self.state = np.array([1, 0, 0, 0], dtype=complex) def __str__(self): return str(self.state)
這個(gè)量子態(tài)的類(lèi)的定義非常簡(jiǎn)單,就是一個(gè)4×1的矩陣。需要補(bǔ)充說(shuō)明的是,這里我們定義了一個(gè)__str__(self)的魔法函數(shù),該函數(shù)主要用于打印類(lèi)的字符串表示,如我們這里直接將量子態(tài)矢量轉(zhuǎn)化成str格式之后進(jìn)行輸出。那么我們?nèi)绻rint一個(gè)自定義的QubitPair類(lèi)的話(huà),就會(huì)展示當(dāng)前類(lèi)所對(duì)應(yīng)的概率幅的字符串表示。
關(guān)于量子門(mén)操作,我們可以將其視作作用在量子態(tài)矢量上的矩陣,這里我們可以先展示定義好的門(mén)操作的Python類(lèi)再對(duì)其進(jìn)行展開(kāi)說(shuō)明:
# Operator.py import numpy as np class QubitOperator: """Pauli rotations and entanglement on qubit-pair""" def __init__(self, operation=None, theta=0, index=0): self.index = index self.name = operation paulix = np.array([[0, 1], [1, 0]], dtype=complex) pauliy = np.array([[0, -1j], [1j, 0]], dtype=complex) pauliz = np.array([[1, 0], [0, -1]], dtype=complex) cnot = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 1], [0, 0, 1, 0]]) if operation == 'X' or operation == 'Rx': self.operation = np.cos(theta/2)*np.identity(2)-1j*np.sin(theta/2)*paulix elif operation == 'Y' or operation == 'Ry': self.operation = np.cos(theta/2)*np.identity(2)-1j*np.sin(theta/2)*pauliy elif operation == 'Z' or operation == 'Rz': self.operation = np.cos(theta/2)*np.identity(2)-1j*np.sin(theta/2)*pauliz elif operation == 'CX' or operation == 'CNOT': self.operation = cnot def __or__(self, qubitpair): if self.name == 'CX' or self.name == 'CNOT': qubitpair.state = np.dot(self.operation, qubitpair.state) return None elif self.index == 0: operation = np.kron(self.operation, np.identity(2)) else: operation = np.kron(np.identity(2), self.operation) qubitpair.state = np.dot(operation, qubitpair.state)
單位矩陣與泡利矩陣的定義
這些是基本的泡利矩陣,這三個(gè)兩能級(jí)體系的泡利矩陣具有非常好的物理性質(zhì),如都是酉矩陣且存在特殊的對(duì)易關(guān)系等:
矩陣指數(shù)與旋轉(zhuǎn)門(mén)操作
矩陣的指數(shù)計(jì)算一般采用泰勒級(jí)數(shù)展開(kāi)的方法來(lái)進(jìn)行定義:
這里如果我們代入上述介紹的泡利矩陣就會(huì)得到這樣的結(jié)果:
CX門(mén)操作的定義
在上述提到的所有的量子門(mén)操作中,CX是唯一的一個(gè)兩比特量子門(mén)操作,也就是同時(shí)作用在兩個(gè)量子比特上面,其矩陣形式的定義如下所示:
使用魔法函數(shù)__or__來(lái)實(shí)現(xiàn)量子門(mén)操作運(yùn)算
我們首先簡(jiǎn)單談一下為什么要用__or__這個(gè)魔法函數(shù)而不是其他的二元運(yùn)算符來(lái)實(shí)現(xiàn),這點(diǎn)跟開(kāi)源庫(kù)ProjectQ是同步的,理由是我們?cè)诹孔恿W(xué)中的運(yùn)算,一般寫(xiě)成如下的形式:
|ψt⟩=U|ψ0⟩
將量子態(tài)寫(xiě)成狄拉克符號(hào)的形式,中文稱(chēng)為"左矢"和"右矢",英文稱(chēng)之為"bra"和"ket"。因此豎線(xiàn)形式的定義,在形式上會(huì)更加契合量子力學(xué)的思維,當(dāng)然,就算是換成其他的符號(hào)也是無(wú)可厚非的。
在定義了量子態(tài)的類(lèi)和量子門(mén)操作的類(lèi)之后,我們可以寫(xiě)如下所示的一個(gè)測(cè)試腳本來(lái)測(cè)試程序的執(zhí)行效果:
# TestQubits.py from QubitPair import QubitPair from Operator import QubitOperator if __name__ == '__main__': qubits = QubitPair() print ('The initial state is: {}'.format(qubits)) QubitOperator('X', 3.1415926, 0) | qubits print ('Applying X on the 0th qubit...') print ('The new state is: {}'.format(qubits)) QubitOperator('CX') | qubits print ('Applying entanglement on qubits...') print ('The new state is: {}'.format(qubits)) QubitOperator('X', 3.1415926, 0) | qubits print ('Applying X on the 0th qubit...') print ('The new state is: {}'.format(qubits)) QubitOperator('CX') | qubits print ('Applying entanglement on qubits...') print ('The new state is: {}'.format(qubits))
這個(gè)程序的測(cè)試邏輯為:先定義一個(gè)兩比特的量子系統(tǒng),然后對(duì)第一個(gè)比特執(zhí)行X門(mén)操作,使得其從|0⟩態(tài)變成|1⟩態(tài),再對(duì)這兩個(gè)比特執(zhí)行糾纏門(mén)CX操作,觀(guān)察其態(tài)的變化情況。之后再將第一個(gè)比特的狀態(tài)變回|0⟩態(tài),再觀(guān)察作用CX的態(tài)的變化情況,執(zhí)行結(jié)果如下所示:
[dechin@dechin-manjaro simulator]$ python3 TestQubits.py
The initial state is: [1.+0.j 0.+0.j 0.+0.j 0.+0.j]
Applying X on the 0th qubit...
The new state is: [2.67948966e-08+0.j 0.00000000e+00+0.j 0.00000000e+00-1.j
0.00000000e+00+0.j]
Applying entanglement on qubits...
The new state is: [2.67948966e-08+0.j 0.00000000e+00+0.j 0.00000000e+00+0.j
0.00000000e+00-1.j]
Applying X on the 0th qubit...
The new state is: [ 7.17966483e-16+0.00000000e+00j -1.00000000e+00+0.00000000e+00j
0.00000000e+00-2.67948966e-08j 0.00000000e+00-2.67948966e-08j]
Applying entanglement on qubits...
The new state is: [ 7.17966483e-16+0.00000000e+00j -1.00000000e+00+0.00000000e+00j
0.00000000e+00-2.67948966e-08j 0.00000000e+00-2.67948966e-08j]
這個(gè)結(jié)果所展示出來(lái)的數(shù)字也許比較亂,這是因?yàn)樵谶\(yùn)算過(guò)程中的計(jì)算精度不足所導(dǎo)致的,這里低于1e-06的數(shù)字其實(shí)我們可以認(rèn)為就是0。那么我們從這個(gè)結(jié)果中可以分析總結(jié)出量子態(tài)的演變歷程:
|00⟩⇒|10⟩⇒|11⟩⇒|01⟩⇒|01⟩
注意:上面的這種寫(xiě)法,其實(shí)不太合乎程序語(yǔ)言的邏輯,一般從右到左的方向才是從低位到高位的寫(xiě)法。因此,嚴(yán)格來(lái)說(shuō)寫(xiě)法應(yīng)該是:|00⟩⇒|01⟩⇒|11⟩⇒|10⟩⇒|10⟩。
以上就是關(guān)于“Python中的魔法函數(shù)與量子計(jì)算模擬怎么實(shí)現(xiàn)”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享標(biāo)題:Python中的魔法函數(shù)與量子計(jì)算模擬怎么實(shí)現(xiàn)
本文路徑:http://bm7419.com/article20/isgeco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、定制網(wǎng)站、網(wǎng)站導(dǎo)航、軟件開(kāi)發(fā)、、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)