量子編程


量子計算機編程(一)——QPU編程

 

今天要給大家介紹的是這本書《Programming Quantum Computers —— Essential Algorithms and Code Samples》,主要講如何在量子計算機上編程,又示例的代碼可以跑 https://oreilly-qc.github.io./ ,這本書的理解方向是純粹計算機的,連矩陣都很少涉及,一個量子計算機就像是協處理器一樣,很像我們現在的GPU。

這本書一共分為三個部分,我也將分成三篇文章來寫。

單量子比特

這本書中對於量子的表達方式如下circle notation:

藍色圈的面積就是這個量子態測量后是這個狀態的概率,中間的藍色短線代表他們的相位,因為全局相位也觀察不出來,所以一般|0|0⟩就是朝上的。對於一個量子比特來說,重要的也就這兩個,magnitude和relative phase(可能因為重要的是概率大小,所以他其實沒有提amplitude其實是一個復數)。

這兩個態實際上是等價的。

電路圖呢,一般長這樣

這個電路圖對應的代碼如下:(這個例子都可以在上面那個網站上跑起來)

qc.reset(1); // allocate one qubit qc.write(0); // write the value zero qc.had(); // place it into superposition of 0 and 1 var result = qc.read(); // read the result as a digital bit 

第一步就是申請一個qubit,就像你要給變量分配空間一樣。

第二步寫0,其實寫0很容易,你可以直接測量,要么0,要么1,如果結果是1的話,再做一個not操作就好;當然,你要是嫌麻煩,對於一個qubit,長時間的靜置他,他也會變成0,畢竟還是基態比較穩定。

第三步就是進行一個H門的操作

第四步讀,其實就是測量了

常見的作用於單量子比特操作的表達方式:

其中值得一提的是PHASE相位操作,phase操作只作用在 |1|1⟩ 上,因為他的效果是改變相對相位,如果大家都改變就沒有什么用了。可能有同學聽說過繞X軸旋轉和繞Y軸旋轉,這些都是針對Bloch球的表達方式,與這里的circle notation的方式不要弄混了。

一個操作也可能是其他幾個操作的組合,比如:

如果我們可以把not變成H+180°旋轉+H,那么我們也可以把中間的180°旋轉變成兩個90°的旋轉,中間再加上兩個H,因為HH=IHH=I,他們可以相互抵消,這樣我們還可以得到RNOT:

COPY:這是一個需要注意的操作,因為量子程序里沒有復制,這也保障了量子傳輸的信息不會被竊聽, 因為你要竊聽,你就需要去讀,一讀就是測量,而量子比特一測量就是坍縮。由於量子不能復制,所以,上述所有操作都是在原有的那個比特上操作的,所以操作就會被發現。

一個簡單例子:

對於這里例子來說, A1A1 和 A2A2 是對qubit Hadmard門操作后測量得到的隨機值,因為這個是真隨機,所以就不會被竊聽者提前知道或者預估,那么當我傳輸這個被我用紅色圈出來的比特的時候,spy並不知道這個比特是否執行了H門和not操作,那他就只能猜了,25%的概率,圖里面所示就是他猜有執行了,然后他再按照他的猜測如法炮制一個qubit繼續傳遞,當B收了這個bit后,B也隨機一個數據B2B2,看是否執行H門,然后測量。這個時候消息也都收到了,測量也都測量好了,那么把 A2A2的信息發過來也和竊聽沒有關系了,如果 B2B2 A2A2 的結果一樣,那么測量結果應該一樣,如果不一樣,那么一定被竊聽了。

這樣的成功概率有多少呢? B2B2 A2A2 一樣的概率0.5,在這種情況下spy被發現的概率0.25。看起來不是很高,但是如果我們有一百個比特先檢測一下這條線路,不被發現的概率將會降到百萬分之一。

現在來看一下代碼:https://oreilly-qc.github.io/?p=2-4

