Nobisuke
Dekisugi
RAG
Privacy policy
2021/02/11 04:56
毎回少しずつ量子ゲート方式のチュートリアルを行なっています。今回は二つの量子ビットの値を入れ替えるswapゲートを見てみます。
swapゲートは2つの量子ビットの値を入れ替えます。よく使うテクニックなので覚えておきましょう。
Copy from blueqat import Circuit Circuit().x[0].m[:].run(shots=1)
Counter({'1': 1})
こちらは、0番目の量子ビットを1にしてみます。
Counter({'1': 1})
これで準備が整いました。0番目と1番目の量子ビットを入れ替えてみます。結果は01になるはずです。
Copy 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ゲートをたくさん使うことで好きな量子ビットの値を入れ替えることができます。
こちらは基本のパウリゲートと呼ばれる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ゲートは初期状態のままでは実行ができませんので、アダマールゲートをかけてみて、軸を変えてから実行してみます。
Copy 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と同じ効果をもたらします。
応用で任意回転ゲートを実装してみます。上記のCXゲートなどは回転角が固定になっていますが、好きな角度で回転できる任意回転角のゲートを実行してみます。任意回転ゲートはRzゲートがあります。こちらを2つとCXゲートを2つ用意することで実現できます。
最初の任意回転は回転させたい角度をΘとおいて、Θ/2。2つめは-Θ/2とします。(すいません、0番目と1番目の量子ビットが上の例題と逆になっています。。。)
Copy 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ゲートとして準備されました。
Copy Circuit().x[0].crx(math.pi)[0,1].m[:].run(shots=100)
Counter({'11': 100})
これで、
Counter({'11': 100})
結果として同じになりました。このように、今回は制御ゲート、任意回転角の制御ゲートを見てみました。様々な応用がありますので、制御ゲートはぜひ覚えてみてください。
© 2024, blueqat Inc. All rights reserved