common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

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