qc.reset(3);//申請三個qubit
qc.discard();
var a = qint.new(1, 'alice'); //給其中一個變量命名為a,但是畫出來的電路圖中顯示alice
var fiber = qint.new(1, 'fiber');
var b = qint.new(1, 'bob');

function random_bit(q) {//對一個初始化為0的比特,進行H操作,然后測量,測量結果是隨機的
    q.write(0);
    q.had();
    return q.read();
}

// Generate two random bits
qc.label('get two random bits');
var send_had = random_bit(a);//得到是否執行H門的隨機值
var send_value = random_bit(a);//得到是否not的隨機值
qc.label('');

// Prepare Alice's qubit
a.write(0);//a重新賦值為0,所以前面取隨機值的操作也可以在a上進行
qc.label('set value');
qc.nop();
if (send_value)
    a.not();
qc.nop();
qc.label('');
qc.nop();
qc.label('apply had');
qc.nop();
if (send_had)
    a.had();
qc.nop();
qc.label('');

// Send the qubit!
fiber.exchange(a);

// Activate the spy
var spy_is_present = true;
if (spy_is_present)
{
    var spy_had = 1;
    qc.nop();
    qc.label('spy');
    if (spy_had)
        fiber.had();
    stolen_data = fiber.read();
    fiber.write(0);
    if (stolen_data)
        fiber.not();
    if (spy_had)
        fiber.had();
    qc.label('');
    qc.nop();
}

// Receive the qubit!
var recv_had = random_bit(b);
fiber.exchange(b);
qc.label('apply had');
qc.nop();
if (recv_had)
    b.had();
qc.nop();
qc.label('');
qc.nop();
qc.label('read value');
qc.nop();
recv_val = b.read();
qc.nop();
qc.label('');
qc.nop();

// Now Alice emails Bob to tell
// him her had setting and value.
// If the had setting matches and the
// value does not, there's a spy!
if (send_had == recv_had)
    if (send_value != recv_val)
        qc.print('Caught a spy!\n');

多量子比特

多量子比特的表示方法和單量子比特沒有什么區別,下面的數字就是把他們從01的二進制換算成了我們熟悉的十進制。0x是十六進制的表示方法,最上面的是地位,正好可以not操作表示了出來,0就是000,1就是001,2就是010……以此類推

真要說和單量子比特的區別,那主要是兩方面,一個是糾纏;另一個就是受控操作。

糾纏

糾纏好說,兩個糾纏的量子比特就是其中一個的測量結果會影響另一個。

具體可以看一下這篇量子糾纏1——量子比特、Bell態、EPR佯謬

受控操作

受控操作就是說有兩類比特,一個是用來控制的,另一個是被控制的。

比如大家耳熟能詳的CNOT,當控制比特是1的時候,就翻轉被控制的比特,如果控制比特是0的時候,那就不做操作。還有CCNOT門,又叫做toffli門,有兩個控制比特,只有當他們都為1的時候才翻轉。

現在要介紹一個前面沒有提過的CPHASE受控相位門,和CNOT相似,同樣是當控制比特為1的時候才進行,但是正如前面我們提過,PHASE操作只操作在1上,也就是說,如果這個操作被執行其實只有一種情況,那就是|11|11⟩ 。

在前面我們表示過一個旋轉180°的相位操作可以表示成一個 H+NOT+H figure 2-14

那么現在受控相位操作擁有了三種表示方法:

當控制比特為0的時候,CNOT就不會發生,兩個H又正好抵消了。

phase kickback

在這之所以說這么多的受控相位操作是因為這里面有個一很有趣的小技巧 QPU Trick: Phase Kickback 來看下面這個電路圖

這個電路圖很容易理解,一種理解方式就是把register 1當作控制比特,register 2 當作受控比特,兩個H門使得register 1變成了等可能的四種情況 12|00+12|01+12|10+12|1112|00⟩+12|01⟩+12|10⟩+12|11⟩ 。

