Help us understand the problem. What is going on with this article?

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

はじめに

毎回少しずつ量子ゲート方式のチュートリアルを行なっています。今回は3量子ビットを使うトフォリゲートを実行してみます。

前回まで

前回までのおさらいはこちらです。

「Google ColaboratoryとBlueqatで始める量子コンピュータプログラミング04(量子もつれ)」
https://qiita.com/YuichiroMinato/items/01fd29b257ba2eeab686

「Google ColaboratoryとBlueqatで始める量子コンピュータプログラミング03(重ね合わせ)」
https://qiita.com/YuichiroMinato/items/58d43c55f7a46b9e9b23

「Google ColaboratoryとBlueqatで始める量子コンピュータプログラミング02(2量子ビット)」
https://qiita.com/YuichiroMinato/items/d012ba176d6da8cbecfb

「Google ColaboratoryとBlueqatで始める量子コンピュータプログラミング01(1量子ビット)」
https://qiita.com/YuichiroMinato/items/6908e00c98843cc64bf0

早速やってみます
youtubeでは動画を、google colabのリンクでは実際にプログラミングがされた状態が準備できます。

youtube動画は、
https://www.youtube.com/watch?v=cNUhn9Uk8lY

今回のgoogle colabリンク
https://colab.research.google.com/github/Blueqat/Blueqat-tutorials/blob/master/tutorial-ja/005_basic_toffoli.ipynb

インストール
まずはインストールです。google colabでは毎回インストールが必要です。

!pip install blueqat

!マークをつけてインストールをします。完了したら次に進みます。

トフォリゲート

トフォリゲートは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})

もしくは、

Circuit().toffoli[0,1,2].m[:].run(shots=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})

どうなったでしょうか。0番目と1番目の量子ビットを1にしたことにより、2番目の量子ビットが0から1に変化しました。このようにコントロールビットを両方とも1にするとターゲットビットが反転します。

コントロールビットの片方の量子ビットだけを1にしたときはどうでしょうか。

Circuit().x[0].ccx[0,1,2].m[:].run(shots=1)

#Counter({'100': 1})

こちらもターゲットビットは変化なしです。

Circuit().x[1].ccx[0,1,2].m[:].run(shots=1)

Counter({'010': 1})

こちらもコントロールビットの片方だけが1なのでターゲットビットは反応なしです。

トフォリゲートの真理値表と行列表現

トフォリゲートの入出力は真理値表というもので確認ができます。

入力 出力
000 000
001 001
010 010
011 011
100 100
101 101
110 111
111 110

これをみると、110と111の時だけターゲットビットが反転しています。ゲートの行列表現も見てみましょう。

\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)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away