Qiskit漢化1.2|計(jì)算的原子

??學(xué)習(xí)量子計(jì)算、密碼學(xué)、Space等Web3前沿技術(shù)
??認(rèn)領(lǐng)Bounty,賺取賞金
??參與Hackathon,獲得資助
更多Web3精彩技術(shù)分享盡在Dōjō??
WeChat: @HackerDojo0

計(jì)算的原子
為量子計(jì)算機(jī)編程現(xiàn)在任何人都可以在自己家里做。
但是要?jiǎng)?chuàng)造什么呢?量子程序到底是什么?確切地說,什么是量子計(jì)算機(jī)?
這些問題可以通過與標(biāo)準(zhǔn)數(shù)字計(jì)算機(jī)進(jìn)行比較來回答。不幸的是,大多數(shù)人實(shí)際上也不理解數(shù)字計(jì)算機(jī)是如何工作的。在本文中,我們將了解這些設(shè)備背后的基本原理。為了幫助我們稍后過渡到量子計(jì)算,我們將使用與量子計(jì)算相同的工具。
如果想使用本頁中的代碼,請(qǐng)先運(yùn)行以下Python代碼:
1. 將信息拆分為比特
我們首先需要了解比特的概念。它們被設(shè)計(jì)成世界上最簡(jiǎn)單的字母。只需要兩個(gè)字符,0和1,就可以表示任何信息。
數(shù)就是一個(gè)例子。你可能習(xí)慣于用一個(gè)由0、1、2、3、4、5、6、7、8、9這10位數(shù)字組成的字符串來表示一個(gè)數(shù)。在這串?dāng)?shù)字中,每個(gè)數(shù)字表示這個(gè)數(shù)字包含10的某次方的次數(shù)。例如,當(dāng)我們寫9213時(shí),我們的意思是
$$9000+200+10+3$$
或者,用一種強(qiáng)調(diào)十的冪的方式來表示
$$(9×10^3)+(2×10^2)+(1×10^1)+(3×10^0)$$
雖然我們通?;跀?shù)字10來使用這個(gè)系統(tǒng),但我們也可以很容易地使用一個(gè)基于任何其他數(shù)字的系統(tǒng)。例如,二進(jìn)制系統(tǒng)是以數(shù)字2為基礎(chǔ)的。這意味著使用兩個(gè)字符0和1將數(shù)字表示為2的冪的倍數(shù)。例如,9213變成10001111111101,因?yàn)?/p>
$$
\begin{split}
9213=(1×2^{13})+(0×2^{12})+(0×2^{11})+(0×2^{10})+(1×2^9)+(1×2^8)+(1×2^7)\
+(1×2^6)+(1×2^5)+(1×2^4)+(1×2^3)+(1×2^2)+(0×2^1)+(1×2^0)
\end{split}
$$
在這里,我們將數(shù)字表示為2,4,8,16,32等的倍數(shù),而不是10,100,1000等。
這些比特串,也就是二進(jìn)制串,不僅可以用來表示數(shù)字。例如,有一種方法可以使用比特來表示任何文本。對(duì)于任何想要使用的字母、數(shù)字或標(biāo)點(diǎn)符號(hào),都可以使用這個(gè)表找到最多8位的對(duì)應(yīng)字符串。雖然這些都是很隨意的,但卻是一個(gè)被廣泛認(rèn)可的標(biāo)準(zhǔn)。事實(shí)上,這就是通過互聯(lián)網(wǎng)將這篇文章傳輸給你的方式。
這就是所有信息在計(jì)算機(jī)中的表現(xiàn)方式。無論是數(shù)字、字母、圖像還是聲音,它們都以二進(jìn)制字符串的形式存在。
和我們的標(biāo)準(zhǔn)數(shù)字計(jì)算機(jī)一樣,量子計(jì)算機(jī)也是基于同樣的基本思想。主要的區(qū)別在于它們使用的是量子比特,量子比特是比特在量子力學(xué)中的延伸。在本教科書的其余部分,我們將探索什么是量子比特,它們可以做什么,以及它們是如何做到這一點(diǎn)的。然而,在本節(jié)中,我們根本不會(huì)討論量子。所以,我們就像使用比特一樣使用量子比特。
快速練習(xí)
想一個(gè)數(shù)字,并嘗試用二進(jìn)制寫下來。
如果你有n個(gè)比特,它們可以處于多少種不同的狀態(tài)?
2. 以圖表示的計(jì)算
無論我們使用的是量子位還是比特,我們都需要對(duì)它們進(jìn)行操作,以便將我們的輸入轉(zhuǎn)化為我們需要的輸出。對(duì)于只有很少比特的最簡(jiǎn)單的程序,可以用電路圖(circuit diagram)來表示這個(gè)過程。左邊是輸入,右邊是輸出,中間是用神秘符號(hào)表示的運(yùn)算。這些操作被稱為“門”,主要是由于歷史原因。
下面是一個(gè)標(biāo)準(zhǔn)的、基于位的計(jì)算機(jī)的電路示例。你不需要理解它是做什么的。它應(yīng)該能讓你對(duì)這些電路有個(gè)大致的了解。