現在來看看結果:

因為register 2並不是疊加態,所以沒有相對相位,而絕對相位又測不出來,所以他可以說是沒有變的,改變了的,反而是register 1 , |3|3⟩ 轉了135°是因為兩個都為1,45°和90°都轉了。作為一個受控操作,控制比特反而變了,而受控比特沒有改變。

swap

受控操作當然也能連在一起,得到一些有用的結果,比如三個CNOT操作,他就可以交換兩條線路。

這個的證明是一件很容易的事情,你可以取一個任意態推一邊,專門把這個提出來說一遍是因為這個還能做一件有趣的事情,那就是驗證兩個比特是否相等。我們需要用到的是CSWAP,即當控制比特為1時才交換。

當我們的output比特經過H門后,他就變成了等概率的 |0|0⟩ 和 |1|1⟩ 經過一個CSWAP,為1情況下的input1和input2就會交換,也就是說他們原來x概率的ab就變成了x概率的ba了,這樣的問題出在哪?

如果概率還是原來的分布,那么在經過一個H門output等待率的 |0|0⟩ 和 |1|1⟩ 又會化簡成 |0|0⟩ ,各種各樣的 |1|1⟩ 的概率會相互抵消掉,那么在經歷一個NOT操作就一定會得到1。

那,如果這兩個數據不一樣,就一定得不到1嗎?不一定,只是他有概率不是1,而一旦有概率不是1,那只要多檢測幾次就一定能檢測出來,就像上面那個竊聽一樣,明明只有四分之一的概率,但僅需要一百次,測不出來的可能性就降到了百萬分之一。

當然,代碼在這里https://oreilly-qc.github.io/?p=3-4,這也是這本書的特色了。

受控操作當然不止這些,但是很多受控操作都可以分解成CNOT加上一些相位操作,我們可以自己構造自己需要的操作。

遠距離操控隨機

這里的遠距離操控不是指我能扣確定他是什么,如果我能確定,那就不是隨機了,而是說,我把兩個比特弄成糾纏,當我一個測出來是0的時候,另一個以x%的概率得到0,至於我測出來是不是0看天意,對面測出來是不是0,也看天意,其中唯一能確定的,就只有這個x了。

這個例子是書上例子3-6 https://oreilly-qc.github.io/?p=3-6 方法很簡單,就是我H門操作后,我旋轉45°的角度,這樣再來一個H門,因為相位變了,符號對不上,所以回不去了,就有了關聯。

更強大的一點的應用是——量子隱形傳態,量子隱形傳態 Quantum Teleportation 提過了,就不在累述。

 

 

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

 

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

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

第一步,將量子態通過H門變成疊加態,很多應用的第一步都是H門,因為量子的疊加態正是她的優越性所在,所謂n個qubit可以表達 2n2n 種狀態, 2n2n 種可能性同時並行,這是疊加態帶來的好處,要是一直使用基態,經典的不香嗎?還便宜,量子的還需要在靠近絕對零度的溫度下進行。

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

第三步,相位操作,疊加態中運算的結果當然也是疊加態的,但我們要獲取,只能獲取經典的信息,直接讀的話,那他就是隨機坍縮,信息丟失,當然你要是打算重復多次也行,但是有的時候,我們想要的並不是這個態的全部信息,我們可能需要的僅僅是他的一些特征,可能是一個序列的周期,我並不需要這個序列具體是什么,如此的話,可能一些相位變化操作就可以直接讀取你想要的信息,這樣更為方便。所以量子算法的設計,不僅僅要考慮量子怎么加速,還要考慮量子加速完了的結果能不能讀出來。

第四步,讀取。

量子算數邏輯

