ユニタリ演算の合成
Package versions
このページのコードは、以下の要件を使用して開発されました。 これらのバージョン以上を使用することを推奨します。
qiskit[all]~=2.5.2
ユニタリ演算は、量子系に対するノルム保存的な変化を記述します。 個のQubitの場合、この変化は随伴が逆行列に等しい、すなわちである次元の複素行列によって記述されます。
特定のユニタリ演算を量子ゲートの集合へ合成することは、例えば量子アルゴリズムの設計・応用や量子回路のコンパイルにおいて用いられる基本的なタスクです。
Clifford ゲートで構成されるユニタリやテンソル積構造を持つユニタリなど、特定のクラスに対しては効率的な合成が可能ですが、ほとんどのユニタリはこれらのカテゴリに該当しません。 一般のユニタリ行列に対する合成は複雑なタスクであり、計算コストは量子ビット数に対して指数的に増大します。 そのため、実装したいユニタリに対して効率的な分解が既知であれば、多くの場合、一般的な合成よりもそちらを使用する方が適切です。
分解が利用できない場合、Qiskit SDK は分解を見つけるためのツールを提供しています。 ただし、一般にこれは深い回路を生成するため、ノイズのある量子コンピュータでの実行には適さない場合があることに注意してください。
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "qiskit": "qiskit"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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 0x1058da0b0>
回路最適化のための再合成
長い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: 15π/8
┌───────────────┐ ┌────────────────┐
q_0: ┤ U(π/2,π/2,-π) ├───■──┤ U(π/2,-π,-π/2) ├
├───────────────┴┐┌─┴─┐├───────────────┬┘
q_1: ┤ U(3π/4,π/2,-π) ├┤ X ├┤ U(π/2,π/4,-π) ├─
└────────────────┘└───┘└───────────────┘
Qiskit の transpile 関数は、十分に高い最適化レベルを設定することで、この再合成を自動的に実行します。
次のステップ
- Grover のアルゴリズム チュートリアルで回路分解の例を参照してください。
- Qiskit トランスパイラの詳細については、トランスパイルセクション を参照してください。