Grover アルゴリズムについて

はじめに TL; DR;

このノートは, ある量子コンピューターの勉強会向けに作成したものです.
Qiita の Advent Calendar 2017 の 12/1 のエントリ記事です.

目次 内容
Grover アルゴリズムの概要 アルゴリズムの大まかな全容を説明してます.
Grover’s Search Algorithm の数理 アルゴリズムの数理的なお話しです.
IBM Q を使って検証 IBMの量子コンピューター IBM Q を使った具体例です.
(Rigetti製) pyquil を使って検証 量子コンピューターベンチャーのオープンソースライブラリを使った具体例です.
書籍紹介 量子コンピューター関連の書籍紹介です.
付録: sympy で
Grover アルゴリズムを計算してみましょう
pythonの sympy ライブラリを使った具体例です.

Grover アルゴリズムの概要

1996, Lov Grover, “A fast quantum mechanical algorithm for database search” quant-ph/9605043

Imagine a phone directory containing N names arranged in completely random order. In order to find someone’s phone number with a 50% probability, any classical algorithm (whether deterministic or probabilistic) will need to look at a minimum of N/2 names. Quantum mechanical systems can be in a superposition of states and simultaneously examine multiple names. By properly adjusting the phases of various operations, successful computations reinforce each other while others interfere randomly. As a result, the desired phone number can be obtained in only O(sqrt(N)) steps. The algorithm is within a small constant factor of the fastest possible quantum mechanical algorithm.

完全にランダムな順序で並べられたN個の名前を含む電話帳を想像してみてください. 50%の確率で誰かの電話番号を見つけるためには, 古典的なアルゴリズム(決定論的であろうと確率的であろうと)は, 少なくとも N/2 名を見る必要があります. 量子力学的システムでは, 状態の重ね合わせにあり, 複数の名前を同時に調べることができます. さまざまな操作のフェーズを適切に調整することによって, 成功した計算は互いに強化し, 他はランダムに干渉します. その結果, 所望している電話番号は O(N ステップだけで計算できます. このアルゴリズムは, 最も高速な量子力学アルゴリズムの定数倍の範囲の計算速度です.

グローバー自身が論文の abstracts で示しているとおり, グローバーアルゴリズムの用例として, 「整列化されていないアドレス帳から, 知り合いの携帯番号を探す」のに使われると,
一般的には「データベースの探索」と説明されています.
しかし, この具体例を想像しながらこのアルゴリズムを学ぶと, 少し戸惑うかもしれません. グローバーアルゴリズムは, 「逆関数の導出」と言うほうがより正確かもしれません.

すなわち, 量子コンピューターで処理できる関数 y=f(x) があるとき, グローバーアルゴリズムを使うと, ある y を与える x の値を計算することができます.

例えば, 重ね合わせられた量子状態 ψ が特定の状態 x を含んでいる場合には, 1 を返し, 含まない場合は 0 を返すような関数 f(x,ψ) を考えたとき,
x=ϕ の答え f(ϕ,ψ)0 か, 1 かを判定するときに, 使える最も効率的な量子アルゴリズム. これがグローバーアルゴリズムです.

4-qubit の例 :

ψ=α|0000+β|0001+γ|0010+

のような ψ に, ϕ=|0101 が, 含まれるかどうかを調べる問題がこのアルゴリズムの対象です.

それでは, Grover アルゴリズムの特徴をみていきましょう.
Grover アルゴリズムは, 振幅増幅手法と呼ばれる操作を行い, 目的の値 x を検出します.

  振幅増幅手法 [Amplitude Amplification] :  
  欲しい解の確率振幅をマイナスにマーキングし, 全確率振幅の平均値の周りで逆転させる. 

2-qubit の例 :

      |ϕ=12(|00+|01+|10+|11) という重ね合わせられた量子ビットがあるときに, この中から |10 を探したいという問題とします.

手順1) 欲しい解の確率振幅をマイナスにマーキング

      |ϕmarked=12(|00+|01|10+|11)

手順2) 全確率振幅の平均値の周りで逆転

     マーキングされた状態の全確率振幅 α は, (12+1212+12)/4=14 です.

     |ϕmarked=(1412+14)|00+(1412+14)|01+(14+12+14)|10+(1412+14)|11=|10

     この状態 |ϕmarked を観測すると, |10 の確率が 1 となり, |10 の状態を探しだすことができます.

