量子計算機編程(二)——QPU基礎函數

量子計算機編程(一)——QPU編程
量子計算機編程(二)——QPU基礎函數
量子計算機編程(三)——量子應用html

第二部分主要是QPU的基礎功能,第一部分就像是咱們有了哪些基本的語句,第二部分就是咱們能寫一些簡單基礎的函數,一些小模塊,第三部分就是他的應用了。git

先來看一下一個簡單量子應用的結構:
github

第一步,將量子態經過H門變成疊加態,不少應用的第一步都是H門,由於量子的疊加態正是她的優越性所在,所謂n個qubit能夠表達 \(2^n\) 種狀態, \(2^n\) 種可能性同時並行,這是疊加態帶來的好處,要是一直使用基態,經典的不香嗎?還便宜,量子的還須要在靠近絕對零度的溫度下進行。算法

第二步,在疊加態中運算。編程

第三步,相位操做,疊加態中運算的結果固然也是疊加態的,但咱們要獲取,只能獲取經典的信息,直接讀的話,那他就是隨機坍縮,信息丟失,固然你要是打算重複屢次也行,可是有的時候,咱們想要的並非這個態的所有信息,咱們可能須要的僅僅是他的一些特徵,多是一個序列的週期,我並不須要這個序列具體是什麼,如此的話,可能一些相位變化操做就能夠直接讀取你想要的信息,這樣更爲方便。因此量子算法的設計,不只僅要考慮量子怎麼加速,還要考慮量子加速完了的結果能不能讀出來。數組

第四步,讀取。函數

量子算數邏輯

在量子以前,咱們有經典算數和經典的數字邏輯,那麼量子和經典有什麼區別呢:編碼

  • 沒有copy ,量子的信息不能複製,若是咱們要把一個信息傳給另外一個,咱們只能swap交換一下,或者咱們還能夠teleportation,總之,咱們只能交換,不能賦值,具體一點來講,之前咱們寫程序的裏面的賦值「=」是沒有的。
  • 可逆,除了測量,QPU上的全部操做都是可逆的。

    說到邏輯,咱們已經還記得數字邏輯裏面學的全加器吧,c=a+b之類的操做,這個簡單的加法後面是一堆的與或非門的結構,量子的也一樣如此,結構也都差很少,不一樣之處就兩點: \(|a\rangle|b\rangle\) 的進去 \(|a+b\rangle|b\rangle\) 的出來,由於量子要求可逆,他不會把a、b變成c,一旦合成了c,那就分不出a、b了,固然,你也能夠 \(|a\rangle|b\rangle|0\rangle\) 的進去 \(|a\rangle|b\rangle|a+b\rangle\),這樣也是能夠的;第二點就是疊加,這裏的a、b再也不是某個具體的數,而是一個疊加態。

若是是負數,那怎麼表達呢?spa

和經典同樣,咱們能夠負數的話,首位變成1。就像 000-0 001-1 002-2 003-3 100-(-4) 101-(-3) 110-(-2) 111-(-1),很是熟悉的配方的了。設計

關於條件判斷呢,給你們看一個例子:

這是是若是a>3那麼b就自增,若是沒有,那就不用了,3不是很好的判斷標準,可是0是啊,小於他的負數,直接首位編碼就是1,因此,能夠先-3,判斷完了,增長好了,在把3加回來,辦法總比問題多。

以上是量子和經典較爲類似的部分,可是除此以外,量子還有新的特性,好比說:相位,接下來的篇幅都是屬於他的。

振幅放大 Amplitude Amplification

咱們先來講說振幅放大是什麼:


你以爲 Figure 6-1中的ABC三個qubit同樣嗎?不同,直接看圖很顯然的不同,雖然你們都是等機率的疊加態,可是他們相對相位180°的地方不同。但是直接讀,能讀出來嗎?即便我重複不少遍,可是他們的機率是同樣的,no difference。可是,看圖 Figure 6-3,就是可讀的不同了,振幅放大(AA)就是把他們從圖6-1變成圖6-3的方法。

如今咱們已經只要了what和why了,接下來就是怎麼進行how。

咱們先來看一個單獨的AA:

前面三步,也就是在4個H門以前是將這個疊加態中的某一個態給翻轉他的相位,使他於其餘態不一樣,接下來的幾個步驟是把這個態的機率放大,至於問什麼能放大,能夠來看這篇 量子搜索算法 Grover search 這篇文章裏主要是矩陣的角度,如今這個正好是一個具體的表現。

一次AA結束後,咱們又回到了最初的相位,除了,咱們翻轉相位的那個態的振幅變大了,若是咱們想要他繼續變大,那麼咱們就繼續AA,每個AA都要包括將相位翻轉的步驟。

你可能會疑惑,既然咱們都知道要翻轉哪個態了,那爲何要費這麼大的力氣,這裏,咱們的翻轉很是簡單,就是找到這個態,而後翻轉,上圖就是兩個not操做,可是在實際操做中,這多是是一系列計算的結果。

