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

グローバーのアルゴリズムとは、N個の要素をもつ未整序データベースの中から指定された値を検索する探索問題を解くための量子コンピュータのアルゴリズムであり、O(N1/2)のオーダーの計算量と、O(logN)のオーダー（ランダウの記号も参照）の記憶領域を消費する。1996年にロブ・グローバー（英語版）によって開発された。 典型的には、未整序データベースからの探索は、O(N)の計算時間を要する線型探索を用いなければならない。グローバーのアルゴリズムは、O(N1/2)の計算時間しか消費せず、未整序データベース探索を行う量子アルゴリズムの中で最も速い。 このアルゴリズムは他の量子アルゴリズムがしばしば、古典アルゴリズムと比較して指数的な速度向上をもたらすのとは異なり、二次の速度向上しかもたらさない。しかし、Nが大きければ、二次の向上でもかなりの向上となる。たとえば、グローバーのアルゴリズムを共通鍵暗号の総当り攻撃に利用すると、128ビット鍵であれば264の繰り返しで、256ビット鍵であれば2128の繰り返しで求めることができる。このため、将来の量子総当り攻撃に対して安全性を持たせるために、鍵長を2倍にすることが提案されている。 他の量子アルゴリズムと同じように、グローバーのアルゴリズムは正しい確率の高い解を与える、確率的アルゴリズムである。この解が正しくない確率は、このアルゴリズムを繰り返すことによって減少させることができる（確率的アルゴリズムでない、正しい確率が1の解を与える、決定的アルゴリズムについてはドイッチュ・ジョサのアルゴリズムを参照）。 グローバーのアルゴリズムの目的は普通「データベース探索」とされるが、「逆関数の導出」と言うとより正確かもしれない。おおざっぱにいうと、y=f(x)という量子コンピュータで処理できる関数があったとして、このアルゴリズムを使うとあるyを与えるxの値を計算することができる。データベース探索は、データベースをインデックスxに対してデータyを与える関数と考えれば、逆関数を求めることと同値である。 グローバーのアルゴリズムは、平均と中央値を推定すること、また衝突問題（w:Collision problem）を解くのにも使える。また、可能性のある解を総当たりで探すことによってNP完全問題を解くことにも使える。これは、膨大な可能性を試すのに、重ね合わせを用いることで限られた計算量しか消費しないので、古典アルゴリズムに比べてかなりのスピードアップを見込めるが、指数時間かかってしまうことは変らない。あらかじめ解が複数あることとその個数がわかっている場合、このアルゴリズムはさらに高速化することができる。 N個のデータを持つデータベースを考える。データベースの中から、何らかの検索条件を満たすデータを探し出す問題を考えよう。 グローバーのアルゴリズムは、 N {\displaystyle N} 次元の状態空間 H {\displaystyle {\mathcal {H}}} を必要とする。これは n = ⌈ log 2 ⁡ N ⌉ {\displaystyle n=\lceil \log _{2}N\rceil } 量子ビットあれば満され、基底状態は | 1 ⟩ , | 2 ⟩ , … , | N ⟩ {\displaystyle |1\rangle ,|2\rangle ,\ldots ,|N\rangle } と書ける。これらの固有値 { λ 1 , λ 2 , ⋯ , λ N } {\displaystyle \{\lambda _{1},\lambda _{2},\cdots ,\lambda _{N}\}} は全て異なるとする。 f {\displaystyle f} を、データベースのインデクス x ∈ { 1 , 2 , … , N } {\displaystyle x\in \{1,2,\ldots ,N\}} を入力すると、検索条件を満たしているか否かを判定する関数とする。例えば、値 v {\displaystyle v} に対して D [ x ] = v {\displaystyle D[x]=v} となる x {\displaystyle x} を探したい場合には、 { f ( x ) = 1  if  D [ x ] = v , f ( x ) = 0  if  D [ x ] ≠ v {\displaystyle {\begin{cases}f(x)=1&{\text{ if }}D[x]=v,\\f(x)=0&{\text{ if }}D[x]\neq v\end{cases}}} である。以下では ω {\displaystyle \omega } を、 f ( ω ) = 1 {\displaystyle f(\omega )=1} を満たす値とし、次のようにふるまうユニタリ演算子 U ω {\displaystyle U_{\omega }} を自由にサブルーチンとして使えるとする。（このサブルーチンは、オラクルとも呼ばれる。） { U ω | x ⟩ = − | x ⟩ for  x = ω , that is  f ( x ) = 1 U ω | x ⟩ = | x ⟩ for  x ≠ ω , that is  f ( x ) = 0 {\displaystyle {\begin{cases}U_{\omega }|x\rangle =-|x\rangle &{\text{for }}x=\omega {\text{, that is }}f(x)=1\\U_{\omega }|x\rangle =|x\rangle &{\text{for }}x\neq \omega {\text{, that is }}f(x)=0\end{cases}}} アルゴリズムの目的は、インデクス | ω ⟩ {\displaystyle |\omega \rangle } を特定することである。 なお、（下に示す量子回路のように）補助量子ビットシステムを使う場合には、演算子 U ω {\displaystyle U_{\omega }} の定義は異なるものになる。この場合の演算子は、メインシステムの f ( x ) {\displaystyle f(x)} の値（０か１）に応じて反転させる制御NOTによって { U ω | x ⟩ | y ⟩ = | x ⟩ | ¬ y ⟩ for  x = ω , that is  f ( x ) = 1 , U ω | x ⟩ | y ⟩ = | x ⟩ | y ⟩ for  x ≠ ω , that is  f ( x ) = 0 , {\displaystyle {\begin{cases}U_{\omega }|x\rangle |y\rangle =|x\rangle |\neg y\rangle &{\text{for }}x=\omega {\text{, that is }}f(x)=1,\\U_{\omega }|x\rangle |y\rangle =|x\rangle |y\rangle &{\text{for }}x\neq \omega {\text{, that is }}f(x)=0,\end{cases}}} あるいは、 U ω | x ⟩ | y ⟩ = | x ⟩ | y ⊕ f ( x ) ⟩ . {\displaystyle U_{\omega }|x\rangle |y\rangle =|x\rangle |y\oplus f(x)\rangle .} で表現される。 | s ⟩ {\displaystyle |s\rangle } を、全ての状態の一様な重ね合わせ | s ⟩ = 1 N ∑ x = 0 N − 1 | x ⟩ {\displaystyle |s\rangle ={\frac {1}{\sqrt {N}}}\sum _{x=0}^{N-1}|x\rangle } とし、演算子 U s {\displaystyle U_{s}} を U s = 2 | s ⟩ ⟨ s | − I {\displaystyle U_{s}=2\left|s\right\rangle \left\langle s\right|-I} とする。この演算子は、グローバーの拡散演算子と呼ばれている。 グローバーのアルゴリズムの流れは以下の通りである。 初期状態を以下の様に用意する： | s ⟩ = 1 N ∑ x = 1 N | x ⟩ {\displaystyle |s\rangle ={\frac {1}{\sqrt {N}}}\sum _{x=1}^{N}|x\rangle } 次にしめす"Grover iteration"を r ( N ) {\displaystyle r(N)} 回繰返す。関数 r ( N ) {\displaystyle r(N)} は漸近的に O ( N ) {\displaystyle O({\sqrt {N}})} である関数であり、詳細は後述する。 演算子 U ω {\displaystyle U_{\omega }} を適用する。 演算子 U s {\displaystyle U_{s}} を適用する。 状態Ωを観測する。観測の結果は、Nが十分に大きければ、1に近い確率でλωとなり、 ω {\displaystyle \omega } を得ることができる。 演算子 U s {\displaystyle U_{s}} は U s = 2 | s ⟩ ⟨ s | − I , {\displaystyle U_{s}=2|s\rangle \langle s|-I,} で定義されており、さらに、演算子 U ω {\displaystyle U_{\omega }} は次のように書くことができることに注意する。 U ω = I − 2 | ω ⟩ ⟨ ω | {\displaystyle U_{\omega }=I-2|\omega \rangle \langle \omega |} これを確認するには、 I − 2 | ω ⟩ ⟨ ω | {\displaystyle I-2|\omega \rangle \langle \omega |} が基底状態に対してどのように作用するかをチェックしてみればよい。 ( I − 2 | ω ⟩ ⟨ ω | ) | ω ⟩ = | ω ⟩ − 2 | ω ⟩ ⟨ ω | ω ⟩ = − | ω ⟩ = U ω | ω ⟩ ( I − 2 | ω ⟩ ⟨ ω | ) | x ⟩ = | x ⟩ − 2 | ω ⟩ ⟨ ω | x ⟩ = | x ⟩ = U ω | x ⟩ ∀ x ≠ ω {\displaystyle {\begin{aligned}(I-2|\omega \rangle \langle \omega |)|\omega \rangle &=|\omega \rangle -2|\omega \rangle \langle \omega |\omega \rangle =-|\omega \rangle =U_{\omega }|\omega \rangle \\(I-2|\omega \rangle \langle \omega |)|x\rangle &=|x\rangle -2|\omega \rangle \langle \omega |x\rangle =|x\rangle =U_{\omega }|x\rangle &&\forall x\neq \omega \end{aligned}}} さらに、 | ω ⟩ {\displaystyle |\omega \rangle } は基底状態で、 | s ⟩ {\displaystyle |s\rangle } は全ての状態の一様な重ね合わせであるから、 ⟨ ω | s ⟩ = ⟨ s | ω ⟩ = 1 N , ⟨ s | s ⟩ = N 1 N ⋅ 1 N = 1 {\displaystyle {\begin{aligned}\langle \omega |s\rangle &=\langle s|\omega \rangle ={\tfrac {1}{\sqrt {N}}},\\\langle s|s\rangle &=N{\tfrac {1}{\sqrt {N}}}\cdot {\tfrac {1}{\sqrt {N}}}=1\end{aligned}}} が成り立つ。したがって、1回目の繰り返しでは次にように計算される。 U ω | s ⟩ = ( I − 2 | ω ⟩ ⟨ ω | ) | s ⟩ = | s ⟩ − 2 | ω ⟩ ⟨ ω | s ⟩ = | s ⟩ − 2 N | ω ⟩ , U s ( | s ⟩ − 2 N | ω ⟩ ) = ( 2 | s ⟩ ⟨ s | − I ) ( | s ⟩ − 2 N | ω ⟩ ) = 2 | s ⟩ ⟨ s | s ⟩ − | s ⟩ − 4 N | s ⟩ ⟨ s | ω ⟩ + 2 N | ω ⟩ = 2 | s ⟩ − | s ⟩ − 4 N ⋅ 1 N | s ⟩ + 2 N | ω ⟩ = N − 4 N | s ⟩ + 2 N | ω ⟩ . {\displaystyle {\begin{aligned}U_{\omega }|s\rangle &=(I-2|\omega \rangle \langle \omega |)|s\rangle =|s\rangle -2|\omega \rangle \langle \omega |s\rangle =|s\rangle -{\tfrac {2}{\sqrt {N}}}|\omega \rangle ,\\U_{s}\left(|s\rangle -{\tfrac {2}{\sqrt {N}}}|\omega \rangle \right)&=\left(2|s\rangle \langle s|-I\right)\left(|s\rangle -{\tfrac {2}{\sqrt {N}}}|\omega \rangle \right)=2|s\rangle \langle s|s\rangle -|s\rangle -{\tfrac {4}{\sqrt {N}}}|s\rangle \langle s|\omega \rangle +{\tfrac {2}{\sqrt {N}}}|\omega \rangle \\&=2|s\rangle -|s\rangle -{\tfrac {4}{\sqrt {N}}}\cdot {\tfrac {1}{\sqrt {N}}}|s\rangle +{\tfrac {2}{\sqrt {N}}}|\omega \rangle \\&={\tfrac {N-4}{N}}|s\rangle +{\tfrac {2}{\sqrt {N}}}|\omega \rangle .\end{aligned}}} 分かりやすい例として、 N {\displaystyle N} が4で、条件を満たす（つまり f ( ω ) = 1 {\displaystyle f(\omega )=1} を満たす） ω {\displaystyle \omega } が一つしかない場合を考えてみると、 U s U w | s ⟩ = | ω ⟩ {\displaystyle U_{s}U_{w}|s\rangle =|\omega \rangle } となり、Grover iterator を一回作用させただけで目的の状態を得ることができることが分かる。 一般の場合では、 U ω {\displaystyle U_{\omega }} と U s {\displaystyle U_{s}} を作用させることで、目的の状態の二乗振幅は | ⟨ ω | s ⟩ | 2 = 1 N {\displaystyle \left|\langle \omega |s\rangle \right|^{2}={\tfrac {1}{N}}} から | ⟨ ω | U s U ω | s ⟩ | 2 = | 1 N ⋅ N − 4 N + 2 N | 2 = ( 3 N − 4 ) 2 N 3 = 9 ( 1 − 4 3 N ) 2 ⋅ 1 N {\displaystyle \left|\langle \omega |U_{s}U_{\omega }|s\rangle \right|^{2}=\left|{\tfrac {1}{\sqrt {N}}}\cdot {\tfrac {N-4}{N}}+{\tfrac {2}{\sqrt {N}}}\right|^{2}={\tfrac {(3N-4)^{2}}{N^{3}}}=9\left(1-{\tfrac {4}{3N}}\right)^{2}\cdot {\tfrac {1}{N}}} に増加する。 |s>と|ω>で張られる空間を考える。この平面は、 | ω ⟩ {\displaystyle |\omega \rangle } と，それと直交する | s ′ ⟩ = 1 N − 1 ∑ x ≠ ω | x ⟩ {\displaystyle \textstyle |s'\rangle ={\frac {1}{\sqrt {N-1}}}\sum _{x\neq \omega }|x\rangle } で張られる空間と等しい。 初期状態 | s ⟩ {\displaystyle |s\rangle } に作用する最初の繰り返しを考えよう。 | ω ⟩ {\displaystyle |\omega \rangle } は基底ベクトルであるから、 | s ⟩ {\displaystyle |s\rangle } と | s ′ ⟩ {\displaystyle |s'\rangle } の重なりは次のようになる。 ⟨ s ′ | s ⟩ = N − 1 N {\displaystyle \langle s'|s\rangle ={\sqrt {\frac {N-1}{N}}}} 幾何学的に言えば、 | s ⟩ {\displaystyle |s\rangle } と | s ′ ⟩ {\displaystyle |s'\rangle } のなす角度 θ / 2 {\displaystyle \theta /2} は次の関係を満す。 sin ⁡ θ 2 = 1 N {\displaystyle \sin {\frac {\theta }{2}}={\frac {1}{\sqrt {N}}}} 演算子Uωは、|s>と|ω>で張られる空間を、|ω>と垂直な超平面を対称面として反転させる。つまり、空間上のベクトルを、 | s ′ ⟩ {\displaystyle |s'\rangle } に対して対称なベクトルへ移す。演算子Usは、|s>を対称面とする反転である。よって、|s>と|ω>によって張られる平面上にあるベクトルは、UsとUω で演算されても、その平面上に留まる。また、Grover iterationUsUωの各繰り返しで、状態ベクトルは |ω> に向かって角度 θ = 2 arcsin ⁡ 1 N ≈ 2 1 N {\displaystyle \theta =2\arcsin {\tfrac {1}{\sqrt {N}}}\approx 2{\tfrac {1}{\sqrt {N}}}} の回転をすることが容易に分かる。 状態ベクトルが|ω>に近付いたなら、繰返しを止めなければならない。繰返しを重ねすぎると、状態ベクトルは|ω>から離れていってしまい、正しい解を与える確率を下げてしまう。 r {\displaystyle r} 回繰り返した場合に正しい答えが観測される確率は、 sin 2 ⁡ ( ( r + 1 2 ) θ ) {\displaystyle \sin ^{2}\left({\Big (}r+{\frac {1}{2}}{\Big )}\theta \right)} である。したがって、ほぼ最適な測定が得られる繰り返し回数は r ≈ π N / 4 {\displaystyle r\approx \pi {\sqrt {N}}/4} である。 代数的な解析をするには、 U s U ω {\displaystyle U_{s}U_{\omega }} を繰り返し適用したときに何が起こるかを見る必要がある。これは、行列の固有値解析によって見ることができる。アルゴリズムの計算の間、状態は常に s {\displaystyle s} と ω {\displaystyle \omega } の線形結合で表されるいることに注意する。そこで、 { | s ⟩ , | ω ⟩ } {\displaystyle \{|s\rangle ,|\omega \rangle \}} によって張られる空間において、 U s {\displaystyle U_{s}} と U ω {\displaystyle U_{\omega }} の動作は次のように表すことができる。 U s : a | ω ⟩ + b | s ⟩ ↦ [ | ω ⟩ | s ⟩ ] [ − 1 0 2 / N 1 ] [ a b ] {\displaystyle U_{s}:a|\omega \rangle +b|s\rangle \mapsto [|\omega \rangle \,|s\rangle ]{\begin{bmatrix}-1&0\\2/{\sqrt {N}}&1\end{bmatrix}}{\begin{bmatrix}a\\b\end{bmatrix}}} U ω : a | ω ⟩ + b | s ⟩ ↦ [ | ω ⟩ | s ⟩ ] [ − 1 − 2 / N 0 1 ] [ a b ] {\displaystyle U_{\omega }:a|\omega \rangle +b|s\rangle \mapsto [|\omega \rangle \,|s\rangle ]{\begin{bmatrix}-1&-2/{\sqrt {N}}\\0&1\end{bmatrix}}{\begin{bmatrix}a\\b\end{bmatrix}}} よって、 { | ω ⟩ , | s ⟩ } {\displaystyle \{|\omega \rangle ,|s\rangle \}} を基底とすると（ただし，これらは直交していないし、全体の空間の基底にはなっていない）、 U ω {\displaystyle U_{\omega }} を作用させてから U s {\displaystyle U_{s}} を作用させるという動作 U s U ω {\displaystyle U_{s}U_{\omega }} は、次の行列で表せる。 U s U ω = [ − 1 0 2 / N 1 ] [ − 1 − 2 / N 0 1 ] = [ 1 2 / N − 2 / N 1 − 4 / N ] {\displaystyle U_{s}U_{\omega }={\begin{bmatrix}-1&0\\2/{\sqrt {N}}&1\end{bmatrix}}{\begin{bmatrix}-1&-2/{\sqrt {N}}\\0&1\end{bmatrix}}={\begin{bmatrix}1&2/{\sqrt {N}}\\-2/{\sqrt {N}}&1-4/N\end{bmatrix}}} この行列は、非常に便利なジョルダン標準形をしている。 t = arcsin ⁡ ( 1 / N ) {\displaystyle t=\arcsin(1/{\sqrt {N}})} と定義すれば、 U s U ω = M [ exp ⁡ ( 2 i t ) 0 0 exp ⁡ ( − 2 i t ) ] M − 1 {\displaystyle U_{s}U_{\omega }=M{\begin{bmatrix}\exp(2it)&0\\0&\exp(-2it)\end{bmatrix}}M^{-1}} where M = [ − i i exp ⁡ ( i t ) exp ⁡ ( − i t ) ] {\displaystyle M={\begin{bmatrix}-i&i\\\exp(it)&\exp(-it)\end{bmatrix}}} と書ける。 これにより、この行列の r 乗（r 回の繰り返しに対応する）は、 ( U s U ω ) r = M [ exp ⁡ ( 2 r i t ) 0 0 exp ⁡ ( − 2 r i t ) ] M − 1 {\displaystyle (U_{s}U_{\omega })^{r}=M{\begin{bmatrix}\exp(2rit)&0\\0&\exp(-2rit)\end{bmatrix}}M^{-1}} となる。この形式を使えば、三角関数の公式を使って、r 回の繰り返しの後に目的の ω {\displaystyle \omega } が観測される確率を | [ ⟨ ω | ω ⟩ ⟨ ω | s ⟩ ] ( U s U ω ) r [ 0 1 ] | 2 = sin 2 ⁡ ( ( 2 r + 1 ) t ) {\displaystyle \left|{\begin{bmatrix}\langle \omega |\omega \rangle &\langle \omega |s\rangle \end{bmatrix}}(U_{s}U_{\omega })^{r}{\begin{bmatrix}0\\1\end{bmatrix}}\right|^{2}=\sin ^{2}\left((2r+1)t\right)} と計算することができる。（幾何学的な解析で得た確率と同じ。） あるいは、最適な繰り返し回数は、角度 2 r t {\displaystyle 2rt} と − 2 r t {\displaystyle -2rt} が最も離れているときであり、これは 2 r t ≈ π / 2 {\displaystyle 2rt\approx \pi /2} に対応する、と考えてもよい。つまり、 r = π / 4 t = π / 4 arcsin ⁡ ( 1 / N ) ≈ π N / 4 {\displaystyle r=\pi /4t=\pi /4\arcsin(1/{\sqrt {N}})\approx \pi {\sqrt {N}}/4} が得られる。このとき、システムは [ | ω ⟩ | s ⟩ ] ( U s U ω ) r [ 0 1 ] ≈ [ | ω ⟩ | s ⟩ ] M [ i 0 0 − i ] M − 1 [ 0 1 ] = | ω ⟩ 1 cos ⁡ ( t ) − | s ⟩ sin ⁡ ( t ) cos ⁡ ( t ) {\displaystyle [|\omega \rangle \,|s\rangle ](U_{s}U_{\omega })^{r}{\begin{bmatrix}0\\1\end{bmatrix}}\approx [|\omega \rangle \,|s\rangle ]M{\begin{bmatrix}i&0\\0&-i\end{bmatrix}}M^{-1}{\begin{bmatrix}0\\1\end{bmatrix}}=|\omega \rangle {\frac {1}{\cos(t)}}-|s\rangle {\frac {\sin(t)}{\cos(t)}}} の状態で終了する。 少し計算すれば、観測によって（エラー確率 O(1/N) を除き）正しい答え ω {\displaystyle \omega } が得られることがわかる。 もし、探索条件にあうデータが1個だけでなく、k個存在するならば、同じアルゴリズムを適用できるが、繰返し回数はπN1/2/4の代わりにπ(N/k)1/2/4としなければならない。 kが未知の場合を取り扱う方法は幾つかある。例として、繰返し回数を以下のようにしてグローバーのアルゴリズムを何回か走らせる方法がある。 π N 1 / 2 4 , π ( N / 2 ) 1 / 2 4 , π ( N / 4 ) 1 / 2 4 , … {\displaystyle \pi {\frac {N^{1/2}}{4}},\pi {\frac {(N/2)^{1/2}}{4}},\pi {\frac {(N/4)^{1/2}}{4}},\ldots } kがどのような値でも、上のような繰返し回数で行えば正しい解を高い確率で得られる。繰返しの総回数は多くとも次のようであり、O(N1/2)のオーダーにとどまる。 π N 1 / 2 4 ( 1 + 1 2 + 1 2 + ⋯ ) {\displaystyle \pi {\frac {N^{1/2}}{4}}\left(1+{\frac {1}{\sqrt {2}}}+{\frac {1}{2}}+\cdots \right)} このアルゴリズムは改良の余地がある。kが未知であるとして、 O ( N k ) 1 / 2 {\displaystyle O({\frac {N}{k}})^{1/2}} のオーダーで解を見付けることができる。このことから、このアルゴリズムは衝突問題を解く目的で使用できる。 グローバーのアルゴリズムは最適であることが知られている。つまり、データベースにUωのみを用いてアクセスするようなどんなアルゴリズムも、グローバーのアルゴリズムと同じかそれ以上の回数だけUωを作用させなければならない。この結果は量子計算の限界を理解する上で重要である。 もし、グローバーの探索問題がlogcN回Uω適用することで解くことができるとすれば、NP問題をグローバーの探索問題に帰着させることで、NPがBQPに含まれることが示される。グローバーのアルゴリズムが最適であることは、NPはBQPに含まれないことを示唆している（ただし証明しているわけではない）。 k個の条件に該当するデータがある場合、π(N/k)1/2/4も最適である。 このアルゴリズムにおいては、データベースは明示的に表されておらず、代わりに、インデクスによってデータで評価するためにオラクルを呼び出す。データベース全体をデータごとに読み込み、それをインデクスを使って評価できる形式に変換することは、グローバーの検索よりもはるかに時間がかかる場合がある。これを考えると、グローバーのアルゴリズムは、方程式や制約充足問題を解くための方法であると見ることができる。このようなアプリケーションでは、オラクルは制約を満たすかどうかをチェックする方法であり、検索アルゴリズムとは無関係に動作する。一方、従来の検索アルゴリズムでは、検索アルゴリズムを制約のチェック方法と合わせて考慮することで総当たりを回避して最適化を行うことが良くある。グローバーのアルゴリズムではこれらが分離しているため、アルゴリズムの最適化が妨げられる。グローバーのアルゴリズムの使用に関するこれらおよびその他の考慮事項は、Viamontes、Markov、およびHayesによる論文で説明されている。 en:Amplitude amplification Grover L.K.: A fast quantum mechanical algorithm for database search, Proceedings, 28th Annual ACM Symposium on the Theory of Computing, (May 1996) p. 212 Grover L.K.: From Schrödinger's equation to quantum search algorithm, American Journal of Physics, 69(7): 769-777, 2001. Pedagogical review of the algorithm and its history. http://www.bell-labs.com/user/feature/archives/lkgrover/ http://arxiv.org/abs/quant-ph/0301079 Grover's Algorithm: Quantum Database Search Grover's algorithm on arxiv.org