2-qubit では, この手順1), 2)を1回行えば, マーキングされた量子状態の確率振幅が 1 になりますが, N-qubit のときには, この方法を反復してマーキングした振幅を増幅します.

また, 問題の初期量子状態に探したい状態がわずかな確率で含まれている場合でも, 次の例のように, この手法は有効に作用します.

2-qubit の例(わずかな確率で検索対象が含まれている例) :

 (問題) |ϕ=40031201|00+40031201|01+491201|10+40031201|11

      |ϕ=0.0407|10+0.5768(|00+|01+|11)

      問題の |10 の確率は, (0.0407)20.166%

 (手順1)|ϕmarked=40031201|00+40031201|01491201|10+40031201|11

      全確率振幅平均は, α=12003491201×4

 (手順2)|ϕmarked=4003491201×2|00+4003491201×2|01+12003+491201×2|10+4003491201×2|11

      |ϕmarked=12003+491201×2|10+4003491201×2(|00+|01+|11)

      |ϕmarked=0.8857|10+0.2680(|00+|01+|11)

      操作後の |10 の確率は, (0.8857)278.44%

Grover’s Search Algorithm の数理

f(x):={1(x=z)0(xz),xZ を考えるとき, 次の 2 つのオペレーター行列を考えます.

【オペレーター Rf :選択的回転】
      Rf(m,n):=eiπf(x)δmn=(1)f(x)δmn=I2|zz|

【オペレーター D :平均値まわりの反転】
      D:=I+2|ϕ0ϕ0|
      ここでの, |ϕ0=1Nx=0N1|x

ここで, 選択的回転 Rf と, 平均値まわりの反転 D の合成を考えると,

      Uf:=DRf=(I+2|ϕ0ϕ0|)(I2|zz|)

これを, 状態 |ϕ:=x=0N1wx|x ここで, (x=0N1|wx|2=1) に施すと,

状態 |ϕ は, 次で示す状態に遷移します.

      Uf|ϕ=x=0,xzN1(2w¯wx)|x+(2w¯+wz)|z

すなわち, 目的の |z の確率振幅が増加し, それ以外の |x,(xz) では確率振幅が減少します.
目的の |z の確率振幅が十分に大きくなるまで, この操作 Uf を繰り返します.

反復回数についての考察

次に, どの程度の回数を繰り返せばよいかを考察します.
操作 Uf を繰り返す回数を k として, k 回の Uf の操作をまとめて, Ufk とおきます.

ここで, |ϕ として, 平均値まわりの反転のときに使った |ϕ0 を考えてみます.
状態 |ϕ0Ufk を施すと,

sinθ=1N,cosθ=11N とおいて,

      Ufk|ϕ0=sin((2k+1)θ)|z+xzN11N1cos((2k+1)θ)|x

となります.

m:=π4θ とおき, Ufm 回施して観測したときに期待どおりの結果が得られる確率 Pc とすると,

      Pc11N

で抑えられ, このとき,

      m=O(N

です.


具体的な例として「|ϕ=12(|00+|01+|10+|11) で表された量子ビット状態があるときに, この中から |11 を探したい」という問題を考えます.

手順1)欲しい解の確率振幅をマイナスにマーキング

      CZ(ControlledZ) オペレータを作用させれば, |11 の符号を入れ替えられます.

      22×22 の行列で表すと, CZ=(I00Z) . ここでの I,Z は,それぞれ I=(1001),Z=(1001)2×2 の行列.

      この行列 CZ|ϕ に作用すると,

      CZ|ϕ=12(|00+|01+|10|11)

手順2)全確率振幅の平均値の周りで逆転

      D=12(1111111111111111)=12(XIX+IX+IXI)=12(HHHH)(0XX0)(I00Z)(0XX0)12(HHHH)

最終的な右辺には, -1 が全体に掛かっています. これは, グローバル位相, または絶対位相 (global phase)と呼んでいます. グローバル位相は, 測定段階で絶対値の二乗をとるため, 量子計算としては, +1 との区別ができません. そのため, 一般的に無視しても良いとされています. 量子回路にする以降の例ではこの -1 は省略して検証を進めます.

      DCZ|ϕ=14((1+1+11)|00+(11+11)|01+(1+111)|10+(1+1+1+1)|11)