在量子之前,我們有經典算數和經典的數字邏輯,那么量子和經典有什么區別呢:

  • 沒有copy ,量子的信息不能復制,如果我們要把一個信息傳給另一個,我們只能swap交換一下,或者我們還可以teleportation,總之,我們只能交換,不能賦值,具體一點來說,以前我們寫程序的里面的賦值“=”是沒有的。
  • 可逆,除了測量,QPU上的所有操作都是可逆的。

    說到邏輯,我們已經還記得數字邏輯里面學的全加器吧,c=a+b之類的操作,這個簡單的加法后面是一堆的與或非門的結構,量子的也同樣如此,結構也都差不多,不同之處就兩點: |a|b|a⟩|b⟩ 的進去 |a+b|b|a+b⟩|b⟩ 的出來,因為量子要求可逆,他不會把a、b變成c,一旦合成了c,那就分不出a、b了,當然,你也可以 |a|b|0|a⟩|b⟩|0⟩ 的進去 |a|b|a+b|a⟩|b⟩|a+b⟩,這樣也是可以的;第二點就是疊加,這里的a、b不再是某個具體的數,而是一個疊加態。

如果是負數,那怎么表達呢?

和經典一樣,我們可以負數的話,首位變成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,來驗證一下剛剛的猜測,其實看圖也能發現,B4B4的概率是小於B3B3的,why,事實上,這個概率大小是一個類似三角函數的存在:

那么如何找到自己最合適的迭代次數呢?

書上給了一個未經過證明的公式Optimal number of iterations in amplitude amplification

 

NAA=π2n−−√4NAA=⌊π2n4⌋

 

這本書是一本是實踐為主的書籍,他還考慮了另一個問題,如果在這個里面我不僅僅要翻轉一個態,我要翻轉的是兩個、三個又會怎么樣呢?

https://oreilly-qc.github.io/?p=6-3 同樣給大家一個連接,大家可以改變n2f這個數組的大小,和每次的迭代次數,看一看結果會有什么變化,當然這么做有些麻煩,也可以看下面的圖,分別是4個qubit的情況下翻轉2、3、7、8個態的效果長什么樣,這里我就直接公布答案,隨着翻轉的態越來越大,這我們的這個三角函數的周期會越來越小。

那么現在的最佳迭代次數又是多少呢?m是翻轉的個數。

 

NAA=π42nm−−−√NAA=⌊π42nm⌋

 

這里,我們再總結一下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,以及操作的特征態u1,u2,u3,...u1,u2,u3,...,量子相位估計可以測出這些特征態所對應的特征相位。

一個簡單例子,cont_u是我們輸入的操作,紅框里,是這個操作的特征態,輸出結果是8,這里有4個qubit,最大的輸出結果可以是16,那么他對應的量子相位是:(8/16)*360°=180°,qubit的增加可以增加數據的精度,如果我們有最大誤差要求,那么可以通過下面這個公式知道我們最小需要多少個量子比特:

 

m=p+log(2+1ϵ)m=p+⌈log⁡(2+1ϵ)⌉

 

調用這個函數非常簡單:qin是特征向量,cout_u是操作,qout就是我們的結果,她的位數取決於我們需要的精度。

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

那么這個里面的操作又是長什么樣子呢?

雖然看起來是上面在控制下面,但是仔細想一想 |0|1−|0⟩|1⟩你能分清楚這個負號是0還是1的嗎?,相位信息就這樣在qout里累加,最后一個逆傅里葉變換得到我們的結果。

 

 

 

量子計算機編程(三)——量子應用

量子編程一層層搭建,最后是應用層

都到應用了,肯定會涉及數據,本節內容主要包括,量子數據、量子搜索、量子超級采樣、Shor算法、量子機器學習。

真實數據

和數據有關的討論一般圍繞在兩個方面,存儲和表示。

QRAM

本書沒有討論QRAM如何制造,只是提了用法。

和普通的QRAM有一個重要區別,地址也可以是疊加態。

表示

小數:我們可以借鑒經典的手法,就像經典里面如何表達浮點數的一樣,我們也這樣來表述量子的小數,Qn.mQn.mn位的數據,其中m位是小數,(n-m)位是整數。

