common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

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

Yuichiro Minato

2021/02/11 04:56

#量子ゲート #blueqat

はじめに

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

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

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

from blueqat import Circuit Circuit().x[0].m[:].run(shots=1)
Counter({'1': 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})

こうすると、

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})

実行してみると、

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})

こちらは、

Counter({'11': 100})

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

Circuit().x[0].crx(math.pi)[0,1].m[:].run(shots=100)
Counter({'11': 100})

これで、

Counter({'11': 100})

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

© 2024, blueqat Inc. All rights reserved