※こちらはQuantum Challenge 2019に記載されていた「重要: Unrollerを用いた量子コストの導出」をQiskit1.1で実行したものであり、考え方はQuantum Challenge 2019と同じ。
量子回路を評価する方法として以下の手法が存在する。
- 量子ビット数
- 深さ:量子計算は量子ゲートと呼ばれる演算を量子状態に適用します。この量子ゲートを適用するためにかかる総時間ステップ数を深さと呼ぶ。
- 実行速度
- 命令数
Quantum Challenge 2019では命令数のことをカウントしており、次のように計算で出てくる値をコストと呼ぶ。
コスト=単一量子ビットゲートの数 + CXゲートの数x10
任意の量子回路を1量子ビットに作用する単一量子ビットゲートと2量子ビットを用いる2量子ビットゲートに分解することによって量子回路のコストを計算します。その際、2量子ビットを扱うCX(CNOT)ゲートにはノイズが乗るため1量子ビットの10倍の重み付けをする。
以下では、実際の回路を組んでコストを計算する。
import numpy as np
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
process_fidelity
qr = QuantumRegister(4, 'q0')
cr = ClassicalRegister(1, 'c0')
qc = QuantumCircuit(qr,cr)
qc.ccx(qr[0], qr[1], qr[2])
qc.cx(qr[3], qr[1])
qc.h(qr[3])
qc.ccx(qr[3], qr[2], qr[1])
qc.measure(qr[3], cr[0])
qc.draw('mpl')
qc.count_ops()
OrderedDict([('ccx', 2), ('cx', 1), ('h', 1), ('measure', 1)])
この結果が意味するものは、単一量子ビットゲートとしてアダマールゲートがあり、その他に2量子ビットを扱うcxゲートや3量子ビットを扱うccxゲートがあることを示している。
これを以下のように単一量子ビットゲートと2量子ビットゲートで表してみる。
qc.decompose().draw('mpl')
さらにこの回路のコストを表すと
qc.decompose().count_ops()
OrderedDict([('cx', 13), ('t', 8), ('tdg', 6), ('h', 4), ('u2', 1), ('measure', 1)])
となる。この結果より、単一量子ビットゲートは19つ、2量子ビットゲートは13つあることがわかる。
よって、上で述べたコスト計算式を用いるとこの回路のコストは 19+13x10=149 になる。
では、次にCCXゲートの回路を作成しコストを考えてみる。
q = QuantumRegister(3, 'q0')
c = ClassicalRegister(1, 'c0')
qc = QuantumCircuit(q, c)
qc.ccx(q[0], q[1], q[2])
qc.draw(output='mpl')
こちらも上と同様に単一量子ビットゲートと2量子ビットゲートで表してみる。
qc.decompose().draw('mpl')
そして、回路のコストを表してみる。
qc.decompose().count_ops()
OrderedDict([('cx', 6), ('t', 4), ('tdg', 3), ('h', 2)])
となり、単一量子ビットゲートは9つ、2量子ビットゲートは6つあることがわかる。
よってこの回路のコストは 9+6x10=69 になる。
参考:
Quantum Challenge 2019
The Quantum Challenge Fall 2020 結果発表