はじめに
毎回少しずつ量子ゲート方式のチュートリアルを行なっています。今回は3量子ビットを使うトフォリゲートを実行してみます。
トフォリゲート
トフォリゲートは3量子ビットを利用する演算です。トフォリゲートはトマソ・トフォリによって作られ、2つのコントロールビットと1つのターゲットビットを持ちます。2つのコントロールビットが両方1の時にのみ、ターゲットビットを反転させます。
回路の作成
トフォリゲートは利用するのは簡単です。.ccxもしくは.toffoliを使います。 まずは単純に回路を書いてみましょう。ここでは*をコントロールビット、Xをターゲットビットとしています。
|0> --*----
|0> --*----
|0> --X----
トフォリゲートは、
from blueqat import Circuit
Circuit().ccx[0,1,2].m[:].run(shots=1)
#Counter({'000': 1})
Counter({'000': 1})
もしくは、
Circuit().toffoli[0,1,2].m[:].run(shots=1)
#Counter({'000': 1})
Counter({'000': 1})
のように書けます。どちらの書き方をつかっても大丈夫です。上記はコントロールビットが両方とも0なので、ターゲットビットには変化がありません。
コントロールビットを変化させてみる
コントロールビットの片方を1にした時と、両方を1にした時とでどうなるかみてみましょう。最初にコントロールビットの両方を1にしてみます。1にするには反転ゲートのXゲートを使います。
Circuit().x[0,1].ccx[0,1,2].m[:].run(shots=1)
#Counter({'111': 1})
Counter({'111': 1})
どうなったでしょうか。0番目と1番目の量子ビットを1にしたことにより、2番目の量子ビットが0から1に変化しました。このようにコントロールビットを両方とも1にするとターゲットビットが反転します。
コントロールビットの片方の量子ビットだけを1にしたときはどうでしょうか。
Circuit().x[0].ccx[0,1,2].m[:].run(shots=1)
#Counter({'100': 1})
Counter({'100': 1})
こちらもターゲットビットは変化なしです。
Circuit().x[1].ccx[0,1,2].m[:].run(shots=1)
#Counter({'010': 1})
Counter({'010': 1})
こちらもコントロールビットの片方だけが1なのでターゲットビットは反応なしです。
トフォリゲートの真理値表と行列表現
トフォリゲートの入出力は真理値表というもので確認ができます。
入力 出力
000 000
001 001
010 010
011 011
100 100
101 101
110 111
111 110
これをみると、110と111の時だけターゲットビットが反転しています。ゲートの行列表現も見てみましょう。
最後のゲート演算でXゲートが見れます。真理値表とも合っているのが確認できます。
トフォリゲートの中身
トフォリゲートは実は中身は1量子ビットゲートと2量子ビットゲートで構成されています。回路はHとCXとTで構成されます。ちょっと長いですががんばってかいてみましょう。
from blueqat import Circuit
import numpy as np
Circuit().x[1:].h[0].cnot[1,0].rz(-np.pi/4)[0].cnot[2,0].rz(np.pi/4)[0].cnot[1,0].rz(-np.pi/4)[0].cnot[2,0].rz(np.pi/4)[:1].h[0].cnot[1,0].cnot[0,1].cnot[1,0].cnot[2,0].rz(-np.pi/4)[0].rz(np.pi/4)[2].cnot[2,0].m[:].run(shots=1)
Counter({'111': 1})