🐈

グローバーのアルゴリズム

2021/06/10に公開

やりたいこと

探索問題を考える.探索問題では,入力が正解なら1を,不正解なら0を返すような関数(オラクル)f(x)を考える:

f(\text{正解})=1,\quad f(\text{不正解})=0

探索問題では,入力を複数回試した時,何回目に正解が求まるかが重要となる.入力を複数回試すということは,オラクルを複数回用いるということである.量子アルゴリズムでは,

|x\rangle|q\rangle \stackrel{U_{f}}{\longrightarrow}|x\rangle|q \oplus f(x)\rangle

というユニタリ演算子U_fを何回用いるかで,計算量を評価する.

位相オラクル

wが求めたい答えであるとき,

f_w(x)=\left\{\begin{array}{ll} 1 & (x=w) \\ 0 & (x\neq w) \end{array}\right.

という関数(オラクル)を考える.これに対して,

U_w|x\rangle=(-1)^{f_w(x)}|x\rangle

を満たすユニタリ演算子を考える.このユニタリ演算子は次のように書ける.

U_w=I-2|w\rangle\langle w|

グローバーのアルゴリズム

n量子ビットを考える(N=2^n).初期状態は重ね合わせの状態にする.

|s\rangle=H^{\otimes n}|0\rangle^{\otimes n}=\frac{1}{\sqrt{N}} \sum_{x=0}^{N-1}|x\rangle

|s\rangle|w\rangleとこれに直交する状態\left|w^{\perp}\right\rangle:=\frac{1}{\sqrt{N-1}} \sum_{x \neq w}|x\rangleの線形和で表せる.

\begin{aligned} |s\rangle &=\sqrt{\frac{N-1}{N}}\left|w^{\perp}\right\rangle+\frac{1}{\sqrt{N}}|w\rangle \\ &=: \cos \frac{\theta}{2}\left|w^{\perp}\right\rangle+\sin \frac{\theta}{2}|w\rangle \end{aligned}

ただし,\theta=2 \arcsin \frac{1}{\sqrt{\bar{N}}}である.この|w\rangleの振幅を大きくすれば答えを得る確率が高くなる.

そのために,まず(\mathrm{i})位相オラクルU_wを作用させる.

U_w|s\rangle=\cos \frac{\theta}{2}\left|w^{\perp}\right\rangle-\sin \frac{\theta}{2}|w\rangle

次に,(\mathrm{ii})以下で定義されるユニタリ演算子U_sを作用させる.

U_{s}=2|s\rangle\langle s|-I=\cos \theta(\left|w^{\perp}\right\rangle\left\langle w^{\perp}\right|-\left|w\right\rangle\left\langle w\right|)+\sin \theta(|w\rangle\left\langle w^{\perp}\right|+|w^\perp\rangle\left\langle w\right|)

すると,

U_sU_w|s\rangle=\cos \frac{3\theta}{2}\left|w^{\perp}\right\rangle+\sin \frac{3\theta}{2}|w\rangle

となる.この(\mathrm{i}),(\mathrm{ii})r回繰り返すことで,\frac{\theta}{2}\to\frac{2r+1}{2}\thetaとなる(図形的な考察は例えば[1]).ここで,\frac{2r+1}{2}\thetaがおおよそ\pi/2となれば |w\rangleの振幅が大きくなり答えを得る確率が高くなる. よって,この等式が成り立つ程度にr回繰り返せば良い.

計算量としては,\thetaが十分小さければ,

\sin\frac{\theta}{2}=\frac{1}{\sqrt{N}}\simeq\frac{\theta}{2}\Rightarrow r=\mathcal{O}(\sqrt{N})

となることが分かる.

実際のプログラムは例えば[1:1]を参照.

脚注
  1. https://utokyo-icepp.github.io/qc-workbook/grover.html ↩︎ ↩︎

Discussion