位相差検出アルゴリズム
こんにちは。
今回の記事から、量子位相推定アルゴリズムの理解およびblueqatでの実装を目標として
いくつか記事を書いてみたいと思います。
今回は位相差検出アルゴリズム(勝手に名付けました)をやってみます。
下準備
from blueqat import Circuit
import math
import numpy as np
状態ベクトルを見やすく加工してprintする関数
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='')
本題
以下のような入力量子状態を考えます。
blueqatで生成してみます。
State_out = Circuit(1).h[0].run()
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>
確かに生成できています。
この状態に、アダマールゲート$H$を掛けると、以下のようになります。
$H|\psi\rangle = H(\frac{1}{\sqrt{2}}(|0\rangle+e^{i0}|1\rangle)) = |0\rangle$
blueqatでは、
```python
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>
もう一つ、異なる入力量子状態を考えてみます。
$|\psi\rangle = \frac{1}{\sqrt{2}}(|0\rangle+e^{i\pi}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle-|1\rangle)$
$|0\rangle$と$|1\rangle$が逆位相(位相差$\pi$)で重ね合わされています。
この状態に、アダマールゲート$H$を掛けると、以下のようになります。
$H|\psi\rangle = H(\frac{1}{\sqrt{2}}(|0\rangle+e^{i\pi}|1\rangle)) = |1\rangle$
blueqatでも同様の結果を確かめておきます。
入力量子状態は、
```python
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>
アダマールゲートを作用させると、$|1\rangle$になります。
```python
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>
以上の結果を整理すると
- 位相差が$0$であれば、アダマールゲートにより$|0\rangle$が検出され、
- 位相差が$\pi$であれば、アダマールゲートにより$|1\rangle$が検出される。
となります。
# 位相の2進小数表示
量子コンピュータ、量子状態といえども、$0$か$1$かの2進数で数値を表現することに変わりはありません。
位相$\theta$を2進数で表示することを考えます。特に量子アルゴリズムでは、$\theta$を$2\pi$で規格化した**規格化位相**を
2進小数で表現することが多いです。
例えば、2進小数1桁表示のときは
- $\theta=0$のとき、$\frac{\theta}{2\pi}=0$ であるから、$\theta_{binary} = 0.0$と書きます。
- $\theta=\pi$のとき、$\frac{\theta}{2\pi}=\frac{1}{2}$ であるから、$\theta_{binary} = 0.1$と書きます。
2進小数2桁表示のときは
- $\theta=0$のとき、$\frac{\theta}{2\pi}=0$ であるから、$\theta_{binary} = 0.00$
- $\theta=\frac{\pi}{2}$のとき、$\frac{\theta}{2\pi}=\frac{1}{4}$ であるから、$\theta_{binary} = 0.01$
- $\theta=\pi$のとき、$\frac{\theta}{2\pi}=\frac{1}{2}$ であるから、$\theta_{binary} = 0.10$
- $\theta=\frac{3\pi}{2}$のとき、$\frac{\theta}{2\pi}=\frac{3}{4}$ であるから、$\theta_{binary} = 0.11$
つまりところ、規格化位相$\frac{\theta}{2\pi}$を$\sum a_{n}2^{-n}$と展開した時、2進小数表示は$0.a_{1} a_{2}....$のようになります。
# 位相差検出アルゴリズム(2進小数表示版)
この記法を用いて、先程の位相差検出アルゴリズムを書くと、
$H|\psi\rangle = H(\frac{1}{\sqrt{2}}(|0\rangle+e^{i*0.j}|1\rangle)) = |j\rangle$
このようになります。
($j=0$ or $1$ であることに注意すると、難しくないです。)
位相差を2進小数表示でみている人にとっては、
**$H$ゲートとは、位相差の1桁目を読み出して1量子ビットの状態に書き写す操作である。**
と考えることが出来ます。
2進小数表示の桁数が2桁に増えた場合はどうなるでしょうか?
直感的には、書き出し先の量子ビットを2ビットに増やせばよさそうです。
そして、第一量子ビットには1桁目、第二量子ビットには2桁目を書き込めば良いのでしょう。
あるいは、1桁目読み出し→桁シフト→1桁目読み出し でも良さそうですね。これなら量子ビットは1つで良さそうです。
でも桁シフトした結果、溢れた桁はどこへいくのでしょう?? そもそもどうやって桁シフトを実現するのでしょう?
この話は、次の記事に回したいと思います。