最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python中的魔法函數(shù)與量子計(jì)算模擬

 更新時(shí)間:2023年03月14日 09:39:16   作者:DECHIN  
這篇文章主要介紹了python的魔法函數(shù)和量子計(jì)算模擬,我們可以通過一個(gè)實(shí)際的案例來先審視一下這兩個(gè)需求是如何被結(jié)合起來的,希望對大家有所幫助

技術(shù)背景

本文主要涵蓋兩個(gè)領(lǐng)域的知識(shí)點(diǎn):python的魔法函數(shù)和量子計(jì)算模擬,我們可以通過一個(gè)實(shí)際的案例來先審視一下這兩個(gè)需求是如何被結(jié)合起來的。

量子計(jì)算模擬背景

ProjectQ是一個(gè)非常優(yōu)雅的開源量子計(jì)算編程框架,其原作者是來自與瑞士聯(lián)邦理工的博士Damian和Thomas。該量子計(jì)算編程框架是一個(gè)從量子計(jì)算應(yīng)用->量子線路編譯->哈密頓量模擬->量子計(jì)算模擬->量子硬件API對接都有相應(yīng)實(shí)現(xiàn)的、非常全面的量子計(jì)算編程框架。其開源地址為:https://github.com/ProjectQ-Framework/ProjectQ,支持使用pip進(jìn)行安裝:python3 -m pip install projectq --upgrade。

下面來看一個(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),對應(yīng)于projectq輸出的amplitude矢量應(yīng)為[1, 0, 0, 0]。這個(gè)矢量中的4個(gè)元素,分別對應(yīng)00,01,10,11這四個(gè)量子態(tài)可能出現(xiàn)的概率幅,如果需要計(jì)算某一個(gè)態(tài)被測量所出現(xiàn)的概率的話,需要對其進(jìn)行取模平方操作:

P(00)=(a00+b00i)(a00−b00i)

注意概率幅是一個(gè)復(fù)數(shù)(Complex Number),因此需要取厄米共軛之后再進(jìn)行點(diǎn)乘操作。

那么回到上述projectq的使用案例,這個(gè)案例在分配了兩個(gè)比特之后,對其中的第一個(gè)比特執(zhí)行了泡利矩陣σX操作,然后又執(zhí)行了一個(gè)糾纏門操作CX。這里CX(i,j)量子門操作對應(yīng)的操作為:如果量子比特i處于|0⟩態(tài),不進(jìn)行任何的操作;但是如果量子比特i出于|1⟩態(tài),則對量子比特j執(zhí)行取反操作,也就是說,如果原來j是|0⟩就會(huì)變成|1⟩,如果原來j是|1⟩就會(huì)變成|0⟩。這就是量子糾纏在量子計(jì)算中的作用,而多比特的門操作在實(shí)際的硬件體系中的高質(zhì)量實(shí)現(xiàn),目前依舊是一大難題。而量子疊加特性就體現(xiàn)在,一個(gè)量子比特可能處于|0⟩態(tài),也可能處于|1⟩態(tài),還有可能處在|0⟩和|1⟩的中間態(tài),這種中間態(tài)會(huì)以上述提到的概率幅的形式來對|0⟩和|1⟩進(jìn)行劃分:

P(0)=(a0+b0i)⋅(a0−b0i)

P(1)=(a1+b1i)⋅(a1−b1i)

這些的概率幅就可以用一個(gè)矢量的形式組織起來:

|ψ⟩=(a0+b0i,a1+b1i)T

最終這個(gè)矢量的元素個(gè)數(shù)會(huì)隨著比特?cái)?shù)的增加而指數(shù)增長,當(dāng)比特?cái)?shù)增長到41時(shí),所需要存儲(chǔ)的內(nèi)存空間需要32TB以上!要注意的是,因?yàn)橛?jì)算過程中需要將所有的概率幅加載到內(nèi)存中,所以這里區(qū)別于硬盤存儲(chǔ)空間,單指內(nèi)存就需要到32TB的大?。∫虼?,使用經(jīng)典計(jì)算機(jī)去模擬量子計(jì)算,其實(shí)是一種非常消耗資源的手段。當(dāng)然,量子計(jì)算模擬器依然有其研究的價(jià)值,在現(xiàn)階段量子芯片規(guī)模和質(zhì)量無法提升的狀態(tài)下,模擬器就起到了重要的作用。

Python的魔法函數(shù)實(shí)現(xiàn)

如果讀者需要了解詳細(xì)全面Python的魔法函數(shù)的實(shí)現(xiàn)方案,可以從本文的參考鏈接中獲取兩篇不錯(cuò)的文章。這里我們僅針對上述projectq的代碼用例中所可能使用到的部分功能:__or__和__str__,并且可以針對其進(jìn)行一個(gè)簡單的復(fù)現(xiàn)。

