common.title

Docs
Quantum Circuit
TYTAN CLOUD

Quantum Apps

Quantum Business Magazine


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


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