對(duì)于量子計(jì)算機(jī),我們使用相同的基本思想,但對(duì)于如何表示輸入、輸出和用于運(yùn)算的符號(hào)有不同的約定。這是表示上述相同過程的量子電路。

在本節(jié)的其余部分,我們將解釋如何構(gòu)建電路。最后,您將知道如何創(chuàng)建上述電路,它是做什么的,以及為什么它是有用的。
3. 你的第一個(gè)量子電路
在電路中,我們通常需要做三件事:首先,對(duì)輸入進(jìn)行編碼,然后進(jìn)行一些實(shí)際計(jì)算,最后提取輸出。對(duì)于你的第一個(gè)量子電路,我們將專注于最后一件事。我們首先創(chuàng)建一個(gè)具有8個(gè)量子比特和8個(gè)輸出的電路。
這個(gè)我們稱之為qc_output
的電路,是由Qiskit使用QuantumCircuit
創(chuàng)建的。QuantumCircuit
以量子電路中的量子比特?cái)?shù)作為參數(shù)。
量子電路中輸出的提取是使用名為measure_all()
的操作完成的。每次測(cè)量都告訴特定的量子比特給特定的輸出比特一個(gè)輸出。命令qc_output.measure_all()
向電路qc_output
中的每個(gè)量子比特添加一個(gè)測(cè)量值,并添加一些用于寫入輸出的經(jīng)典比特。
現(xiàn)在我們的電路中有一些東西,讓我們來看看它。

量子比特總是被初始化為給出輸出0。由于我們沒有對(duì)上面電路中的量子比特做任何操作,這正是我們測(cè)量它們時(shí)將得到的結(jié)果。我們可以通過多次運(yùn)行電路并將結(jié)果繪制成直方圖來觀察。我們會(huì)發(fā)現(xiàn)結(jié)果總是00000000:每個(gè)量子比特都是0。

之所以運(yùn)行多次并以直方圖的形式展示結(jié)果,是因?yàn)榱孔佑?jì)算機(jī)的結(jié)果可能具有一些隨機(jī)性。在這種情況下,由于我們沒有做任何量子操作,所以我們只能確定地得到00000000的結(jié)果。
請(qǐng)注意,這個(gè)結(jié)果來自量子模擬器,量子模擬器是一個(gè)計(jì)算理想量子計(jì)算機(jī)會(huì)怎么做的標(biāo)準(zhǔn)計(jì)算機(jī)。模擬只能用于少量的量子比特(~30個(gè)量子比特),但它們?nèi)匀皇悄阍谠O(shè)計(jì)你的第一個(gè)量子電路時(shí)非常有用的工具。要在真正的設(shè)備上運(yùn)行,你只需要將Aer.get_backend('aer_simulator')
替換為你想要使用的設(shè)備的后端對(duì)象。
4. 示例:創(chuàng)建加法器電路
4.1 對(duì)輸入進(jìn)行編碼
現(xiàn)在讓我們看看如何將不同的二進(jìn)制字符串編碼為輸入。為此,我們需要使用所謂的非門。這是你在計(jì)算機(jī)中能做的最基本的操作。它只是翻轉(zhuǎn)位值:將0變成1,1變成0。對(duì)于量子比特,是一個(gè)稱為x的操作來做非的工作。
下面我們創(chuàng)建一個(gè)專門用于編碼工作的新電路,稱之為qc_encode
?,F(xiàn)在,我們只指定量子比特的數(shù)量。

