Nobisuke
Dekisugi
RAG
Privacy policy
2
こんにちは。
今回の記事から、量子位相推定アルゴリズムの理解およびblueqatでの実装を目標として
いくつか記事を書いてみたいと思います。
今回は位相差検出アルゴリズム(勝手に名付けました)をやってみます。
Copy from blueqat import Circuit import math import numpy as np
Copy def print_Zbasis_expression(statevector): nqubit = int(math.log2(np.size(statevector))) for i in range(2**nqubit): print('+({:.2f})*|{number:0{width}b}>'.format(statevector[i],number=i,width=nqubit),end='')
以下のような入力量子状態を考えます。
とが同位相(位相差0)で重ね合わされています。
blueqatで生成してみます。
Copy State_out = Circuit(1).h[0].run()
Copy print_Zbasis_expression(State_out)
+(0.71+0.00j)*|0>+(0.71+0.00j)*|1>
+(0.71+0.00j)|0>+(0.71+0.00j)|1>
確かに生成できています。
この状態に、アダマールゲートを掛けると、以下のようになります。
blueqatでは、
Copy print_Zbasis_expression(Circuit(1).h[0].h[0].run())
+(1.00+0.00j)*|0>+(0.00+0.00j)*|1>
+(1.00+0.00j)|0>+(0.00+0.00j)|1>
もう一つ、異なる入力量子状態を考えてみます。
とが逆位相(位相差)で重ね合わされています。
この状態に、アダマールゲートを掛けると、以下のようになります。
blueqatでも同様の結果を確かめておきます。 入力量子状態は、
Copy print_Zbasis_expression(Circuit(1).x[0].h[0].run())
+(0.71+0.00j)*|0>+(-0.71+0.00j)*|1>
+(0.71+0.00j)|0>+(-0.71+0.00j)|1>
アダマールゲートを作用させると、になります。
Copy print_Zbasis_expression(Circuit(1).x[0].h[0].h[0].run())
+(0.00+0.00j)*|0>+(1.00+0.00j)*|1>
+(0.00+0.00j)|0>+(1.00+0.00j)|1>
以上の結果を整理すると
となります。
量子コンピュータ、量子状態といえども、かかの2進数で数値を表現することに変わりはありません。
位相を2進数で表示することを考えます。特に量子アルゴリズムでは、をで規格化した規格化位相を
2進小数で表現することが多いです。
例えば、2進小数1桁表示のときは
のとき、 であるから、と書きます。
のとき、 であるから、と書きます。
2進小数2桁表示のときは
のとき、 であるから、
のとき、 であるから、
のとき、 であるから、
のとき、 であるから、
つまりところ、規格化位相をと展開した時、2進小数表示はのようになります。
この記法を用いて、先程の位相差検出アルゴリズムを書くと、
このようになります。
( or であることに注意すると、難しくないです。)
位相差を2進小数表示でみている人にとっては、
ゲートとは、位相差の1桁目を読み出して1量子ビットの状態に書き写す操作である。
と考えることが出来ます。
2進小数表示の桁数が2桁に増えた場合はどうなるでしょうか?
直感的には、書き出し先の量子ビットを2ビットに増やせばよさそうです。
そして、第一量子ビットには1桁目、第二量子ビットには2桁目を書き込めば良いのでしょう。
あるいは、1桁目読み出し→桁シフト→1桁目読み出し でも良さそうですね。これなら量子ビットは1つで良さそうです。
でも桁シフトした結果、溢れた桁はどこへいくのでしょう?? そもそもどうやって桁シフトを実現するのでしょう?
この話は、次の記事に回したいと思います。
Copy
© 2024, blueqat Inc. All rights reserved