AA一次就放大一些,再AA就再放大,那麼是否是越多,就越能無線逼近1呢?

https://oreilly-qc.github.io/?p=6-2這是上面這個的實驗,你們能夠變換代碼裏面的 number_of_iterations,來驗證一下剛剛的猜想,其實看圖也能發現,\(B_4\)的機率是小於\(B_3\)的,why,事實上,這個機率大小是一個相似三角函數的存在:

那麼如何找到本身最合適的迭代次數呢?

書上給了一個未通過證實的公式Optimal number of iterations in amplitude amplification
\[ N_{A A}=\left\lfloor\frac{\pi \sqrt{2^{n}}}{4}\right\rfloor \]
這本書是一本是實踐爲主的書籍,他還考慮了另外一個問題,若是在這個裏面我不只僅要翻轉一個態,我要翻轉的是兩個、三個又會怎麼樣呢?

https://oreilly-qc.github.io/?p=6-3 一樣給你們一個鏈接,你們能夠改變n2f這個數組的大小,和每次的迭代次數,看一看結果會有什麼變化,固然這麼作有些麻煩,也能夠看下面的圖,分別是4個qubit的狀況下翻轉二、三、七、8個態的效果長什麼樣,這裏我就直接公佈答案,隨着翻轉的態愈來愈大,這咱們的這個三角函數的週期會愈來愈小。

那麼如今的最佳迭代次數又是多少呢?m是翻轉的個數。
\[ N_{A A}=\left\lfloor\frac{\pi}{4} \sqrt{\frac{2^{n}}{m}}\right\rfloor \]
這裏,咱們再總結一下AA的意義,他把不可讀的相位信息變成了可讀的振幅信息

量子傅里葉變換

提出一個技術,一定是爲了解決一個問題,這裏咱們要解決的問題就是週期:

對於ABC這三個態,振幅放大也並不能很好的將他們區分,可是量子傅里葉變換(QFT)能夠,他可以把上面這三個態變成下面這樣:

A裏面的有八個這樣的週期,B裏面有四個這樣的週期,而C裏面只有2個這樣的週期,經過他們週期個數的不同就能夠垂手可得的把這三個態分辨出來。

量子傅里葉變換是一個封裝好了的函數,直接調用.QFT就能夠了。

var num_qubits = 4;
qc.reset(num_qubits);
var signal = qint.new(num_qubits, 'signal')

// prepare the signal製備量子態C
qc.label('prep');
signal.write(0);
signal.hadamard();
signal.phase(45, 1);
signal.phase(90, 2);
signal.phase(180, 4);

// Run the QFT直接調用
qc.label('QFT');
signal.QFT()

爲何這樣就能夠找到她的週期了呢?量子傅里葉變換

不過,QFT不是每次都能像如今這樣得到這麼好的結果的,像經典的傅里葉變換會有mirror-image,以下:


量子傅里葉也可能會有這種結果,咱們一樣也是取前面的一半:

選擇量子傅里葉的好處在於,他很快,比快速傅里葉都還要快,他們的速度比值是這樣的:

量子處理器的內部結構長這個樣子:

量子相位估計

這個關注的對象是量子操做的信息而不是量子寄存器的信息,每個量子操做均可以用一個酉矩陣表示,而每個量子態也能夠用一個向量來表示,若是一個操做做用的量子態正好是他的特徵向量會怎麼樣?

每個操做都有本身的eigenstate和對應的eigenphase

因此相位估計到底是作什麼的呢?

假設我有一個操做U,以及操做的特徵態\(u_1,u_2,u_3,...\),量子相位估計能夠測出這些特徵態所對應的特徵相位。

一個簡單例子,cont_u是咱們輸入的操做,紅框裏,是這個操做的特徵態,輸出結果是8,這裏有4個qubit,最大的輸出結果能夠是16,那麼他對應的量子相位是:(8/16)*360°=180°,qubit的增長能夠增長數據的精度,若是咱們有最大偏差要求,那麼能夠經過下面這個公式知道咱們最小須要多少個量子比特:

\[m=p+\lceil \log \left(2+\frac{1}{\epsilon}\right)\rceil\]

調用這個函數很是簡單:qin是特徵向量,cout_u是操做,qout就是咱們的結果,她的位數取決於咱們須要的精度。

// Operate phase estimation primitive on registers phase_est(qin, qout, cont_u); 
// Read output register 
qout.read();

那麼這個裏面的操做又是長什麼樣子呢?

雖然看起來是上面在控制下面,可是仔細想想 \(-|0\rangle|1\rangle\)你能分清楚這個負號是0仍是1的嗎?,相位信息就這樣在qout裏累加,最後一個逆傅里葉變換獲得咱們的結果。

相關文章
相關標籤/搜索