提取結(jié)果可以使用我們之前的電路:qc_output
。

現(xiàn)在我們可以運(yùn)行組合電路并查看結(jié)果。

現(xiàn)在,我們的計(jì)算機(jī)輸出的是字符串10000000。
我們翻轉(zhuǎn)的是位于字符串最左邊的第7位量子比特。這是因?yàn)镼iskit從右到左對(duì)字符串中的位進(jìn)行編號(hào)。有些人更喜歡用相反的方式對(duì)其位進(jìn)行編號(hào),但當(dāng)我們使用比特來表示數(shù)字時(shí),Qiskit系統(tǒng)當(dāng)然有它的優(yōu)勢(shì)。具體來說,這意味著第7位量子比特告訴我們數(shù)字中有多少個(gè)$2^7$。所以通過翻轉(zhuǎn)這個(gè)位,我們現(xiàn)在在簡(jiǎn)單的8位計(jì)算機(jī)中寫出了數(shù)字128。
現(xiàn)在試著為自己寫另一個(gè)數(shù)字。例如,你可以寫你的年齡。只需使用搜索引擎找出這個(gè)數(shù)字的二進(jìn)制形式(如果它包含“0b”,則忽略它),然后如果你的年齡小于128,則在左側(cè)添加一些0。

現(xiàn)在我們知道如何在計(jì)算機(jī)中編碼信息。下一步是處理它:獲取我們已編碼的輸入,并將其轉(zhuǎn)化為我們需要的輸出。
4.2記住如何做加法
要想把輸入轉(zhuǎn)化為輸出,我們需要解決一個(gè)問題。讓我們做一些基本的計(jì)算。在小學(xué),你將學(xué)習(xí)如何處理大型數(shù)學(xué)問題,并把它們分解成易于處理的小問題。例如,你將如何解決以下問題?
??$9213$
$+$?$1854$
$=$?$???$
一種方法是從右到左逐位計(jì)算。從3+4開始
??$9213$
$+$?$1854$
$=$?$???7$
然后是1+5
??$9213$
$+$?$1854$
$=$?$??67$
然后2+8=10。因?yàn)檫@是一個(gè)兩位數(shù)的答案,所以我們需要進(jìn)位。
??$9213$
$+$?$1854$
$=$?$?067$
??$1$
最后是9+1+1=11,得到答案
??$9213$
$+$?$1854$
$=$?$11067$
??$1$
這可能只是一個(gè)簡(jiǎn)單的加法,但它展示了所有算法背后的原理。無論算法是為了解決數(shù)學(xué)問題還是處理文本或圖像,我們總是將大任務(wù)分解為小而簡(jiǎn)單的步驟。
為了在計(jì)算機(jī)上運(yùn)行,算法需要被編譯成盡可能最小和最簡(jiǎn)單的步驟。為了看看它們是什么樣子,讓我們?cè)僮鲆淮紊厦娴募臃▎栴},不過這次使用二進(jìn)制。
??$10001111111101$
$+$?$00011100111110$
$=$?$???$
注意,第二個(gè)數(shù)字的左側(cè)有一串額外的0。這只是為了使兩個(gè)字符串具有相同的長(zhǎng)度。
我們的第一個(gè)任務(wù)是對(duì)右邊的列執(zhí)行1+0。在二進(jìn)制中,和在任何數(shù)字系統(tǒng)中一樣,答案是1。對(duì)于第二列的0+1,我們得到了相同的結(jié)果。
??$10001111111101$
$+$?$00011100111110$
$=$?$???11$
接下來是1+1。你肯定知道,1+1=2。在二進(jìn)制中,數(shù)字2被寫為10,因此需要兩個(gè)比特。這意味著我們需要進(jìn)位1,就像十進(jìn)制中10的進(jìn)位一樣。
??$10001111111101$
$+$?$00011100111110$
$=$?$???011$
????????$1$
下一列要求我們計(jì)算1+1+1。這意味著將三個(gè)數(shù)字相加,因此對(duì)我們的計(jì)算機(jī)來說,事情變得復(fù)雜了。但我們?nèi)匀豢梢詫⑵渚幾g為更簡(jiǎn)單的操作,并且只需要將兩個(gè)位相加。對(duì)于這個(gè),我們可以從前兩個(gè)1開始。
??$1$
$+$?$1$
$=$?$10$
現(xiàn)在我們需要把這個(gè)10加到最后一個(gè)1上,這可以用我們常用的遍歷列的方法來完成。
??$10$
$+$?$01$
$=$?$11$
最后的結(jié)果是11(也就是3)。
現(xiàn)在我們可以回到問題的其余部分。隨著上面的結(jié)果是11,我們有另一個(gè)進(jìn)位。
??$10001111111101$
$+$?$00011100111110$
$=$?$???1011$
????????$1$$1$
現(xiàn)在我們要做另一個(gè)1+1+1。但我們已經(jīng)知道怎么做了,所以這沒什么大不了的。
事實(shí)上,到目前為止,我們已經(jīng)知道如何去做了。這是因?yàn)?,如果你把所有東西分解為兩個(gè)比特相加,那么你需要的計(jì)算就只有四種情況。下面是四個(gè)基本的和(我們將用兩個(gè)比特來表示所有的答案)。
$0+0 = 00 (在十進(jìn)制中,這表示0+0=0)$
$0+1 = 01 (在十進(jìn)制中,這表示0+1=1)$
$1+0 = 01 (在十進(jìn)制中,這表示1+0=1)$
$1+1 = 10 (在十進(jìn)制中,這表示1+1=2)$
這叫做半加法器。如果我們的計(jì)算機(jī)可以實(shí)現(xiàn)這一點(diǎn),并且可以將許多半加法器連接在一起,它將可以計(jì)算任何加法。
4.3 使用Qiskit做加法
讓我們使用Qiskit制作我們自己的半加法器。這將包括一部分電路對(duì)輸入進(jìn)行編碼,一部分電路執(zhí)行算法,以及一部分電路提取結(jié)果。當(dāng)我們想要使用新的輸入時(shí),第一部分將需要更改,但其余部分將始終保持不變。

