【四】如何用量子計算機解線性方程組
來自專欄 Coraline19 人贊了文章
本專欄著力簡單介紹量子信息,量子糾錯的有關原理,
並使用IBM Q實現一些基礎的量子計算。
參考文獻:
- Quantum Information Meets Quantum Matter
Bei Zeng, Xie Chen, Duan-Lu Zhou,Xiao-Gang Wen,arXiv: 1508.02595v4.
- Quantum Computation and Quantum Information
Michael A.Nielsen, Isaac L. Chuang.
- Precise Creation, Characterization, and Manipulation of Single Optical Qubits
Nicholas Peters, Joseph Altepeter, Evan Jeffrey, David Branning, and Paul Kwiat.
- Quantum Algorithm Implementations for Beginners
Patrick J. Coles, Stephan Eidenbenz, Scott Pakin, Adetokunbo Adedoyin, John Ambrosiano, Petr Anisimov, William
Casper, Gopinath Chennupati, Carleton Coffrin, Hristo Djidjev, David Gunter, Satish Karra, Nathan Lemons, Shizeng
Lin, Andrey Lokhov, Alexander Malyzhenkov, David Mascarenas, Susan Mniszewski, Balu Nadiga, Dan
O』Malley, Diane Oyen, Lakshman Prasad, Randy Roberts, Phil Romero, Nandakishore Santhi, Nikolai
Sinitsyn, Pieter Swart, Marc Vuffray, Jim Wendelberger, Boram Yoon, Richard Zamora, and Wei Zhu
- Experimental quantum computing to solve systems of linear equations
X.-D. Cai1, C. Weedbrook2, Z.-E. Su1, M.-C. Chen1, Mile Gu3,4, M.-J. Zhu1, Li Li1, Nai-Le Liu1,Chao-Yang Lu1, Jian-Wei Pan
- Wikipedia Phase Estimation
在本篇文章中,我們將集中介紹一種基礎演算法以及其應用:
- 量子Fourier變換
- 相位估計技術
- 用量子計算機求解線性方程組
量子Fourier變換
量子Fourier變換類似於離散Fourier變換(DFT)。
Definition 4.1 離散Fourier變換
對於 點序列 ,它的離散傅里葉變換(DFT)為
離散傅里葉變換的逆變換(IDFT)為
在數字系統中,由於採樣必須是有限長並且離散的點,所以我們只能採用離散Fourier變換。
實際上,這件事情還更有趣,如果學過固體物理的同學,應該覺得離散Fourier變換的式子很眼熟,實際上離散Fourier變換這套操作我們在處理一維晶格的時候一直在用。它來源於我們所加Born-von Karman邊界條件,它將無窮長的晶鏈截斷成 個原胞的系統。每一種離散Fourier變換實際上對應了一種聲子的模式。
對於量子體系,我們實際上可以定義量子Fourier變換。
Definition 4.2 量子Fourier變換
對於 個正交基( )的量子系統,定義以下的量子操作
稱為量子Fourier變換。
實際上量子Fourier變換當中 ,其中 為物理qubit數, 是計算基底的數量。
在這裡我們可以使用二進位數的表述,定義
比如說一個只有兩個qubit的系統,它的計算基底 包含 四種。
那麼我們可以計算一下一個任意計算基底的Fourier變換
其中符號
這其中我們只需要使用一種特殊的量子門,就是 門(rotation)
定義
則線路可以如上圖所示。
現在我們模擬一個toy model,一個兩qubit的Fourier變換,考慮初態為
相應的電路為
一開始使用 在第一個qubit上構造疊加態,後面使用了
這一由之前的分解定理可知。
對於 , ,
,
故最終結果應該為
而IBM Q x5反饋的結果為
include "qelib1.inc";qreg q[5];creg c[5];h q[0];h q[0];tdg q[0];cx q[1],q[0];t q[0];cx q[1],q[0];h q[1];measure q[1] -> c[1];measure q[0] -> c[0];
相位估計(Phase Estimation)
相位估計是用來估計任意幺正操作 的本徵值的方法,知道了本徵值,我們就可以實現對角化,這個意義是非常重大的。
相位估計的問題被概括為
其中 是 的本徵矢量,求解 。相位估計的步驟如下:
- 在儲存器 當中製備疊加態,儲存器的物理qubit數 與要估計相位的精度有關。
- 從儲存器 向儲存器 施加 的受控幺正變換
- 此時,儲存器 其中的態變為
- 很顯然,此時我們可以看出了,我們需要做逆Fourier變換,來獲取
為了說明演算法結果的精度,考慮最大的 ,使得
最為接近實際的 ,並考察它們的差值 。
考慮儲存器 的態為
測量之後系統處於 態上的概率為
- 若測得的 ,則 ,此時直接計算帶估計的 .
- 若測得的 ,則至少要求測得坍縮在對應的態 的概率為
用量子演算法解線性方程
有了以上的工具,我們就可以考慮用量子演算法來接線性方程了。但是實際上這種演算法是沒有什麼顯著優勢的,在此我們僅僅做一討論。
對於線性方程組 ,如果 是Hermite的,我們可以直接求得
如果 是非Hermite的,我們可以首先將其構造成Hermite矩陣,考慮新方程組
滿足我們想要的性質。
對於算符 ,可以按其本徵態展開為
同理
同時,可以將向量 投影在 的本徵態上
因此有
用量子演算法求解線性方程組的步驟如下:
- 在儲存器中製備 個基態與矢量 ,此時系統的態為
- 利用相位估計方法獲取 的本徵態,此時系統的態為
, 是相位估計後儲存器的態
- 引入一個輔助位qubit,對其做旋轉操作,旋轉的角度與本徵值 有關
其中 與歸一化有關
- 做逆相位估計,將與相位估計的儲存器的關聯取消
- 做後選擇,在輔助儲存器 的基上進行測量
- 其係數即為解向量的各個分量。
相關線路如圖
我們假定待求的方程為
其中
我們選擇這個 的原因是
而 由分解公式易得
當我們選擇
解得
同理,對於其他的態也能得到正確答案
,
讀者可以一一驗證之,附qiskit代碼如下
import systry: sys.path.append("../../") # go to parent dir import Qconfig qx_config = { "APItoken": Qconfig.APItoken, "url": Qconfig.config[url]}except: qx_config = { "APItoken":"YOUR_TOKEN_HERE", "url":"https://quantumexperience.ng.bluemix.net/api"}# Useful additional packages import matplotlib.pyplot as plt%matplotlib inlineimport numpy as npimport mathfrom math import pifrom pprint import pprintimport lateximport qiskit.tools.qcvv.tomography as tomofrom qiskit.tools.visualization import plot_histogram,plot_statefrom qiskit.tools.qi.qi import state_fidelity, concurrence, purity, outerfrom qiskit import QuantumCircuit,QuantumProgram,ClassicalRegister,QuantumRegister,QISKitErrorfrom qiskit.tools.visualization import circuit_drawer#set QconfigQ_program = QuantumProgram()Q_program.set_api(Qconfig.APItoken, Qconfig.config[url]) # set the APIToken and API urlpprint(Q_program.available_backends())qr = Q_program.create_quantum_register("qr", 4)cr = Q_program.create_classical_register("cr", 4)backend = Q_program.get_backend_configuration(local_qasm_simulator)coupling=backend[coupling_map]qc=Q_program.create_circuit("qc", [qr], [cr])qc.h(qr[0])qc.h(qr[1])qc.ry(2*pi,qr[2])qc.cx(qr[0],qr[2])qc.ry(-pi/2,qr[2])qc.cx(qr[1],qr[2])qc.rz(pi/2,qr[2])qc.cx(qr[1],qr[2])qc.ry(pi/2,qr[2])qc.swap(qr[0], qr[1]) qc.h(qr[1])qc.t(qr[0])qc.cx(qr[1],qr[0])qc.tdg(qr[0])qc.cx(qr[1],qr[0])qc.h(qr[0])qc.swap(qr[0], qr[1])qc.ry(-pi/8, qr[3])qc.cx(qr[0],qr[3])qc.ry(pi/8, qr[3])qc.cx(qr[0],qr[3])qc.ry(-pi/4, qr[3])qc.cx(qr[1],qr[3])qc.ry(pi/4, qr[3])qc.cx(qr[1],qr[3])qc.swap(qr[0], qr[1])qc.h(qr[0])qc.tdg(qr[1])qc.cx(qr[0],qr[1])qc.t(qr[1])qc.cx(qr[0],qr[1])qc.h(qr[1])qc.swap(qr[0], qr[1])qc.ry(-pi/2,qr[2])qc.cx(qr[1],qr[2])qc.rz(-pi/2,qr[2])qc.cx(qr[1],qr[2])qc.ry(pi/2,qr[2])qc.cx(qr[0],qr[2])qc.h(qr[0])qc.h(qr[1])qc.measure(qr[2],cr[2])run1 = Q_program.execute([qc], backend=local_qasm_simulator)plot_histogram(run1.get_counts("qc"))
推薦閱讀:
※18歲華裔少年顛覆量子加速優勢,推動量子演算法經典化
※量子計算機真的來了嗎?
※潘建偉團隊實現18個光量子比特糾纏,再次刷新世界紀錄
※兩量子比特晶元到來,量子計算機更近一步
※當前量子計算技術前沿是什麼水平? [1](轉自知乎)