IBM Quantum ExperienceとBlueqatでCCXゲート(トフォリゲート)を体験してみる


量子コンピュータ初心者です。前回に引き続きIBM Quantum ExperienceとBlueqatを使って、$CCX$ゲート(トフォリゲート)を試してみます。

CCXゲート(トフォリゲート)

$CCX$ゲートは3量子ビットの演算です。$CX$ゲートの拡張版?みたいな感じで、制御ビットが1つ増えて2個あります。トマソ・トフォリによって作られたのでトフォリゲートとも呼ばれます。
2つの制御ビットが共に1になったときに、ターゲットビットを反転します。

CCXゲートの準備

Circuit Composerで'q' register qubitsを3にして3量子ビットにします。さらに$CCX$ゲートを配置します。慣例に沿って測定のアイコンも入れておきます。

Measurement Probabilityの結果を見ると000になっています。まだ何もしていないので当然ですね。

CCXゲートを使ってみる

q[0]とq[1]に$X$ゲートを入れて動作を確認してみます。

制御ビットの片方だけ1の場合

q[0]に$X$ゲートを適用して片方だけ1の状態にしてみます。当然のことながらターゲットビットは反転されずそのまま出力され、結果は001となります。Circuit Composerでは結果は後→前の順番で出てきますので、q[0]の結果が最後の1にあたります。

ターゲットビットに$X$ゲートを適用しても、そのまま出力されて結果は101になります。

制御ビットが両方1の場合

q[0]とq[1]の両方に$X$ゲートを適用すると、ターゲットビットが反転されます。いまq[2]はもともと0ですので反転されて結果は111になりました。

q[2]にも$X$ゲートを適用しておくと、反転されて結果は011になりました。

Blueqatのコード

同じような操作をBlueqatでやってみます。

from blueqat import Circuit
res = []
res.append(Circuit(3).ccx[0,1,2].m[:].run(shots=1))          #000
res.append(Circuit(3).x[2].ccx[0,1,2].m[:].run(shots=1))     #001
res.append(Circuit(3).x[1].ccx[0,1,2].m[:].run(shots=1))     #010
res.append(Circuit(3).x[1,2].ccx[0,1,2].m[:].run(shots=1))   #011
res.append(Circuit(3).x[0].ccx[0,1,2].m[:].run(shots=1))     #100
res.append(Circuit(3).x[0,2].ccx[0,1,2].m[:].run(shots=1))   #101
res.append(Circuit(3).x[0,1].ccx[0,1,2].m[:].run(shots=1))   #110
res.append(Circuit(3).x[:].ccx[0,1,2].m[:].run(shots=1))     #111

for i in res:
  print(i)

実行すると2つの制御ビットが共に1のとき(最後の110と111)だけターゲットビットが反転されていることがわかります。なおBlueqatでは量子ビットの順番(q[0],q[1],q[2])で結果が出てきます。Circuit Composerとは逆なので注意してください。

Counter({'000': 1})
Counter({'001': 1})
Counter({'010': 1})
Counter({'011': 1})
Counter({'100': 1})
Counter({'101': 1})
Counter({'111': 1})
Counter({'110': 1})

参考資料

Blueqatチュートリアル トフォリゲート