我們要加的兩個(gè)比特被編碼在量子比特0和1中。上面的例子在這兩個(gè)量子比特中都編碼了1,因此它試圖找到1+1的解。結(jié)果將是一個(gè)包含兩個(gè)比特的字符串,我們將從量子比特2和3中讀出,并分別存儲(chǔ)在經(jīng)典比特0和1中。剩下的就是填寫實(shí)際的程序,它位于中間的空白區(qū)域。
圖中的虛線只是用來區(qū)分電路的不同部分(盡管它們也可以有更有趣的用途)。它們是通過使用barrier
指令生成的。
計(jì)算機(jī)的基本組成部分被稱為邏輯門。我們已經(jīng)使用了NOT門,但這還不足以實(shí)現(xiàn)我們的半加法器。我們只能用它來手動(dòng)寫出答案。由于我們希望計(jì)算機(jī)為我們做實(shí)際的計(jì)算,所以我們還需要一些更強(qiáng)大的門。
為了了解我們需要什么,讓我們?cè)倏纯窗爰悠餍枰鍪裁础?/p>
$0+0 = 00$
$0+1 = 01$
$1+0 = 01$
$1+1 = 10$
這四個(gè)答案中最右邊的位完全取決于相加的兩個(gè)位是相同的還是不的。所以對(duì)于0+0和1+1,相加的兩位是相同的,結(jié)果最右邊的位是0。對(duì)于0+1和1+0,相加的兩位不相同,最右邊的位是1。
為了使我們的解決方案的這一部分正確,我們需要一個(gè)能夠判斷兩個(gè)位是否相同的東西。傳統(tǒng)上,在數(shù)字計(jì)算的研究中,這被稱為異或(XOR)門。

