Path: blob/main/translations/ja/ch-algorithms/simon.ipynb
3855 views
サイモンのアルゴリズム
このセクションでは、最初にSimon(サイモン)の問題を紹介し、古典コンピューターと量子コンピューターのそれぞれでその問題を解く方法を紹介します。その後、Qiskitを用いて量子アルゴリズムを実装し、シミュレーターとデバイス上で実行してみます。
目次
はじめに 1.1 サイモンの問題 1.2 サイモンのアルゴリズム
Qiskit による実装 3.1 シミュレーター上での実行 3.2 実機上での実行
1. はじめに
サイモンのアルゴリズム[1]は、特定の問題を解く古典的なアルゴリズムに比べて指数関数的な高速化を実現した最初の量子アルゴリズムです。このアルゴリズムに触発され、量子フーリエ変換として知られている離散フーリエ変換の量子アルゴリズムが生まれました。これは最も有名な量子アルゴリズムである ショアの素因数分解アルゴリズムの内部で使われています。
1.1. サイモンの問題
まず、1対1対応関数、または2対1対応関数 を考えます。 は以下のような特徴を持ちます:
1対1対応: 全ての出力値に対して唯一の入力値が対応する。例えば4つの入力を取る関数は:
2対1対応: 全ての出力値に対して、必ず2つの入力値が対応する。例えば4つの入力を取る関数は: この2対1対応写像は、ある秘密ビット列 を用いたもので、2つの入力 について が成り立つとき、 が必ず成り立ちます。ここで はビットごとのXORです。
与えられたブラックボックス関数 が、1対1対応関数なのか2対1対応関数なのか、どうしたら高速に判定できるでしょうか? さらにもし が2対1対応関数の場合、どうしたら高速に を特定できるでしょうか? これらは 秘密ビット列 を特定する問題に帰着されます。なぜなら の場合は は 1対1対応関数とわかり、そうでないなら2対1対応関数と即座にわかるためです。
1.2. サイモンのアルゴリズム
古典的な解法
与えられた関数 に対し秘密ビット列 が全ての入出力に対して矛盾がないことを確認するためには、最大で 個の入力値と出力値を確認しなければなりません。ここで は入力値のビット数です。つまり、同じ出力値に対して2つの入力値を見つけるまで、可能な全ての入力値の半分を確認することを意味しています。Deutsch-Jozsaの問題と同様に、運が良ければ最初の2回の試行だけでこの問題は解決します。しかしもし が1対1対応関数だった場合や、2対1対応関数を最も不幸な順で確認した場合に、 回の確認が必要となります。古典コンピューター上で、回数の下限が となるアルゴリズム[2]が知られていますが、やはり必要な確認回数は に対して指数関数的に増加します。
量子的な解法
サイモンのアルゴリズムを実装した量子回路を以下に示します。

ここで、問い合わせ関数 は、2つの量子レジスターを入力として働きます。 適用前後の全体の状態は
となります。2個目の量子レジスターは状態 で初期化され、そのまま に入力されるため、 適用前後の全体の状態は
となります。
このアルゴリズムは以下のステップで実行されていきます。
ここで、2つ目のレジスタは測定されているため省略しました。ここで はこれまでの ではなく 量子ビットで構成されていることに注意してください。
ここで はドット積と呼ばれる二項演算で、ビットごとの積のXOR の値です。
つまり
との内積が となる数値 が測定されます。すなわち、このアルゴリズムをおよそ 回計算することで、 個の異なる を得ます。そして、以下のような連立方程式を考えます:
この連立方程式を(例えばガウスの消去法などを使って)解くことによって、秘密ビット列 を特定することができます。
この問題に対しては、量子アルゴリズムは古典アルゴリズムに比べて指数関数的に少ない回数しか実行されません。繰り返しになりますが、このアルゴリズムの実用的な応用を考えるのは難しいです。しかしながら、このアルゴリズムは具体的な問題の解決を量子コンピューターを利用して指数関数的に高速化した最初の例となり、ショアのアルゴリズムの発見に寄与しました。
2. 例
サイモンのアルゴリズムの実行例を、2 量子ビットで 秘密ビット列 の場合について見ていきます。もし ならば、 となるような関数が対象となります。この問題を解く量子回路は以下のようになります。

- 2つの -量子ビットの入力レジスターはゼロで初期化されます:
したがって、
となります。
ここで、 つ目のレジスターは測定されているため省略して表記しました。
という方程式が一つ得られます。これにより、 は でもなく でもない事がわかります。すなわち求める は または だとわかります。 は ビットなので、これだけでは特定することができません。もう一つの方程式が得られるまで何回かアルゴリズムを実施する必要があります。何回か実行して、以下のような2種類の方程式を得られたとします。
この連立方程式を満たす を求めれば ただ一つに定まります。 得られた は適当に選んだ入力 とその出力 を調べることで検証できます。例えば、
上でインポートされる関数 simon_oracle はビット列 に対応するSimonオラクルを生成する関数です。ここでは説明無しで使用しますが、 section 4で解説します。インポートするには、Setting Up Your Environmentを参考にqiskit_textbookモジュールをインストールする必要があります。
Qiskit では、測定は量子回路の最後で行います。そのため、このSimonのアルゴリズムでは、1つ目のレジスターの測定を最後に移動させます。また、ここでは2つ目のレジスターについては無視します。
3ビット数値の可能性は から までの 種類ですが、ここでは として 種類しか測定されませんでした。以下のように、ビット列 をこの で検証すれば、 種類全てで が成り立つことがわかります。
この得られた4種類の を用いて、連立方程式を解いて を求める事ができます。例えば、最初の測定値 001から
すなわち、 である事がわかります。そして次に 111 を測定し
が得られ、 が明らかになります。つまり は
または
のいずれかであることがわかります。
このうち自明な解 の場合は は1対1対応関数となります。 は自明でない解で、この場合は は 2対1対応となります。こうした連立方程式は で動作するガウスの消去法 で解くことができます。
3.2. 実機上での実行
section 3.1 の量子回路は 量子ビットを使います。しかしこの記事の執筆時、殆どのIBM 量子デバイスは 5 量子ビットしか持っていません。そのため、同じコードを使いますが section2 と同じように を用いれば必要な量子ビット数は となり実機の動作範囲に収まります。
この回路は section 2 と比較すると少し異なります。出力は異なりますが、衝突関係は同じです。すなわち、 が成り立っています。
ここで、最も重要な結果は (mod 2) です。この情報と古典コンピューターを利用して連立方程式を解くことで、秘密ビット列 を得ることができます。それ以外の測定結果は間違いですが、低い測定確率を持ちます。間違いを観測することは起こりにくいと仮定すれば、得られた測定値から古典コンピューターを用いて連立方程式を解き、 を求めることができます。この の場合、 です。
4. 量子オラクル
上のSimonのアルゴリズムの例と実装 は、特定の秘密ビット列に特化しています。このアルゴリズムを任意の秘密ビット列に対応するように拡張するには、問い合わせ関数についてより詳細に考察する必要があります。
サイモンのアルゴリズムは秘密ビット列 を、全ての と対応する に対して が成り立つようなオラクル から探し出します。ここで、 はビットごとの XOR 演算子です。したがって、もし (全てのビットが ) ならば、 は 1対1対応関数であることがわかります。もし ならば、 は 2対1対応関数であることがわかります。
このアルゴリズムでは、オラクルは を入力として受け取ります。事前に定められた のもと、全ての に対して となるようにオラクルは2つめの量子レジスタに書き込み、入力を に変換します。
このようなブラックボックス関数は、以下のような手順で実装できます。
1個目のレジスタの内容を2個目のレジスタにコピーします。
(1対1 または 2対1 写像を作る) もし が でない場合, ビットめの値が となる最も小さなインデックス が存在します。もし ならば、個目のレジスターに に関して XOR を適用します。そうでなければ、何もしません。
(ランダムな置換を行う) 個目のレジスターの量子ビットをランダムに置換します。
6. 参考文献
Daniel R. Simon (1997) "On the Power of Quantum Computation" SIAM Journal on Computing, 26(5), 1474–1483, doi:10.1137/S0097539796298637
Guangya Cai and Daowen Qiu. Optimal separation in exact query complexities for Simon's problem. Journal of Computer and System Sciences 97: 83-93, 2018, https://doi.org/10.1016/j.jcss.2018.05.001
翻訳担当: 野ヶ山尊秀 (nogayama @jp.ibm.com)
訳注
section 1.1 で使用される ドット積とXORの分配法則の証明
Step 6 にて、 と変換されていくが、これはドット積とXORの間に分配法則が成り立つためである。以下にこの分配法則を証明する。
ここで、 = は以下の表を用いて導出した。
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
section 2 の量子回路で構成される関数 のに対する値と対応する と とのドット積
| x | f(x) | y (=x b) | x b |
|---|---|---|---|
| 00 | 00 | 11 | 0 |
| 01 | 11 | 10 | 1 |
| 10 | 11 | 01 | 1 |
| 11 | 00 | 00 | 0 |
シミュレーターでは となる だけが測定される。
section 3 の量子回路で構成される関数 のに対する値と対応する と とのドット積
| x | f(x) | y (=x b) | x b |
|---|---|---|---|
| 000 | 000 | 110 | 0 |
| 001 | 001 | 111 | 0 |
| 010 | 100 | 100 | 1 |
| 011 | 101 | 101 | 1 |
| 100 | 100 | 010 | 1 |
| 101 | 101 | 011 | 1 |
| 110 | 000 | 000 | 0 |
| 111 | 001 | 001 | 0 |
シミュレーターでは となる だけが測定される。
section 3.2 の量子回路で構成される関数 のに対する値と対応する と とのドット積
| x | f(x) | y (=x b) | x b |
|---|---|---|---|
| 00 | 00 | 11 | 0 |
| 01 | 10 | 10 | 1 |
| 10 | 10 | 01 | 1 |
| 11 | 00 | 00 | 0 |
ノイズを持つ実機では となる の測定確率が高く、そうでない の測定確率は低い。