ここで, Z=HXH を使うと, CZ=(IH)CX(IH) と書けます.

IBM Q を使って検証

これを IBM Q 上で表現すると以下のようになります. 実行すると, |11 の確率が 1 となります.

次に 3-qubit の例は以下のようになります.

* 3-qubit で |1111 回の試行を行なう例

* 3-qubit で |1112 回の試行を行なう例

【補足】 手順2)の別解

手順2での行列の式の変換は, 執筆者の力では導出が難しく, 参考書のお手本を元にしております. 執筆者の行なった違う計算を次に記します.

  D=12(XIX+IX+IXI)
  
  この行列の固有値を λ とすると, 固有値を求める式は,
  
  4λ24(XI)λ+(XI)2(X+I)2=0
  4λ24(XI)λ4X=0
  (λ+I)(λX)=0 となり,
  
  固有値は, λ=I,X . λ=I の固有ベクトルは, 12(II) . λ=X の固有ベクトルは, 12(II) です.
  
  ここで, 固有値ベクトルで作られる行列   U=12(IIII) を考えると,
  これは, 2×2 行列の Hadamard 演算子 H を使って, HI と表せます.
  また, この U は, 逆行列も同じ行列 U1=U という特徴もあり, この性質を使って,
  
  U1DU=(HI)D(HI)=(X00I)
  が得られます.
  
  次に, 右辺の (X00I) の展開を考えてみます.
  形が CNOT=(I00X) に似ていますので, 単にこの2つをかけてみます.

  (X00I)(I00X)=(X00X)=ZX   
  偶然にもうまく量子回路にできる形がでてきました. そこで, 両辺に, CNOT を掛けると次式が得られます.

  (X00I)=(ZX)CNOT   
  この式を使って, U1DU の左右から, U=U1=HI を掛けると, D を表す式が得られます.

  D=(HI)(ZX)CNOT(HI)
  
  これを IBM Q 上で表現すると以下のようになります.

(Rigetti製) pyquil を使って検証

python環境に pyquil をインストールします.

$ pip install pyquil

* 2-qubit から, |11 があるか検索する量子プログラム.

import pyquil.quil as pq
import pyquil.api as api
from pyquil.gates import *
qvm = api.SyncConnection()
p = pq.Program()
p.inst(
  H(0),
  H(1),
  H(0),
  CNOT(1,0),
  H(0),
  H(0),
  H(1),
  X(0),
  X(1),
  H(0),
  CNOT(1,0),
  H(0),
  X(0),
  X(1),
  H(0),
  H(1),
  MEASURE(0, 0),
  MEASURE(1, 1))
result = qvm.run(p,[0,0],20)
print(result)

Grover の応用

書籍紹介

量子コンピューターを勉強するために, お薦めの図書を教えてほしいとよく質問されます.
今回, Grover アルゴリズムに関して, 市販されている書籍で調べてこの資料を記しました. 同じ課題について調べたことで, それぞれの図書の特徴が知れると思い, 下表にまとめました.

