Nobisuke
Dekisugi
RAG
Privacy policy
2021/01/31 13:58
毎回少しずつ量子ゲート方式のチュートリアルを行なっています。今回は3量子ビットを使うトフォリゲートを実行してみます。
トフォリゲートは3量子ビットを利用する演算です。トフォリゲートはトマソ・トフォリによって作られ、2つのコントロールビットと1つのターゲットビットを持ちます。2つのコントロールビットが両方1の時にのみ、ターゲットビットを反転させます。
トフォリゲートは利用するのは簡単です。.ccxもしくは.toffoliを使います。 まずは単純に回路を書いてみましょう。ここでは*をコントロールビット、Xをターゲットビットとしています。
|0> --*----
|0> --*----
|0> --X----
トフォリゲートは、
Copy from blueqat import Circuit Circuit().ccx[0,1,2].m[:].run(shots=1) #Counter({'000': 1})
Counter({'000': 1})
もしくは、
Copy Circuit().toffoli[0,1,2].m[:].run(shots=1) #Counter({'000': 1})
Counter({'000': 1})
のように書けます。どちらの書き方をつかっても大丈夫です。上記はコントロールビットが両方とも0なので、ターゲットビットには変化がありません。
コントロールビットの片方を1にした時と、両方を1にした時とでどうなるかみてみましょう。最初にコントロールビットの両方を1にしてみます。1にするには反転ゲートのXゲートを使います。
Copy 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にしたときはどうでしょうか。
Copy Circuit().x[0].ccx[0,1,2].m[:].run(shots=1) #Counter({'100': 1})
Counter({'100': 1})
こちらもターゲットビットは変化なしです。
Copy 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で構成されます。ちょっと長いですががんばってかいてみましょう。
Copy 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})
© 2024, blueqat Inc. All rights reserved