はじめに
前回は1量子ビットの計算の概要と2量子ビットを見ました。今回は量子コンピュータの特徴の一つである重ね合わせを行ってみます。
前回まで
前回までのおさらいはこちらです。
「blueqat cloudで始める量子コンピュータプログラミング02(2量子ビット)」
「blueqat cloudで始める無料量子コンピュータプログラミング01(1量子ビットの計算)」
重ね合わせ回路
早速作ってみましょう。簡単です、ツールを読み込んで1行書くだけ。
from blueqat import Circuit
Circuit().h[0].m[:].run(shots=100)
Counter({'1': 49, '0': 51})
こちらはアダマールゲートと呼ばれるゲートを適用しています。こちらは0と1の重ね合わせを作るための回路です。こちらを実行すると、、、
Counter({'0': 46, '1': 54})
0と1が約半々で出てきました。これは答えは定まっておらず、50%ずつで実行するたびにちょっとずつ変わります。これが重ね合わせ回路です。
状態ベクトルを確認してみる
上記は状態ベクトルと呼ばれる数値を確認することで中がどうなっているか確認することができます。状態ベクトルは、
Circuit().h[0].run()
array([0.70710678+0.j, 0.70710678+0.j])
上記のように測定をしないことで取得できます。これを実行すると、
array([0.70710678+0.j, 0.70710678+0.j])
こう出ました。この場合は配列となっており、左の数が0が出る確率の平方根。右の数が1が出る確率の平方根となっています。上記は0.707*0.707=0.5ということで、二乗して確認ができます。
マイナス状態???
この回路を実行するとどうなるでしょうか?
Circuit().h[0].z[0].run()
array([ 0.70710678+0.j, -0.70710678+0.j])
これは、
array([ 0.70710678+0.j, -0.70710678+0.j])
となりました。確率振幅と呼ばれる数字にマイナスがついています。これをサンプリングすると、
Circuit().h[0].z[0].m[:].run(shots=100)
Counter({'0': 46, '1': 54})
Counter({'0': 52, '1': 48})
答え自体はプラス状態と見分けがつきません。上記の状態は計算結果としては変わりませんが、計算過程で利用をしたりしますので、今後確認してみたいと思います。