在量子計(jì)算機(jī)中,異或門的工作是由受控非(controlled-NOT)門完成的。因?yàn)檫@個(gè)名字很長(zhǎng),我們通常就叫它CNOT。在Qiskit中,它的名字是cx
,甚至更短。在電路圖中,它如下圖所示。

這適用于一對(duì)量子比特。其中一個(gè)充當(dāng)控制量子比特(帶有小點(diǎn)的那個(gè))。另一個(gè)充當(dāng)目標(biāo)量子比特(帶有內(nèi)部有一個(gè)+的大圓圈的那個(gè))。
有多種方法可以解釋CNOT的效果。一種是看它的兩個(gè)輸入比特是否相同或不同。接下來,它用答案覆蓋目標(biāo)量子比特。如果它們相等,則目標(biāo)值為0;如果它們不相等,則目標(biāo)值為1。

另一種解釋CNOT的方法是,如果控制量子比特為1,則在目標(biāo)量子比特上執(zhí)行NOT操作,否則不執(zhí)行任何操作。這個(gè)解釋和前面的解釋一樣有效(事實(shí)上,正是這個(gè)解釋賦予了這個(gè)門的名字)。
通過嘗試每個(gè)可能的輸入來嘗試CNOT。例如,這是一個(gè)用輸入01測(cè)試CNOT的電路。

如果你執(zhí)行這個(gè)電路,會(huì)發(fā)現(xiàn)輸出是11。我們可以認(rèn)為這種情況的發(fā)生是因?yàn)橐韵略蛑弧?br>
CNOT計(jì)算輸入值是否不同并發(fā)現(xiàn)它們是不同的,這意味著它想輸出1。它通過重寫量子比特1(記住,它在比特串的左邊)的狀態(tài)來實(shí)現(xiàn)這一點(diǎn),將01變?yōu)?1。
CNOT看到量子比特0處于狀態(tài)1,因此對(duì)量子比特1應(yīng)用一個(gè)NOT。這將量子比特1的0翻轉(zhuǎn)為1,因此01變?yōu)?1。
下面的表格顯示了CNOT門所有可能的輸入和相應(yīng)的輸出:

對(duì)于我們的半加法器,我們不想覆蓋我們的一個(gè)輸入。相反,我們想把結(jié)果寫在另一對(duì)量子比特上。為此,我們可以使用兩個(gè)CNOT。

現(xiàn)在我們已經(jīng)完成了一個(gè)完全可以工作的半加法器的一半。我們只剩下另一個(gè)輸出比特未完成:將存在于量子比特3上的那位。
如果你再看一下這四種可能的和,你會(huì)注意到只有一種情況是1而不是0:1+1=10。只有當(dāng)加的兩位都是1時(shí)才會(huì)發(fā)生。
為了計(jì)算這部分輸出,我們可以讓計(jì)算機(jī)看看兩個(gè)輸入是否都是1。如果它們是——而且僅當(dāng)它們是——我們需要在量子位3上做一個(gè)NOT門。這將僅在這種情況下將其翻轉(zhuǎn)為所需的值1,為我們提供所需的輸出。
為此,我們需要一個(gè)新的門:類似于CNOT,但由兩個(gè)量子比特控制而不是一個(gè)。僅當(dāng)兩個(gè)控制項(xiàng)都處于狀態(tài)1時(shí),這將對(duì)目標(biāo)量子比特執(zhí)行NOT。這個(gè)新的門叫做Toffoli。對(duì)于那些熟悉布爾邏輯門的人來說,它基本上是一個(gè)與(AND)門。
在Qiskit中,Toffoli用ccx
指令表示。

