量子計算機編程(一)——QPU編程
量子計算機編程(二)——QPU基礎函數
量子計算機編程(三)——量子應用html
量子編程一層層搭建,最後是應用層git
都到應用了,確定會涉及數據,本節內容主要包括,量子數據、量子搜索、量子超級採樣、Shor算法、量子機器學習。github
和數據有關的討論通常圍繞在兩個方面,存儲和表示。算法
本書沒有討論QRAM如何製造,只是提了用法。
編程
和普通的QRAM有一個重要區別,地址也能夠是疊加態。框架
小數:咱們能夠借鑑經典的手法,就像經典裏面如何表達浮點數的同樣,咱們也這樣來表述量子的小數,\(Q_{n.m}\)n位的數據,其中m位是小數,(n-m)位是整數。機器學習
向量: [0,1,2,3]這個向量要怎麼表示?函數
最基礎的:
很容易理解,可是也很浪費空間,沒有用到量子自身的特性。學習
amplitude encoding for vectors:
優化
這個就利用了量子的性質,不過他也有本身的侷限性:
矩陣:
總體思路是用opertate來表示矩陣:
不過這裏有兩個限制:operator只能unitary的,矩陣不只不必定是unitary,都不必定是hermitian的。解決方案以下:
不是hermitian的矩陣,能夠構建成hermitian,經過 \(H=\left[\begin{array}{ll}0 & X \\ X^{\dagger} & 0\end{array}\right]\)
Phase Logic ,咱們不只能夠改變他們的0或者1,還能夠經過01來改變量子態的相位,就像這樣:
相位邏輯和其餘邏輯最大的區別就是他把操做結果隱藏到了unreadable的相位裏,經過改變疊加態裏的相位,咱們能夠在一組寄存器裏標記不少的態,而且還能經過AA之類的方法提取出來。
輸入值仍是那些量子態,輸出值則被編碼到了相對相位裏。
那麼這些是怎麼完成的呢?簡單的相位邏輯的組件:
因此這個有什麼用?
圍觀一個小公主找國王爸爸要禮物的例子:
小公主想要一隻小貓咪,爸爸就給了他兩個盒子,盒子A說:至少有一個盒子有貓咪,盒子B說:另外一隻盒子有老虎。
爸爸又說,這兩個盒子要麼同時爲真,要麼同時爲假。
因而咱們的小公主殿下搞出了這麼一個數字邏輯:
這樣,跑把四種可能性都跑一遍,輸出爲1就知足了邏輯。
可是爸比就是很喜歡爲難他的小可愛,他給公主提出一個要求,這個裝置只能跑一次。
因而小公主就搞了一個量子版本:
首先,用量子的把實驗跑一遍,相對相位上把答案翻轉,而後作實驗的逆操做(全部的量子操做都是可逆的),如今答案就寫在\(|00\rangle,|01\rangle|10\rangle|11\rangle\)的相對相位裏,再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各來一張圖就好。
因數分解究竟在作什麼,你們能夠看一眼這個 因數分解算法、週期查找算法(簡化)
默認你們看完有了大概瞭解,如今來看一個具體例子:因數分解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製備 \(a^x mod(N)\) 的疊加態,Steps 5–6 量子傅里葉找到週期 Steps 7–8 拿到週期後計算因數
前面兩個步驟結束後就是紅色箭頭這裏,如今量子態的狀態以下:
這一步是用來計算\(2^x\),任何的二進制寄存器均可經過簡單的移位實現2的乘積(或者其實是2的任何冪)。在咱們的例子中,每一個量子位都與下一個最高加權位置交換。須要注意的是咱們將只使用精度寄存器的兩個最低權重的量子位來表示x的值(這意味着x能夠取值0、一、二、3),線路爲圖上iter0
線路爲圖上iter1,目前咱們已經獲得了\(a^x\),對於咱們考慮過的特定示例,咱們的電路設法自動處理模數。
乘2和乘4後量子態的狀態以下:
測量,咱們測量的結果多是0、四、八、12中的任意一個,他們是等機率25%
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
在這裏咱們將要介紹三種QML應用:線性方程組的求解,量子主成分分析和量子支持向量機。
線性方程很容易變成矩陣乘法的形式\(\overrightarrow{\mathbf{A}} \vec{x}=\vec{b}\) ,求解線性方程也就是\(\vec{x}=\mathbf{A}^{-1} \vec{b}\)
而HHL提供了一種比共軛梯度降低法更快地方式來找矩陣的逆。
Scratch register 也就是輔助比特包含由HHL中的各類基元使用的許多臨時量子位,全部臨時量子位均以「 0」狀態準備。由於HHL處理定點(或浮點)數據而且涉及非平凡的算術運算(例如取平方根),因此咱們須要大量的臨時qubit。即便最簡單的狀況,這也使得HHL難以仿真。
固然若是咱們獲得了疊加態\(|x\rangle\),也不是裏面每個數據都能讀出來,可是在有的狀況下,咱們並不須要裏面的每個值,好比:
這個算法的時間複雜度是\(O\left(x^{2} s^{2} \epsilon^{-1} \log n\right)\)
HHL算法適合於求解由稀疏,條件良好的矩陣表示的線性方程組。
那具體HHL又是怎麼作的呢是怎麼作到的?
HHL的靈感來自特徵值分解來得到矩陣逆的信息,一個栗子:
\[A=\left|\begin{array}{ll} 2 & 2 \\ 2 & 3 \end{array}\right|, \quad \vec{z}=\left|\begin{array}{l} 1 \\ 0 \end{array}\right|\]
A的特徵向量爲\(v_1 = [−0.7882,0.615]\) and \(v_2 = [−0.615, −0.788]\),對應的特徵值爲 λ1 = 0.438 and λ2 = 4.56, 那麼,在特徵基的表示下,咱們能夠把z改寫成 [−0.788, −0.615],由於\(\vec{z}=-0.788 \vec{v}_{1}-0.615 \vec{v}_{2}\)
而A能夠改寫成:\(\Lambda=\left[\begin{array}{cc}0.438 & 0 \\ 0 & 4.56\end{array}\right]\)
如今求逆就很容易了,\(\mathbf{A}^{-1}=\left[\begin{array}{cc}\frac{1}{0.438} & 0 \\ 0 & \frac{1}{4.56}\end{array}\right]=\left[\begin{array}{cc}2.281 & 0 \\ 0 & 0.219\end{array}\right]\)
那麼,\(\vec{x}=\left[\begin{array}{ccc}\frac{1}{\lambda_{1}} & - & 0 \\ \vdots & \ddots & \vdots \\ 0 & - & \frac{1}{\lambda_{n}}\end{array}\right]\left[\begin{array}{c}\dot{b}_{1} \\ \vdots \\ \tilde{b}_{n}\end{array}\right]=\left[\begin{array}{c}\frac{1}{\lambda_{1}} \dot{b}_{1} \\ \vdots \\ \frac{1}{\lambda_{n}} \dot{b}_{n}\end{array}\right]\)
在量子以前,先了解一下什麼是PAC,PCA一般用做預處理步驟,能夠將一組輸入的特徵轉換爲新的、不相關的集合。 PCA產生的不相關功能能夠根據它們編碼的數據差別量進行排序。經過僅保留其中一些新功能,PCA一般被用做降維技術,僅保留前幾個主要成分,能夠在儘量保留差別的狀況下減小所需處理的數據量。
一個簡單例子:
咱們通常經過找到該協方差矩陣\(\sigma=\frac{1}{n-1} \mathbf{X}^{T} \mathbf{X}\)的特徵分解來給出主成分,特徵向量對應於主成分方向,而每一個關聯的特徵值均與沿該主成分的數據方差成比例。
其中PCA中計算上最複雜的步驟是執行協方差矩陣的特徵分解。
既然又是特徵分解,那麼咱們可能以爲如下行爲是有幫助的:
可是這一樣也有問題:
Quantum simulation with σ
協方差矩陣不多能知足量子模擬技術的稀疏性要求,所以咱們須要一種不一樣的方法來找到σ的QPU運算表示。
Input for phase estimation
相位估計有兩個輸入寄存器,咱們必須使用其中之一來指定要爲其關聯本徵相位(並由此得到本徵值)的本徵態。可是知道σ的任何特徵向量正是咱們要使用QPCA解決的問題的一部分。(HHL中能夠解決是由於咱們有\(|b\rangle\))
解決方案:
支持向量機的主要目的是找到一個超平面,把左右兩類數據給隔開,而且儘量的,讓這個平面離兩邊數據都遠遠的。
經過對偶問題轉換,咱們能夠把SVM問題變成最小二乘優化問題。
變成這個問題後,咱們的問題就又一次變成如何把這個現有的問題塞到HHL的接替框架裏面。