Python的魔法函數(shù)可用于定義一個(gè)類(class)的特殊運(yùn)算算符,如:類的加減乘除等,在引入魔法函數(shù)之后,就不需要單獨(dú)對類中的元素進(jìn)行操作,而可以用魔法函數(shù)對操作進(jìn)行封裝。最后的效果,我們可以直接在代碼中使用操作符對不同的類進(jìn)行操作,比如可以自定義class1 + class2這樣的二元操作算符。在本章節(jié)我們不詳細(xì)展開介紹,可以參考下述的具體使用示例或者參考鏈接中的博文。

量子態(tài)定義及實(shí)現(xiàn)

根據(jù)第一個(gè)章節(jié)中對量子態(tài)矢量的介紹,這里我們可以實(shí)現(xiàn)一個(gè)簡單的量子態(tài)的類,我們可以僅考慮兩個(gè)量子比特的簡單系統(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)的類的定義非常簡單,就是一個(gè)4×1的矩陣。需要補(bǔ)充說明的是,這里我們定義了一個(gè)__str__(self)的魔法函數(shù),該函數(shù)主要用于打印類的字符串表示,如我們這里直接將量子態(tài)矢量轉(zhuǎn)化成str格式之后進(jìn)行輸出。那么我們?nèi)绻rint一個(gè)自定義的QubitPair類的話,就會(huì)展示當(dāng)前類所對應(yīng)的概率幅的字符串表示。

量子門操作定義及實(shí)現(xiàn)

關(guān)于量子門操作,我們可以將其視作作用在量子態(tài)矢量上的矩陣,這里我們可以先展示定義好的門操作的Python類再對其進(jìn)行展開說明:

# 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è)兩能級體系的泡利矩陣具有非常好的物理性質(zhì),如都是酉矩陣且存在特殊的對易關(guān)系等:

矩陣指數(shù)與旋轉(zhuǎn)門操作

矩陣的指數(shù)計(jì)算一般采用泰勒級數(shù)展開的方法來進(jìn)行定義:

這里如果我們代入上述介紹的泡利矩陣就會(huì)得到這樣的結(jié)果:

CX門操作的定義

在上述提到的所有的量子門操作中,CX是唯一的一個(gè)兩比特量子門操作,也就是同時(shí)作用在兩個(gè)量子比特上面,其矩陣形式的定義如下所示:

使用魔法函數(shù)__or__來實(shí)現(xiàn)量子門操作運(yùn)算

我們首先簡單談一下為什么要用__or__這個(gè)魔法函數(shù)而不是其他的二元運(yùn)算符來實(shí)現(xiàn),這點(diǎn)跟開源庫ProjectQ是同步的,理由是我們在量子力學(xué)中的運(yùn)算,一般寫成如下的形式:

|ψt⟩=U|ψ0⟩

將量子態(tài)寫成狄拉克符號(hào)的形式,中文稱為"左矢"和"右矢",英文稱之為"bra"和"ket"。因此豎線形式的定義,在形式上會(huì)更加契合量子力學(xué)的思維,當(dāng)然,就算是換成其他的符號(hào)也是無可厚非的。

功能測試驗(yàn)證

在定義了量子態(tài)的類和量子門操作的類之后,我們可以寫如下所示的一個(gè)測試腳本來測試程序的執(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è)程序的測試邏輯為:先定義一個(gè)兩比特的量子系統(tǒng),然后對第一個(gè)比特執(zhí)行X門操作,使得其從|0⟩態(tài)變成|1⟩態(tài),再對這兩個(gè)比特執(zhí)行糾纏門CX操作,觀察其態(tài)的變化情況。之后再將第一個(gè)比特的狀態(tài)變回|0⟩態(tài),再觀察作用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é)果所展示出來的數(shù)字也許比較亂,這是因?yàn)樵谶\(yùn)算過程中的計(jì)算精度不足所導(dǎo)致的,這里低于1e-06的數(shù)字其實(shí)我們可以認(rèn)為就是0。那么我們從這個(gè)結(jié)果中可以分析總結(jié)出量子態(tài)的演變歷程:

|00⟩⇒|10⟩⇒|11⟩⇒|01⟩⇒|01⟩

注意:上面的這種寫法,其實(shí)不太合乎程序語言的邏輯,一般從右到左的方向才是從低位到高位的寫法。因此,嚴(yán)格來說寫法應(yīng)該是:|00⟩⇒|01⟩⇒|11⟩⇒|10⟩⇒|10⟩。

