blueqat cloudで始める量子コンピュータプログラミング06,07(swapゲート、制御ゲート)

はじめに

毎回少しずつ量子ゲート方式のチュートリアルを行なっています。今回は二つの量子ビットの値を入れ替えるswapゲートを見てみます。

2つの量子ビットを入れ替えるswapゲート

swapゲートは2つの量子ビットの値を入れ替えます。よく使うテクニックなので覚えておきましょう。

from blueqat import Circuit
Circuit().x[0].m[:].run(shots=1)

こちらは、0番目の量子ビットを1にしてみます。

Counter({'1': 1})

これで準備が整いました。0番目と1番目の量子ビットを入れ替えてみます。結果は01になるはずです。

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

こうすると、

Counter({'01': 1})

swapゲートはCXゲートを交互に三回使うことで実現できます。CXゲートは真ん中だけ上下逆にします。上記の回路では0番目の量子ビットに1を設定した後にswapゲートを適用して交換して01と入れ替えに成功しています。swapゲートは度々出てくるテクニックなので覚えておいた方がいいでしょう。

4つでも5つでも順番に量子ビットを入れ替えながら大きな回路でもswapゲートをたくさん使うことで好きな量子ビットの値を入れ替えることができます。

CX,CY,CZ

こちらは基本のパウリゲートと呼ばれるX,Y,Zを制御ゲートにしたものです。コントロールビットが1の時だけ、指定のパウリゲートをターゲットビットに実行します。

早速ツールを読み込んで実行してみます。下記は0番目の量子ビットを1にした上でCXゲートを実行してみます。

from blueqat import Circuit Circuit().x[0].cx[0,1].m[:].run(shots=1)

こちらは、

Counter({'11': 1})

のように11となりました。CZゲートは初期状態のままでは実行ができませんので、アダマールゲートをかけてみて、軸を変えてから実行してみます。

Circuit().x[0].h[1].cz[0,1].h[1].m[:].run(shots=1)

実行してみると、

Counter({'11': 1})

こちらもCZゲートが効いて11となりました。上記のH-CZ-HはCXと同じ効果をもたらします。

(応用)制御Rzゲート

応用で任意回転ゲートを実装してみます。上記のCXゲートなどは回転角が固定になっていますが、好きな角度で回転できる任意回転角のゲートを実行してみます。任意回転ゲートはRzゲートがあります。こちらを2つとCXゲートを2つ用意することで実現できます。

最初の任意回転は回転させたい角度をΘとおいて、Θ/2。2つめは-Θ/2とします。(すいません、0番目と1番目の量子ビットが上の例題と逆になっています。。。)

import math
Circuit().x[1].h[0].rz(math.pi/2)[0].cx[1,0].rz(-math.pi/2)[0].cx[1,0].h[0].m[:].run(shots=100)

こちらは、

Counter({'11': 100})

毎回こんなことをやっていたら大変なので、blueqatでは、制御Rzゲートがcrzゲートとして準備されました。

Circuit().x[0].crx(math.pi)[0,1].m[:].run(shots=100)

これで、

Counter({'11': 100})

結果として同じになりました。このように、今回は制御ゲート、任意回転角の制御ゲートを見てみました。様々な応用がありますので、制御ゲートはぜひ覚えてみてください。

Yuichiro Minato
blueqat CEO/CTO 2015年総務省異能vation最終採択 2017年内閣府ImPACTプロジェクトPM補佐 2019年文科省さきがけ量子情報処理領域アドバイザー
Comments
Yuichiro Minato
blueqat CEO/CTO 2015年総務省異能vation最終採択 2017年内閣府ImPACTプロジェクトPM補佐 2019年文科省さきがけ量子情報処理領域アドバイザー
Related posts

blueqat Inc.

Shibuya Scramble Square 39F 2-24-12, Shibuya, Shibuya-ku, Tokyo
Contact: info@blueqat.com