向量: [0,1,2,3]這個向量要怎么表示?

最基礎的:

很容易理解,但是也很浪費空間,沒有用到量子自身的特性。

amplitude encoding for vectors:

這個就利用了量子的性質,不過他也有自己的局限性:

  • 量子疊加態基本就是 unREADable 的
  • 因為概率需要歸一化,所以他能表示的態也需要歸一化

矩陣:

整體思路是用opertate來表示矩陣:

不過這里有兩個限制:operator只能unitary的,矩陣不僅不一定是unitary,都不一定是hermitian的。解決方案如下:

不是hermitian的矩陣,可以構建成hermitian,通過 H=[0XX0]H=[0XX†0]

  1. Deconstruct H=H1+HnH=H1+…Hn 把H分解成更容易模擬的hermitian(也就是更容易執行第二步)
  2. Simulate components U=exp(iHt)U=exp⁡(−iHt) 操作只有unitary的操作,但是矩陣可以把他們聯系到一起
  3. Reconstruction 把得到的U乘起來,因為H是在指數上分解的,所以這里直接乘起來就可以

量子搜索Quantum Search (QS)

Phase Logic ,我們不僅可以改變他們的0或者1,還可以通過01來改變量子態的相位,就像這樣:

相位邏輯和其他邏輯最大的區別就是他把操作結果隱藏到了unreadable的相位里,通過改變疊加態里的相位,我們可以在一組寄存器里標記很多的態,並且還能通過AA之類的方法提取出來。

輸入值還是那些量子態,輸出值則被編碼到了相對相位里。

那么這些是怎么完成的呢?簡單的相位邏輯的組件:

所以這個有什么用?

圍觀一個小公主找國王爸爸要禮物的例子:

小公主想要一只小貓咪,爸爸就給了他兩個盒子,盒子A說:至少有一個盒子有貓咪,盒子B說:另一只盒子有老虎。

爸爸又說,這兩個盒子要么同時為真,要么同時為假。

於是我們的小公主殿下搞出了這么一個數字邏輯:


這樣,跑把四種可能性都跑一遍,輸出為1就滿足了邏輯。

但是爸比就是很喜歡為難他的小可愛,他給公主提出一個要求,這個裝置只能跑一次。

於是小公主就搞了一個量子版本:

首先,用量子的把實驗跑一遍,相對相位上把答案翻轉,然后做實驗的逆操作(所有的量子操作都是可逆的),現在答案就寫在|00,|01|10|11|00⟩,|01⟩|10⟩|11⟩的相對相位里,再grover把他們找到。

實驗在這里,https://oreilly-qc.github.io/?p=10-2

把答案翻轉后的狀態:

把答案 uncompute后:

Grover mirror 后:

量子超采樣

超采樣是什么?

簡單的說,這是抗鋸齒的一種方法,電腦顯示的圖片由像素組成,一條線如果不是完全水平或者豎直,那么表現出來就會有鋸齒,超采樣就是在像素內部的多個實例處(而不是像正常情況一樣在中心處)獲取顏色樣本,然后計算平均顏色值。通過以比顯示的圖像高得多的分辨率渲染圖像,然后使用多余的像素進行計算將其縮小到所需的大小,以此達到目的。

這項任務,我們執行並行處理(計算與場景交互的許多光線的結果),但最終僅需要結果的總和,而不是單個結果本身。(聽起來就可以量子加速)

那么量子處理器在這里能做些什么嗎?

不過首先,在應用QSS之前,我們要知道如何用量子寄存器來表示圖像。

這樣就擁有一張畫布,我們可以通過相位翻轉來改變他們的顏色,我們在上面施加的操作就是畫筆。

如果想要畫曲線怎么辦:https://oreilly-qc.github.io/?p=11-2 這是一個畫了曲線的例子。

