Qiskitで量子フーリエ変換(QFT)やってみた
はじめに
IBM Quantum Challenge 2019に参加してからもっと量子コンピュータを学びたいと思い、最近はQuantum Native Dojoで勉強しています!!
量子状態の理論を復習しつつ、量子アルゴリズムを理解できるので自分にとても合っているページです。
今回は第2章に出てくる量子フーリエ変換(Quantum Fourier Transform, QFT)をQiskitで実装してきます。
量子フーリエ変換とは
簡単に言うと、信号処理で用いられてる離散フーリエ変換を量子ビットに適用したものです。
数式を用いた理論の説明は、下記を参考にしてみてください。ここでは、説明しません。
Quantum Native Dojo 2-3
dojo.qulacs.org
慶応の量子コンピュータの講義も参考になりました。
www.youtube.com
Qiskitでの実装
3qubitで実装してきます。
、を入力した場合、QFTの出力はそれぞれ次のようになります。
※係数は無視
これを量子ビットに適用するため、2進数に書き直すと下記のようになります。
入力の場合
#パッケージのインポート import numpy as np from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit from qiskit import execute,Aer from qiskit.tools.monitor import job_monitor from qiskit import IBMQ from qiskit.providers.ibmq import least_busy from qiskit.visualization import plot_histogram # IBMQを使用する IBMQ.load_account() #QFT回路の実装 q = QuantumRegister(3) c = ClassicalRegister(3) qc = QuantumCircuit(q,c) qc.h(q[0]) qc.cu1(1/2*np.pi,q[1],q[0]) qc.cu1(1/4*np.pi,q[2],q[0]) qc.h(q[1]) qc.cu1(1/2*np.pi,q[2],q[1]) qc.h(q[2]) qc.barrier() qc.measure(q,c) qc.draw(output='mpl')
# IBMQのシミュレータで実行 provider = IBMQ.get_provider(group='open') backend = provider.get_backend('ibmq_qasm_simulator') job = execute(qc, backend=backend, shots=8000, seed_simulator=0, backend_options={"fusion_enable":True}) result = job.result() count = result.get_counts() plot_histogram(count)
が出力されて、QFTが実装できました!!!
# 量子コンピュータ実機でも実行 provider = IBMQ.get_provider(group='open') backend_lb = least_busy(provider.backends(simulator=False, operational=True)) print("Least busy backend: ", backend_lb) backend = backend_lb shots = 8000 job_exp = execute(qc, backend=backend, shots=shots) job_monitor(job_exp, interval = 2) results = job_exp.result() plot_histogram(results.get_counts(qc))
エラーやノイズによって?確率にばらつきはありますが、しっかり実行できてます!
入力の場合
q = QuantumRegister(3) c = ClassicalRegister(3) qc = QuantumCircuit(q,c) # 入力の用意 qc.h(q[0]) qc.h(q[1]) qc.barrier() # QFT qc.h(q[0]) qc.cu1(1/2*np.pi,q[1],q[0]) qc.cu1(1/4*np.pi,q[2],q[0]) qc.h(q[1]) qc.cu1(1/2*np.pi,q[2],q[1]) qc.h(q[2]) qc.barrier() qc.measure(q,c) qc.draw(output='mpl')
# IBMQシミュレータで実行 provider = IBMQ.get_provider(group='open') backend = provider.get_backend('ibmq_qasm_simulator') job = execute(qc, backend=backend, shots=8000, seed_simulator=0, backend_options={"fusion_enable":True}) result = job.result() count = result.get_counts() plot_histogram(count)
が出力されました!
# 量子コンピュータ実機でも実行 provider = IBMQ.get_provider(group='open') backend_lb = least_busy(provider.backends(simulator=False, operational=True)) print("Least busy backend: ", backend_lb) backend = backend_lb shots = 8000 job_exp = execute(qc, backend=backend, shots=shots) job_monitor(job_exp, interval = 2) results = job_exp.result() plot_histogram(results.get_counts(qc))
3qubitのQFTは実装できましたー!