在這個(gè)例子中,我們計(jì)算的是1+1,因?yàn)閮蓚€(gè)輸入位都是1。讓我們看看會(huì)得到什么。
/home/divs/.local/lib/python3.8/site-packages/qiskit/utils/deprecation.py:62: DeprecationWarning: Using a qobj for run() is deprecated as of qiskit-aer 0.9.0 and will be removed no sooner than 3 months from that release date. Transpiled circuits should now be passed directly using `backend.run(circuits, **run_options).
return func(*args, **kwargs)

結(jié)果是10,這是數(shù)字2的二進(jìn)制表示。我們已經(jīng)建造了一臺(tái)計(jì)算機(jī),可以解決著名的數(shù)學(xué)問題1+1!
現(xiàn)在你可以嘗試使用其他三種可能的輸入,并證明我們的算法對(duì)它們也能給出正確的結(jié)果。
半加法器包含了加法所需的一切。使用NOT、CNOT和Toffoli門,我們可以創(chuàng)建任意大小的數(shù)字集的加法程序。
這三個(gè)門足以完成計(jì)算中的所有其他工作。事實(shí)上,我們甚至可以不使用CNOT。此外,只有在創(chuàng)建值為1的比特時(shí)才真正需要非門。Toffoli門本質(zhì)上是數(shù)學(xué)的原子。它是最簡(jiǎn)單的元素,所有其他解決問題的技術(shù)都可以由它編譯而來。
正如我們將看到的,在量子計(jì)算中,我們分裂了原子。
/home/divs/.local/lib/python3.8/site-packages/qiskit/aqua/init.py:86: DeprecationWarning: The package qiskit.aqua is deprecated. It was moved/refactored to qiskit-terra For more information see?https://github.com/Qiskit/qiskit-aqua/blob/main/README.md#migration-guide
warn_package(‘a(chǎn)qua’, ‘qiskit-terra’)


關(guān)于Hacker Dōjō?
由Hacker共建的加密、Web3前沿技術(shù)開源知識(shí)社區(qū)。Dōjō 會(huì)以直播/音頻/文字等形式定期組織分享session, 分享主題主要覆蓋L1和L2的共識(shí)算法,架構(gòu),GitHub repo相關(guān)內(nèi)容,包括不限于以下話題:Scroll / Polygon zkEVM、 Eigen的混合證明系統(tǒng)、Starkware、azTec、 Optimism、Zecrey、Aptos、 Move、密碼學(xué)(零知識(shí)證明、公鑰加密、哈希函數(shù)、格密碼) 、 分布式系統(tǒng)、 以太坊協(xié)議棧、 量子計(jì)算和量子信息、衛(wèi)星通信系統(tǒng)和航天器系統(tǒng)設(shè)計(jì)等。
?Bounty詳情及認(rèn)領(lǐng)進(jìn)度詳情:https://innovative-laser af4.notion.site/174922df15884848b6ac8b57cb4f2fae?v=612e13dc6b9d44dd8197f755abb9fe9c
?加入 Dōjō 中文社區(qū)微信聯(lián)系:@HackerDojo0
有關(guān)DoraHacks
DoraHacks 是一個(gè)全球范圍內(nèi)的極客運(yùn)動(dòng),全球黑客馬拉松組織者,也是全球最活躍的多鏈 Web3 開發(fā)者平臺(tái)之一。DoraHacks.io平臺(tái)使得世界各地的Hacker和開源開發(fā)者可以參與黑客馬拉松、Bounty、Grant、Grant DAO,以及公共物品質(zhì)押等加密原生協(xié)議和基礎(chǔ)設(shè)施進(jìn)行協(xié)作并獲得資助。到目前為止,DoraHacks 社區(qū)的 4000 多個(gè)項(xiàng)目已經(jīng)獲得了來自全球行業(yè)支持者超過 3000 萬美元的資助。大量開源社區(qū)、DAO 和 超過50個(gè)主要區(qū)塊鏈生態(tài)系統(tǒng)正在積極使用 Dora 的基礎(chǔ)設(shè)(DoraHacks.io)進(jìn)行開源融資和社區(qū)治理。
官網(wǎng):https://dorahacks.io/