ユニタリ演算の合成
Package versions
このページのコードは、以下の要件を用いて開発されました。 これらのバージョン以降を使用することを推奨します。
qiskit[all]~=2.4.0
ユニタリ演算は、量子系に対するノルム保存の変換を記述します。 量子ビットの場合、この変換は の複素行列 によって表され、その随伴行列が逆行列と等しい、すなわち という条件を満たします。
特定のユニタリ演算を量子ゲートの集合へ合成することは、例えば量子アルゴリズムの設計・応用や量子回路のコンパイルにおいて用いられる基本的なタスクです。
Clifford ゲートで構成されるユニタリやテンソル積構造を持つユニタリなど、特定のクラスに対しては効率的な合成が可能ですが、ほとんどのユニタリはこれらのカテゴリに該当しません。 一般のユニタリ行列に対する合成は複雑なタスクであり、計算コストは量子ビット数に対して指数的に増大します。 そのため、実装したいユニタリに対して効率的な分解が既知であれば、一般的な合成よりもそちらを使用する方が適切です。
分解が利用できない場合、Qiskit SDK は分解を見つけるためのツールを提供しています。 ただし、一般にこれは深い回路を生成するため、ノイズのある量子コンピュータでの実行には適さない場合があることに注意してください。
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
import numpy as np
from qiskit import QuantumCircuit
U = 0.5 * np.array(
[[1, 1, 1, 1], [-1, 1, -1, 1], [-1, -1, 1, 1], [-1, 1, 1, -1]]
)
circuit = QuantumCircuit(2)
circuit.unitary(U, circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet at 0x7f5ec46183d0>
回路最適化のための再合成
長い1量子ビットおよび2量子ビットゲートの列を再合成することで、回路の長さを短縮できる場合があります。例えば、次の回路は3つの2量子ビットゲートを使用しています。
from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
qreg_q = QuantumRegister(2, "q")
creg_c = ClassicalRegister(4, "c")
circuit = QuantumCircuit(qreg_q, creg_c)
circuit.h(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.sx(qreg_q[1])
circuit.cz(qreg_q[0], qreg_q[1])
circuit.x(qreg_q[1])
circuit.x(qreg_q[0])
circuit.cx(qreg_q[0], qreg_q[1])
circuit.h(qreg_q[0])
circuit.draw("mpl")
しかし、以下のコードで再合成を行うと、必要な CX ゲートは1つだけになります。(ここでは、ユニタリの再合成に使用されるゲートをより明確に可視化するために QuantumCircuit.decompose() メソッドを使用しています。)
from qiskit.quantum_info import Operator
# compute unitary matrix of circuit
U = Operator(circuit)
# re-synthesize
better_circuit = QuantumCircuit(2)
better_circuit.unitary(U, range(2))
better_circuit.decompose().draw()
global phase: 6.2071
┌───────────────┐ ┌────────────────┐
q_0: ─┤ U(π/2,π/2,-π) ├────■────┤ U(π/2,-π,-π/2) ├─
┌┴───────────────┴─┐┌─┴─┐┌─┴────────────────┴┐
q_1: ┤ U(1.7229,π/2,-π) ├┤ X ├┤ U(π/2,0.15207,-π) ├
└──────────────────┘└───┘└───────────────────┘
Qiskit の transpile 関数は、十分に高い最適化レベルを設定することで、この再合成を自動的に実行します。
次のステップ
- Grover のアルゴリズム チュートリアルで回路分解の例を参照してください。
- Qiskit トランスパイラの詳細については、トランスパイルセクション を参照してください。