解説
量子ビットの状態をスワップする量子ゲートはスワップゲートと呼ばれます。
この問題では、ビットが変わるだけで複素振幅には変化がないため、X ゲートや制御 X ゲート( CX ゲート) 1 を利用できないかと考えることができます。
実際、スワップゲートは次のように 3 つの制御 X ゲートを用いて実装できることが知られています。
状態遷移は次のように表されます。
a0∣00⟩+a1∣10⟩+a2∣01⟩+a3∣11⟩CX(0,1)a0∣00⟩+a3∣10⟩+a2∣01⟩+a1∣11⟩CX(1,0)a0∣00⟩+a3∣10⟩+a1∣01⟩+a2∣11⟩CX(0,1)a0∣00⟩+a2∣10⟩+a1∣01⟩+a3∣11⟩
すなわち、CX(0,1) は ∣10⟩ と ∣11⟩ の複素振幅を、CX(1,0) は ∣01⟩ と ∣11⟩ の複素振幅を入れ替えることがわかります。
回路の深さは 3 です。
参考
3ステップで 2 変数 x,y をスワップする古典アルゴリズムとして、XOR swap が知られています。
このアルゴリズムでは、XOR演算を利用して以下の 3 つのステップでスワップが実現されます。
- y を x+y(mod2) で置き換える。
- x を x+y(mod2) で置き換える。
- y を x+y(mod2) で置き換える。
y を x+y(mod2) で置き換える操作は CX(0,1) と対応し、x を x+y(mod2) で置き換える操作は CX(1,0) と対応するので、このアルゴリズムを元に解くこともできます。
解答例
解答例は以下の通りです。
from qiskit import QuantumCircuit
def solve() -> QuantumCircuit:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.cx(1, 0)
qc.cx(0, 1)
return qc