表紙 タイトル 説明(Groverアルゴリズムに関する記載について)
量子コンピュータと量子通信〈2〉量子コンピュータとアルゴリズム
Michael A. Nielsen/ Isaac L. Chuang (著) 木村 達也 (訳), オーム社
¥3,800, 2005/1/10
量子コンピューターの最も著名な教科書.
Grover アルゴリズムに関しては, 第6章「量子探索アルゴリズム」で 32ページにわたり解説.
後半の章では, 量子コンピューターの物理的実現方法について書かれています.
量子アルゴリズム
中山 茂 (著), 技報堂出版
¥5,400, 2014/10/30
Grover アルゴリズムは, 第12章「量子探索アルゴリズム」(18ページ)のなかで解説. 量子状態の確率振幅が増大していく図が分かりやすい. また, 8 個(3 qubit)の量子回路の具体的な記載があり, 行列式や量子ビット状態の時間発展が分かりやすい.
同じ著者の “クラウド量子計算入門” の理論面を補填するためにはよい.
クラウド量子計算入門
中山 茂 (著), カットシステム
¥5,500, 2016/10/10
第13章「グローバーの探索問題の量子実験」(13ページ)で Grover アルゴリズムを具体的に IBM Q を使って, 量子回路にしながら解説しています.
本書全般にわたり, IBM Q の利用を想定されており, 具体的な回路を使いながら, 理論的な解説をしているのが特徴.
量子コンピュータの基礎数理
上坂 吉則 (著), コロナ社
¥3,000, 2000/5/26
第6章「ファイル検索」(22ページ)で Grover アルゴリズムを解説. 全般的に数式を用いて説明されており, 数理的な説明の方が分かりやすい方にはよい. 前半の章では, 量子ゲートの例もあるが, Grover アルゴリズムなどの量子アルゴリズムに関しては, 具体的な量子回路の記載がなく, 実用例を考えるには不向き. 理論寄り.
今度こそわかる量子コンピューター
西野 友年 (著), 講談社
¥2,900, 2015/10/23
第13章「量子検索」(14ページ)が Grover アルゴリズムの解説. 数式も少なめに抑えて, 平易な例を挙げるなど理解しやすいように工夫されている. ただし, 理論的な説明は十分ではありません.
ほかの章でも同じように平易に書かれており, 取り扱っている範囲も広範.
量子情報科学入門
石坂 智/ 小川 朋宏/ 河内 亮周/ 木村 元/ 林 正人 (著), 共立出版
¥3,800, 2012/6/10
「量子アルゴリズム」の章に紹介された幾つかのアルゴリズムの1つとして紹介されています. (「Grover のアルゴリズム」の項. 10ページ)定理の定義やその証明の記載があり, 数理的説明.
記載されている内容の範囲も多く, 数式と文章での説明のバランスがよい.
量子計算 (ナチュラルコンピューティング・シリーズ)
西野 哲朗/ 三原 孝志/ 岡本 龍明 (著) 萩谷 昌己/ 横森 貴 (編) , 近代科学社
¥4,500, 2015/10/13
第3章「量子デジタル計算」の1節「Grover のアルゴリズム」(12ページ)で解説.
量子情報理論 第2版
佐川 弘幸/ 吉田 宣章 (著) , 丸善出版
¥3,500, 2012/3/30
第8章「量子検索アルゴリズム」(12ページ)で Grover アルゴリズムを解説. 3量子ビットの例題で, 具体的な 8x8 行列の記載が特徴的. 量子回路等の記載はない.
全ての章に演習問題があり, その解答も巻末にあり, 初心者にはわかりやすい.
マーミン 量子コンピュータ科学の基礎
N. David Mermin (著) 木村 元 (訳), 丸善
¥4,800, 2009/7/30
第4章(12ページ)が Grover アルゴリズムについての解説. 「W の構成法」が特徴的. 特定する数が複数ある場合への一般化にも言及あり. 最新の量子計算からみると, 少し古い印象です.
量子コンピューティング
Jozef Gruska (著) 伊藤 正美/ 岩本 宙造/ 森田 憲一/ 今井 克暢/ 外山 政文 (訳) , 森北出版
¥8,000, 2003/11/19
Grover アルゴリズムは, 第3章「アルゴリズム」の中で, 「量子探索と数え上げ」(13ページ)の項として解説. 検索対象 x が複数である G-BBHT 探索アルゴリズムの説明が多い. 数え上げ問題の計算量の古典アルゴリズムとの比較表が特徴的.
全般にわたり, 練習問題による問題提起があるものの, その問題の明確な回答がなく, 自力で解法が見つけられないと辛い内容です.
量子計算と量子情報の原理
G.ベネンティ (著) 広岡 一 (訳), 丸善出版
¥5,000, 2012/6/5
第3章「量子計算」の1節(8ページ)で Grover アルゴリズムを扱っています.
量子計算の基礎から応用の導入まで, それぞれの話題がコンパクトかつ広範に取り上げられています.
量子情報工学
富田 章久 (著), 森北出版
¥3,400, 2017/2/28
Grover アルゴリズムを一般化した「振幅増幅」を解説し, その例として Grover アルゴリズムを紹介しています. (振幅増幅の説明から5ページ)
観測に基づく量子計算
小柴 健史/ 藤井 啓祐/ 森前 智行 (著), コロナ社
¥2,800, 2017/3/10
測定型量子計算に関する基礎から応用までカバーした良書. Groverアルゴリズムとは異なる高度な分野を扱っており, Groverアルゴリズムの記載はありません.
OpenQLプロジェクトに参加されている藤井さんが執筆されています.
量子計算理論 量子コンピュータの原理
森前 智行 (著), 森北出版
¥3,600, 2017/11/14
計算量に関する説明がメインで, BQPの定義や超量子計算, 非ユニバーサル計算など前衛的な内容. Grover アルゴリズムなどの基礎的な理論の記述はありません.
個別量子系の物理 ─イオントラップと量子情報処理
占部 伸二 (著) , 朝倉書店
¥4,000, 2017/10/15
量子計算の基礎的な内容はなく, イオントラップ方式の量子コンピューターを実現するための物理系の数理を扱っています.
Grover, Shor などのアルゴリズムの記載はありません.
量子コンピュータ入門(第2版)
宮野 健次郎/ 古澤 明 (著), 日本評論社
¥2,500, 2016/3/10
Shor アルゴリズムについては, 1つの章をかけて詳しい解説がありますが, 残念ながら Grover アルゴリズムについては, 記述がありませんでした.
光を用いた量子テレポーテーションの章が特徴的.
入門量子コンピュータ
Gennady P. Berman/ Ronnie Mainieri/ Gary D. Doolen/ Vladimir I. Tsifrinovich (著) 松田 和典 (訳), パーソナルメディア
¥2,800, 2002/9/10
Grover アルゴリズムや Shor アルゴリズムに関する記述はありません, イオントラップや核スピンなど, 量子コンピューターを実現するための物理系と関連する解説が多いです.
量子プログラミングの基礎
Mingsheng Ying (著) 川辺 治之 (訳), 共立出版
¥6,500, 2017/3/31
古典 while 言語の量子プログラミングへの拡張が特徴的.
Groverアルゴリズムの言及はありません.
量子情報の物理―量子暗号、量子テレポーテーション、量子計算
D.Bouwmeester (著) 小芦 雅斗/ 西野 哲朗/ 井元 信之 (訳) , 共立出版
¥5,300, 2007/5/25
Grover アルゴリズムについては, NP問題との関連で 3ページで紹介されている程度. 理論や具体的な計算の記述はありません.
量子情報科学の基礎―量子コンピュータへのアプローチ
広田 修 (著), 森北出版
¥3,600, 2002/4/15
Grover アルゴリズムについての記述はありません.
量子コンピューター発展に至る歴史的な考察や, エンタングルメントに関する解説が多い.
量子コンピュータの理論―量子コンピューティング入門
西野 哲朗 (著), 培風館
(入手困難), 2002/12
量子コンピューティング―量子コンピュータの実現へ向けて
Colin P. Williams/ Scott H. Clearwater (著) 西野 哲朗/ 渡辺 昇/ 荒井 隆 (訳), シュプリンガー
(入手困難), 2000/06