這里我們就完成了基于魔法函數(shù)的量子計(jì)算模擬的過程,感興趣的讀者可以自行嘗試更多的玩法,這里就不進(jìn)行更多的測試了!

總結(jié)概要

本文主要嘗試了用Python的魔法函數(shù)__str__來定義一個(gè)量子態(tài),以及使用__or__來定義一個(gè)量子門操作的運(yùn)算,我們附帶的也簡單介紹了一下量子計(jì)算模擬的一些背景知識(shí)。因?yàn)槌绦蛴泻唵味鞔_的執(zhí)行邏輯,因此用程序語言的方式來定義和理解科學(xué)常識(shí),也能夠加深對科學(xué)的理解。

到此這篇關(guān)于詳解Python中的魔法函數(shù)與量子計(jì)算模擬的文章就介紹到這了,更多相關(guān)Python魔法函數(shù) 量子計(jì)算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV自動(dòng)給圖片添加彩虹特效的實(shí)現(xiàn)示例

    OpenCV自動(dòng)給圖片添加彩虹特效的實(shí)現(xiàn)示例

    圖像處理的學(xué)習(xí)往往都是要先熟悉下圖像的一些基本處理方法,本文主要介紹了OpenCV自動(dòng)給圖片添加彩虹特效的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python requests模塊的使用示例

    python requests模塊的使用示例

    這篇文章主要介紹了python requests模塊的使用解析,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • Django JSONField的自動(dòng)轉(zhuǎn)換思路詳解(django自定義模型字段)

    Django JSONField的自動(dòng)轉(zhuǎn)換思路詳解(django自定義模型字段)

    如果想實(shí)現(xiàn)JSONField的自動(dòng)轉(zhuǎn)換,可以使用Django REST framework的JSONField,或者自定義一個(gè)字段類并覆蓋from_db_value()和get_prep_value()方法來實(shí)現(xiàn)這個(gè)功能,這篇文章主要介紹了Django JSONField的自動(dòng)轉(zhuǎn)換(django自定義模型字段)問題,需要的朋友可以參考下
    2023-06-06
  • window7下的python2.7版本和python3.5版本的opencv-python安裝過程

    window7下的python2.7版本和python3.5版本的opencv-python安裝過程

    這篇文章主要介紹了window7下的python2.7版本和python3.5版本的opencv-python安裝過程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 深入理解python中實(shí)例方法的第一個(gè)參數(shù)self

    深入理解python中實(shí)例方法的第一個(gè)參數(shù)self

    在Python中,self?是類的實(shí)例方法的一個(gè)參數(shù),代表類的實(shí)例對象本身,在本篇文章中,我們將深入探討?self?的工作原理以及它在Python編程中的重要性,需要的可以參考下
    2023-09-09
  • Python使用paramiko操作linux的方法講解

    Python使用paramiko操作linux的方法講解

    今天小編就為大家分享一篇關(guān)于Python使用paramiko操作linux的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • python人工智能tensorflow常見損失函數(shù)LOSS匯總

    python人工智能tensorflow常見損失函數(shù)LOSS匯總

    這篇文章主要為大家介紹了python人工智能tensorflowf常見損失函數(shù)LOSS匯總,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Selenium執(zhí)行完畢未關(guān)閉chromedriver/geckodriver進(jìn)程的解決辦法(java版+python版)

    Selenium執(zhí)行完畢未關(guān)閉chromedriver/geckodriver進(jìn)程的解決辦法(java版+python版

    這篇文章主要介紹了Selenium執(zhí)行完畢未關(guān)閉chromedriver/geckodriver進(jìn)程的解決辦法(java版+python版),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Python使用貪婪算法解決問題

    Python使用貪婪算法解決問題

    這篇文章主要介紹了Python使用貪婪算法解決問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python魔法方法 容器部方法詳解

    Python魔法方法 容器部方法詳解

    這篇文章主要介紹了Python魔法方法 容器部方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評論

合肥市| 寿阳县| 武冈市| 定州市| 乌拉特前旗| 祁阳县| 黄龙县| 仁寿县| 蒙城县| 兴城市| 贡山| 蛟河市| 织金县| 年辖:市辖区| 鄂尔多斯市| 喜德县| 甘德县| 紫金县| 静安区| 台江县| 华容县| 安图县| 皋兰县| 灵寿县| 乌恰县| 龙岩市| 浦城县| 通江县| 玉田县| 海南省| 洪湖市| 南阳市| 大石桥市| 衡山县| 达州市| 滨州市| 新兴县| 策勒县| 廊坊市| 柞水县| 梁平县|