Nobisuke
Dekisugi
RAG
Privacy policy
2021/01/29 14:19
1
前回は1量子ビットの計算の概要と2量子ビットを見ました。今回は量子コンピュータの特徴の一つである重ね合わせを行ってみます。
前回までのおさらいはこちらです。
「blueqat cloudで始める量子コンピュータプログラミング02(2量子ビット)」 https://blueqat.com/yuichiro_minato2/576bd34e-33b3-4eef-abcf-e2ea690094e8
「blueqat cloudで始める無料量子コンピュータプログラミング01(1量子ビットの計算)」 https://blueqat.com/yuichiro_minato2/6d3cf2e7-4fdd-4aa5-b211-0e039ded6967
早速作ってみましょう。簡単です、ツールを読み込んで1行書くだけ。
Copy 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%ずつで実行するたびにちょっとずつ変わります。これが重ね合わせ回路です。
上記は状態ベクトルと呼ばれる数値を確認することで中がどうなっているか確認することができます。状態ベクトルは、
Copy 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ということで、二乗して確認ができます。
この回路を実行するとどうなるでしょうか?
Copy Circuit().h[0].z[0].run()
array([ 0.70710678+0.j, -0.70710678+0.j])
これは、
array([ 0.70710678+0.j, -0.70710678+0.j])
となりました。確率振幅と呼ばれる数字にマイナスがついています。これをサンプリングすると、
Copy Circuit().h[0].z[0].m[:].run(shots=100)
Counter({'0': 46, '1': 54})
Counter({'0': 52, '1': 48})
答え自体はプラス状態と見分けがつきません。上記の状態は計算結果としては変わりませんが、計算過程で利用をしたりしますので、今後確認してみたいと思います。
© 2024, blueqat Inc. All rights reserved