現在我們來討論超級采樣,對於每個圖塊,我們要估計已被相位翻轉的子像素的數量。在黑白子像素(為我們表示為翻轉或非翻轉相位)的情況下,這使我們能夠為每個最終像素獲取一個代表其原始組成子像素強度的值。

此問題與前面“多個翻轉項”中的“量子和估計”問題完全相同。要使用量子和估計,我們僅將實現繪制指令的量子程序視為用於翻轉子程序的幅度放大量子程序。將其與第7章中的量子傅立葉變換相結合,可以近似估算每個圖塊中翻轉的子像素的總數。

不過這樣得到值不是確定的翻轉的數目,我們需要將這個值和look up table結合着來看。

如果還在考慮顏色問題,那就是RGB各來一張圖就好。

Shor算法

因數分解究竟在做什么,大家可以看一眼這個 因數分解算法、周期查找算法(簡化)

默認大家看完有了大概了解,現在來看一個具體例子:因數分解15=3*5

代碼是簡單的調用

var N = 15; // The number we're factoring var precision_bits = 4; // See the text for a description of this var coprime = 2; // For this QPU implementation, this must be 2 var result = Shor(N, precision_bits, coprime); 

整個過程一共有八步,•Steps 1–4制備 axmod(N)axmod(N) 的疊加態,Steps 5–6 量子傅里葉找到周期 Steps 7–8 拿到周期后計算因數

  • Step 1: Initialize QPU Registers
  • Step 2: Expand into Quantum Superposition

前面兩個步驟結束后就是紅色箭頭這里,現在量子態的狀態如下:

  • Step 3: Conditional Multiply-by-2

這一步是用來計算2x2x,任何的二進制寄存器都可通過簡單的移位實現2的乘積(或者實際上是2的任何冪)。在我們的例子中,每個量子位都與下一個最高加權位置交換。需要注意的是我們將只使用精度寄存器的兩個最低權重的量子位來表示x的值(這意味着x可以取值0、1、2、3),線路為圖上iter0

  • Step 4: Conditional Multipy-by-4

線路為圖上iter1,目前我們已經得到了axax,對於我們考慮過的特定示例,我們的電路設法自動處理模數。

乘2和乘4后量子態的狀態如下:

  • Step 5: Quantum Fourier Transform

  • Step 6: Read the Quantum Result

測量,我們測量的結果可能是0、4、8、12中的任意一個,他們是等概率25%

  • Step 7: Digital Logic
