common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

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='')

本題

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

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

0|0\rangle1|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>

確かに生成できています。

この状態に、アダマールゲートHHを掛けると、以下のようになります。

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

blueqatでは、

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>

もう一つ、異なる入力量子状態を考えてみます。

ψ=12(0+eiπ1)=12(01)|\psi\rangle = \frac{1}{\sqrt{2}}(|0\rangle+e^{i\pi}|1\rangle) = \frac{1}{\sqrt{2}}(|0\rangle-|1\rangle)

0|0\rangle1|1\rangleが逆位相(位相差π\pi)で重ね合わされています。

この状態に、アダマールゲートHHを掛けると、以下のようになります。

Hψ=H(12(0+eiπ1))=1H|\psi\rangle = H(\frac{1}{\sqrt{2}}(|0\rangle+e^{i\pi}|1\rangle)) = |1\rangle

blueqatでも同様の結果を確かめておきます。 入力量子状態は、

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|1\rangleになります。

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>

以上の結果を整理すると

    • 位相差が00であれば、アダマールゲートにより0|0\rangleが検出され、
    • 位相差がπ\piであれば、アダマールゲートにより1|1\rangleが検出される。

となります。

位相の2進小数表示

量子コンピュータ、量子状態といえども、0011かの2進数で数値を表現することに変わりはありません。

位相θ\thetaを2進数で表示することを考えます。特に量子アルゴリズムでは、θ\theta2π2\piで規格化した規格化位相

2進小数で表現することが多いです。

例えば、2進小数1桁表示のときは

    • θ=0\theta=0のとき、θ2π=0\frac{\theta}{2\pi}=0 であるから、θbinary=0.0\theta_{binary} = 0.0と書きます。

    • θ=π\theta=\piのとき、θ2π=12\frac{\theta}{2\pi}=\frac{1}{2} であるから、θbinary=0.1\theta_{binary} = 0.1と書きます。

2進小数2桁表示のときは

    • θ=0\theta=0のとき、θ2π=0\frac{\theta}{2\pi}=0 であるから、θbinary=0.00\theta_{binary} = 0.00

    • θ=π2\theta=\frac{\pi}{2}のとき、θ2π=14\frac{\theta}{2\pi}=\frac{1}{4} であるから、θbinary=0.01\theta_{binary} = 0.01

    • θ=π\theta=\piのとき、θ2π=12\frac{\theta}{2\pi}=\frac{1}{2} であるから、θbinary=0.10\theta_{binary} = 0.10

    • θ=3π2\theta=\frac{3\pi}{2}のとき、θ2π=34\frac{\theta}{2\pi}=\frac{3}{4} であるから、θbinary=0.11\theta_{binary} = 0.11

つまりところ、規格化位相θ2π\frac{\theta}{2\pi}an2n\sum a_{n}2^{-n}と展開した時、2進小数表示は0.a1a2....0.a_{1} a_{2}....のようになります。

位相差検出アルゴリズム(2進小数表示版)

この記法を用いて、先程の位相差検出アルゴリズムを書くと、

Hψ=H(12(0+ei0.j1))=jH|\psi\rangle = H(\frac{1}{\sqrt{2}}(|0\rangle+e^{i*0.j}|1\rangle)) = |j\rangle

このようになります。

(j=0j=0 or 11 であることに注意すると、難しくないです。)

位相差を2進小数表示でみている人にとっては、

HHゲートとは、位相差の1桁目を読み出して1量子ビットの状態に書き写す操作である。

と考えることが出来ます。

2進小数表示の桁数が2桁に増えた場合はどうなるでしょうか?

直感的には、書き出し先の量子ビットを2ビットに増やせばよさそうです。

そして、第一量子ビットには1桁目、第二量子ビットには2桁目を書き込めば良いのでしょう。

あるいは、1桁目読み出し→桁シフト→1桁目読み出し でも良さそうですね。これなら量子ビットは1つで良さそうです。

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

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

© 2024, blueqat Inc. All rights reserved