IBM Quantum Challenge 2019 振り返り(第2週)
第2週の課題を振り返っていきます。
第2週 Grover(グローバー)のアルゴリズム
グローバーのアルゴリズムは探索問題を解く量子コンピュータのアルゴリズムです。 反転操作を繰り返し行う過程が、量子センシングのスピンの位相反転させる操作と似ていて、すんなり理解できました。
Groverのアルゴリズムの解説、第2週の課題はこちら↓
今回も解答例の量子回路を参考に、コストが小さくなるように回路を実装していきました。
解答
補助量子ビットなし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)
正しく|10>の状態の確率が増幅してます!
groverCircuit.draw(output='mpl')
単一量子ビットゲートをできるだけまとめたので、解答例よりも低コストな量子回路となっています。一方で、量子回路の可読性も非常に低くなってしましました。
# 出力 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週はこちら