common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

blueqat cloudで始める量子コンピュータプログラミング05(トフォリゲート)

Yuichiro Minato

2021/01/31 13:58

#量子ゲート

はじめに

毎回少しずつ量子ゲート方式のチュートリアルを行なっています。今回は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の時だけターゲットビットが反転しています。ゲートの行列表現も見てみましょう。

[1000000001000000001000000001000000001000000001000000000100000010]\begin{bmatrix} 1&0&0&0&0&0&0&0\\ 0&1&0&0&0&0&0&0\\ 0&0&1&0&0&0&0&0\\ 0&0&0&1&0&0&0&0\\ 0&0&0&0&1&0&0&0\\ 0&0&0&0&0&1&0&0\\ 0&0&0&0&0&0&0&1\\ 0&0&0&0&0&0&1&0\\ \end{bmatrix}

最後のゲート演算で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})

© 2024, blueqat Inc. All rights reserved