約束の内容をすぐに詳しく説明しますが、まずはっきりさせておきたいのは、この約束が f に非常に特殊な構造を要求しているという点です。つまり、ほとんどの関数はこの約束を満たしません。
また、この問題は実用的な重要性を意図したものではないことも認識しておくべきでしょう。
むしろ、量子コンピュータにとっては易しく、古典コンピュータにとっては難しいように、人工的に設計された問題です。
主に 2 つのケースがあります。第 1 のケースは s がすべてゼロの文字列 0n であり、第 2 のケースは s がすべてゼロの文字列ではない場合です。
ケース 1: s=0n.s がすべてゼロの文字列であれば、約束の必要十分条件を単純化して [f(x)=f(y)]⇔[x=y] と表せます。
これは f が全単射関数であることと同値です。
ケース 2: s=0n.s がすべてゼロの文字列でない場合、この文字列に対して約束が満たされることは、f が2対1であることを意味します。つまり、f のすべての可能な出力文字列に対して、f がその文字列を出力するような入力文字列がちょうど 2 つ存在します。さらに、それらの 2 つの入力文字列はある文字列 w を用いて w と w⊕s の形をとらなければなりません。
約束が満たされる場合、条件を満たす文字列 s はただ 1 つしか存在し得ないことを認識することが重要です。つまり、約束を満たす関数に対しては常に一意の正しい答えが存在します。
上部の n 個の量子ビットがアダマールゲートによって操作され、下部の m 個の量子ビットはクエリゲートに直接入力されます。
このレッスンでこれまで説明したアルゴリズムと非常によく似ていますが、今回は位相キックバックがありません。下部の m 個の量子ビットはすべて ∣0⟩ の状態でクエリゲートに入力されます。
ここでの関心は、測定によって各可能な文字列 y∈Σn が得られる確率です。
量子情報の基礎コースの複数系のレッスンで説明した測定の解析規則を用いると、文字列 y が得られる確率 p(y) は次のように表されることがわかります。
p(y)=2n1x∈Σn∑(−1)x⋅y∣f(x)⟩2.
これらの確率をより詳しく把握するために、若干の記法と用語が必要です。
まず、関数 f の値域はすべての出力文字列を含む集合です。
range(f)={f(x):x∈Σn}
次に、各文字列 z∈range(f) に対して、関数がこの出力文字列 z に評価されるすべての入力文字列の集合を f−1({z}) と表します。
f−1({z})={x∈Σn:f(x)=z}
集合 f−1({z}) は f による {z} の逆像として知られています。
同様の方法で、{z} の代わりに任意の集合に対する f による逆像を定義できます。これは f がその集合に写像するすべての元の集合です。
(この記法は関数 f の逆関数と混同しないでください。逆関数は存在しない場合があります。
左辺の引数が元 z ではなく集合 {z} であることが、この混同を避けるための手がかりです。)
この記法を用いて、上記の確率の式における和を分割すると次のようになります。
p(y)=2n1z∈range(f)∑(x∈f−1({z})∑(−1)x⋅y)∣z⟩2.
x∈Σn のすべての文字列は 2 つの和によってちょうど 1 回ずつ表されます。基本的には、関数 f を評価したときに生成される出力文字列 z=f(x) に応じてこれらの文字列を別々のバケツに分け、すべてのバケツに対して別々に和をとっているだけです。
サイモンのアルゴリズムの量子回路を実行したときの可能な測定結果の確率がわかりました。
これは s を決定するのに十分な情報でしょうか?
答えはイエスです。ただし、プロセスを数回繰り返し、回路を十分な回数実行することで非常に小さくできるある確率での失敗を許容する必要があります。
基本的なアイデアは、回路を 1 回実行するたびに s に関する統計的な証拠が得られ、十分な回数回路を実行すれば非常に高い確率で s を見つけるためにその証拠を活用できるというものです。
回路を k=n+10 として k 回独立して実行するとします。
この反復回数に特別な意味はなく、後述するように許容する失敗確率に応じて k を大きく(または小さく)することができます。
k=n+10 を選ぶと、s を回復できる確率が 99.9% を超えることが保証されます。
回路を k 回実行することで、文字列 y1,...,yk∈Σn が得られます。
ここで上付き文字はこれらの文字列の名前の一部であり、指数やビットへのインデックスではないことに注意してください。したがって次のようになります。
y1y2yk=yn−11⋯y01=yn−12⋯y02⋮=yn−1k⋯y0k
次に、これらの文字列のビットを 2 値の要素として使い、k 行 n 列の行列 M を形成します。
M=yn−11yn−12⋮yn−1k⋯⋯⋱⋯y01y02⋮y0k
この時点では s が何であるかはわかっていません。この文字列を見つけることが目標です。
しかし、仮に文字列 s を知っているとして、s=sn−1⋯s0 のビットから次のように列ベクトル v を形成します。
つまり、文字列 s は、上述のような列ベクトル v として扱うと、2 を法とした演算のもとで行列 M の零空間の元になります。
これは s=0n の場合も s=0n の場合も成り立ちます。
より正確に言えば、すべてゼロのベクトルは常に M の零空間に含まれており、s=0n の場合には s のビットを要素とするベクトルも零空間に加わります。
残る問題は、0n と s に対応するベクトル以外に M の零空間に他のベクトルが含まれるかどうかです。
k が増えるにつれてその可能性はますます低くなります。k=n+10 を選べば、99.9% を超える確率で M の零空間には 0n と s に対応するベクトル以外が含まれないでしょう。
より一般的には、k=n+10 を k=n+r(任意の正整数 r の選択)に置き換えると、0n と s に対応するベクトルだけが M の零空間に含まれる確率は少なくとも 1−2−r です。
線形代数を用いると、2 を法とした M の零空間の記述を効率的に計算することが可能です。
具体的には、ガウス消去法を使って行うことができます。この方法は、2 を法として演算を行う場合でも、実数や複素数と同じように機能します。
0n と s に対応するベクトルだけが M の零空間に含まれる場合(これは高い確率で起こります)、この計算の結果から s を導き出すことができます。
目的は隠れた文字列 s を見つけることですが、同じ出力値を持つ 2 つの文字列に対してクエリを行わない限り、s についての情報はほとんど得られません。
直感的に言えば、わかることは隠れた文字列 s がクエリした 2 つの異なる文字列の排他的論理和ではないということだけです。
そして 2n/2−1−1 回未満の文字列にクエリした場合、ペアの数が足りないため、まだ除外されていない s の選択肢がたくさん残ります。
これは形式的な証明ではなく、基本的なアイデアに過ぎません。
つまり、まとめると、サイモンのアルゴリズムはクエリモデルにおいて量子アルゴリズムが古典アルゴリズムに対して顕著な優位性を持つことを示しています。
特に、サイモンのアルゴリズムは関数の入力ビット数 n に対して線形な回数のクエリでサイモン問題を解きます。一方、古典アルゴリズムは確率的なものであっても、合理的な成功確率でサイモン問題を解くためには n に対して指数的な回数のクエリが必要です。