function ShorLogic(N, repeat_period, coprime) { // Given the repeat period, find the actual factors var ar2 = Math.pow(coprime, repeat_period / 2.0); var factor1 = gcd(N, ar2 - 1); var factor2 = gcd(N, ar2 + 1); return [factor1, factor2]; } 

把4丟到這里面去算,得到的結果是3,5

  • Step 8: Check the Result

量子機器學習

在這里我們將要介紹三種QML應用:線性方程組的求解,量子主成分分析和量子支持向量機。

HHL解線性方程

線性方程很容易變成矩陣乘法的形式Ax⃗ =b⃗ A→x→=b→ ,求解線性方程也就是x⃗ =A1b⃗ x→=A−1b→

而HHL提供了一種比共軛梯度下降法更快地方式來找矩陣的逆。

Scratch register 也就是輔助比特包含由HHL中的各種基元使用的許多臨時量子位,所有臨時量子位均以“ 0”狀態准備。因為HHL處理定點(或浮點)數據並且涉及非平凡的算術運算(例如取平方根),所以我們需要大量的臨時qubit。即使最簡單的情況,這也使得HHL難以仿真。

當然如果我們得到了疊加態|x|x⟩,也不是里面每一個數據都能讀出來,但是在有的情況下,我們並不需要里面的每一個值,比如:

  • 我們可能不需要|x|x⟩的每個分量的值,而是他們平均值或者和
  • 或者我們只想要比較一下看是否等於
  • 或者|x|x⟩只是程序下一部分的輸入

這個算法的時間復雜度是O(x2s2ϵ1logn)O(x2s2ϵ−1log⁡n)

HHL算法適合於求解由稀疏,條件良好的矩陣表示的線性方程組。

那具體HHL又是怎么做的呢是怎么做到的?

HHL的靈感來自特征值分解來獲得矩陣逆的信息,一個栗子:

 

A=∣∣∣2223∣∣∣,z⃗ =∣∣∣10∣∣∣A=|2223|,z→=|10|

 

A的特征向量為v1=[0.7882,0.615]v1=[−0.7882,0.615] and v2=[0.615,0.788]v2=[−0.615,−0.788],對應的特征值為 λ1 = 0.438 and λ2 = 4.56, 那么,在特征基的表示下,我們可以把z改寫成 [−0.788, −0.615],因為z⃗ =0.788v⃗ 10.615v⃗ 2z→=−0.788v→1−0.615v→2

而A可以改寫成:Λ=[0.438004.56]Λ=[0.438004.56]

現在求逆就很容易了,A1=[10.4380014.56]=[2.281000.219]A−1=[10.4380014.56]=[2.281000.219]

那么,x⃗ =⎡⎣⎢⎢⎢⎢1λ1001λn⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢b˙1b~n⎤⎦⎥⎥=⎡⎣⎢⎢⎢⎢1λ1b˙11λnb˙n⎤⎦⎥⎥⎥⎥x→=[1λ1−0⋮⋱⋮0−1λn][b˙1⋮b~n]=[1λ1b˙1⋮1λnb˙n]

  1. Quantum simulation, QRAM, and phase estimation
  2. Invert values
  3. Move inverted values into amplitudes
  4. Amplitude amplification
  5. Uncompute

量子主成分分析

在量子之前,先了解一下什么是PAC,PCA通常用作預處理步驟,可以將一組輸入的特征轉換為新的、不相關的集合。 PCA產生的不相關功能可以根據它們編碼的數據差異量進行排序。通過僅保留其中一些新功能,PCA通常被用作降維技術,僅保留前幾個主要成分,可以在盡可能保留差異的情況下減少所需處理的數據量。

一個簡單例子:

我們一般通過找到該協方差矩陣σ=1n1XTXσ=1n−1XTX的特征分解來給出主成分,特征向量對應於主成分方向,而每個關聯的特征值均與沿該主成分的數據方差成比例。

其中PCA中計算上最復雜的步驟是執行協方差矩陣的特征分解。

既然又是特征分解,那么我們可能覺得以下行為是有幫助的:

  • 將數據的協方差矩陣表示為QPU操作。
  • 對此QPU操作執行相位估計,以確定其特征值。

但是這同樣也有問題:

  • Quantum simulation with σ

    協方差矩陣很少能滿足量子模擬技術的稀疏性要求,因此我們需要一種不同的方法來找到σ的QPU運算表示。

  • Input for phase estimation

相位估計有兩個輸入寄存器,我們必須使用其中之一來指定要為其關聯本征相位(並由此獲得本征值)的本征態。但是知道σ的任何特征向量正是我們要使用QPCA解決的問題的一部分。(HHL中可以解決是因為我們有|b|b⟩)

解決方案:

  • 用mini-SWAP來改變矩陣的稀疏性,具體見 https://arxiv.org/abs/1307.0401
  • σ的密度算符表示正好是我們相位估計的輸入,如果這樣的話,輸出就正好是編碼了的特征值。

量子支持向量機

支持向量機的主要目的是找到一個超平面,把左右兩類數據給隔開,並且盡可能的,讓這個平面離兩邊數據都遠遠的。

通過對偶問題轉換,我們可以把SVM問題變成最小二乘優化問題。

變成這個問題后,我們的問題就又一次變成如何把這個現有的問題塞到HHL的接替框架里面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM