グローバーのアルゴリズム基礎(2):位相反転増幅回路
本日は前回の続きで、位相反転増幅回路について解説します。
シリーズ予定:
前回はオラクル回路によって正解の状態の位相(正負)を反転させてマーキング(目印)しました。
ただ、この段階では測定しても確率振幅の大きさ自体は変わっていないので、他の正解でない状態の確率とは等確率のため見分けがつきません。
今回の位相反転増幅回路はマーキングした状態の確率振幅の大きさを大きくし、他の状態の確率振幅の大きさを相対的に低くする手法です。
(余談ですが、確率振幅「の大きさ」と言っているのは、確率振幅は複素数だからです。
通常の水波・地震波・振り子などの振幅は実数ですから「の大きさ」は不要です。)
対象とする読者
- 量子プログラミング・量子計算に興味を持って勉強し始めたエンジニア・高校生・大学生
- Groverのアルゴリズムについて改めて知りたい方 など
前提とする知識
- 簡単な論理演算(AND, OR, NOT)が分かること
- 基本的な量子ゲート(H, X, CX, CCX, Z, CZ)が分かること
- 線形代数(行列・ベクトルの積、直積、あとできれば線形変換)が分かること
- ベクトルのブラケット記法(など、もしくはDirac記法ともいう)が分かること
バージョン情報
- Python 3.7.3
- Qiskit 0.23.1
目次
位相反転増幅回路の役割と仕組み
役割と仕組み
Groverのアルゴリズムの概略は下記でした。
前回のオラクル回路はこの図ので、今回は右側のの「位相反転増幅回路」について解説します。
この回路の役割はオラクル回路でマーキングした状態に量子状態を近づけることです。
オラクル回路でターゲットの状態にマーキングした状態に対して、元の状態を軸に反転させる操作を行い、ターゲットの状態に近づけます。
この操作は数式で表すと下記です。
数式からの理解は嶋田さんの本に記載がありますのでここでは図形的に理解を図ります。
このユニタリー変換 を日本語にすると、「ベクトル のうちベクトル に沿った成分を2倍して、反対向きのベクトルを加算する」なのですが図解すると、下図の通りひし形になります。
(4辺が等しい平行四辺形はひし形)
これを最初に思いついた人はすごいとしか思えませんが、結果的にこの演算をすると、ベクトルをを軸に反転することになります。
そしてとの角度をとしたときにからだけ目的の状態に近づきます。
オラクル回路と位相反転増幅回路の組み合わせを適切な回数繰り返すことによって少しずつターゲットの状態に近づきます。
ただ、繰り返しすぎると通り過ぎてしまうのでちょうどいい回数で止めることに注意です。
実装例
この式の演算を量子ゲートに変換すると下記です。
qr = QuantumRegister(2, 'data') cr = ClassicalRegister(2, 'output') grover = QuantumCircuit(qr, cr) # 重ね合わせ状態の生成 grover.h(qr) # オラクル grover.cz(qr[0], qr[1]) # 位相反転増幅 grover.h(qr) grover.x(qr) grover.h(qr[-1]) grover.cx(qr[0], qr[1]) grover.h(qr[-1]) grover.x(qr) grover.h(qr) # 測定 grover.measure(qr, cr)
位相反転増幅回路の中身
位相反転増幅が何をしているのか分解していこうと思いますが、この式は次のように書き換えられます。
(簡単のために2量子ビット系にします。)
両サイドのHゲートはそのままHゲートで良いのですが、間の の実装方法がミソです。
図4の内の操作に対応する箇所だけ抜き出したのが下記です。
の操作は を軸にそれ以外の状態の確率振幅の位相を反転する操作です。
(図3のをに置き換えてください。)
この実装が図5と言われていますが、この回路そのものは「すべてのビットがゼロの状態(今回なら)の位相だけ反転して、他の状態はそのまま」という操作をします。
まるで中身は逆ですがこれで合っています。
グローバル位相を考慮すれば、それ以外の確率振幅については等価な状態となっていることを以下で示します。
例えば、今回の2量子ビットの場合、Hゲート通過後でこの回路に入る直前の状態は下記です。
まず元の理論の確認をするため、ここに を掛けます。
一方、回路の挙動を確認するため図5の量子回路を通過した後の状態( のみ位相を反転)は下記です。
ということで、グローバル位相はだけ異なりますが、他は同一であることが分かります。
この実装になっている理由は僕は分かりませんが、元々実現したかった「以外の確率振幅の位相を反転する」という操作を量子回路で実装する方法が思い当たりませんでした。
もしかしたらあるのかもしれませんが、難しいのかもしれません。
ちなみに、仮にどうにかして「以外の確率振幅の位相を反転する」という回路が実現できたとして、その後の量子状態はです。
元々の数学上で行いたかった操作は下図のですが、実装ではのような変換をしているのだと思います。
結果的に目的の状態を取り出せているので良いです。
最後に再びHゲートを全体に掛けます。
ということで、マーキングした状態を取り出すことができました。
量子回路で実装した場合は位相が違うだけで、測定して観測される状態は同一です。
まとめ
- 位相反転増幅回路を通すことでオラクル回路でマーキングした増幅を取り出すことができる。
- 位相反転増幅回路の内部では元々の数学上の操作とは異なるが、グローバル位相を考慮すれば入出力は目的を達成している。