進捗のようなもの

やったこと書きます

IBM Quantum Challenge 2019 振り返り(第2週)

第2週の課題を振り返っていきます。

第2週 Grover(グローバー)のアルゴリズム

グローバーアルゴリズムは探索問題を解く量子コンピュータアルゴリズムです。 反転操作を繰り返し行う過程が、量子センシングのスピンの位相反転させる操作と似ていて、すんなり理解できました。

Groverのアルゴリズムの解説、第2週の課題はこちら↓

github.com

今回も解答例の量子回路を参考に、コストが小さくなるように回路を実装していきました。

解答

補助量子ビットなしver.

# パッケージのインポート
import numpy as np

from qiskit import BasicAer
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister, execute
from qiskit.transpiler.passes import Unroller
from qiskit.transpiler import PassManager
from qiskit.tools.visualization import plot_histogram

# 量子回路の作成
qr = QuantumRegister(2)
cr = ClassicalRegister(2)
groverCircuit = QuantumCircuit(qr, cr)

# オラクル
groverCircuit.u3(0.5*np.pi, 0, np.pi, qr[0])
groverCircuit.cx(qr[0], qr[1])

# 反転増幅回路
groverCircuit.u3(0.5*np.pi, np.pi, 0, qr[0])
groverCircuit.u3(0.5*np.pi, 0, np.pi, qr[1])
groverCircuit.cx(qr[0], qr[1])
groverCircuit.u3(0.5*np.pi, 0, 0, qr[0])
groverCircuit.u3(0, 0, np.pi, qr[1])

# 計測
groverCircuit.measure(qr, cr)

# 量子回路の実行
backend = BasicAer.get_backend('qasm_simulator')
shots = 1024
results = execute(groverCircuit, backend=backend, shots=shots).result()
answer = results.get_counts()
plot_histogram(answer)

f:id:SJSY:20191027145805p:plain 正しく|10>の状態の確率が増幅してます!

groverCircuit.draw(output='mpl')

f:id:SJSY:20191027145950p:plain 単一量子ビットゲートをできるだけまとめたので、解答例よりも低コストな量子回路となっています。一方で、量子回路の可読性も非常に低くなってしましました。

# 出力
answer_sorted = sorted(answer.items(), key=lambda x: x[1])
print(answer_sorted[-1][0])

# 量子回路コスト
pass_ = Unroller(['u3', 'cx'])
pm = PassManager(pass_)
unrolled_groverCircuit = pm.run(groverCircuit)
unrolled_groverCircuit.draw(output='mpl')
print(unrolled_groverCircuit.count_ops())

出力

10
OrderedDict([('u3', 5), ('cx', 2), ('measure', 2)])

IBM Quantum Challenge 2019 関連

第1週はこちら

sjsy.hatenablog.com