common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING

Nobisuke

Dekisugi


autoQAOA
DEEPSCORE

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

<量子位相推定へ至る道?>位相差検出アルゴリズム

量子熊

2021/02/16 12:01

#blueqat

2

位相差検出アルゴリズム

こんにちは。

今回の記事から、量子位相推定アルゴリズムの理解および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='')

本題

以下のような入力量子状態を考えます。

|\psi\rangle = \frac{1}{\sqrt{2}}(|0\rangle+e^{i0}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)

|0\rangle|1\rangleが同位相(位相差0)で重ね合わされています。
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つで良さそうです。

でも桁シフトした結果、溢れた桁はどこへいくのでしょう?? そもそもどうやって桁シフトを実現するのでしょう?

この話は、次の記事に回したいと思います。

© 2025, blueqat Inc. All rights reserved