(*)オススメ度

付録: sympy で Grover アルゴリズムを計算してみましょう

まず, python環境に sympy をインストールします.

$ pip install sympy

sympy.physics.quantum パッケージをインポートします.

>>> from sympy.physics.quantum import *
>>> from sympy.physics.quantum.gate import X,Y,Z,H,T,S,CNOT,SWAP
>>> from sympy.physics.quantum.qubit import Qubit

* 2-qubit から, |11 があるか検索する量子プログラム.

>>> qi = qapply(H(0)*H(1)*Qubit('00'))
>>> rf_3 = H(0)*CNOT(1,0)*H(0)
>>> d_2  = (H(0)*H(1))*(X(0)*X(1))*(H(0)*CNOT(1,0)*H(0))*(X(0)*X(1))*(H(0)*H(1))
>>> grover = d_2 * rf_3
>>> qapply( grover * qi)
-|11>

別解したグローバル位相が +1 のケースの用例も記します.

>>> from sympy.physics.quantum.gate import IdentityGate as I
>>> qi = qapply(H(0)*H(1)*Qubit('00'))
>>> rf_3 = H(0)*CNOT(1,0)*H(0)
>>> d_2 = (H(1)*I(0))*(Z(1)*X(0))*CNOT(1,0)*(H(1)*I(0))   # 別解の行列
>>> grover = d_2 * rf_3
>>> qapply( grover * qi)
|11>               # ←グローバル位相が正の値

更新記録

2017/11/15 初版
2017/11/27 追記
2017/12/01 Advent Calendar 2017 の「はじめに」を追記