計算複雑性理論と量子コンピューティングにおいて、サイモンの問題は、古典的(つまり従来型)コンピュータよりも量子コンピュータで指数関数的に速く解けることが証明されている計算問題です。サイモンの問題を解決する量子アルゴリズムは、通常サイモンのアルゴリズムと呼ばれ、ショアのアルゴリズムの着想源となりました。[ 1 ]どちらの問題も、現在では効率的な量子アルゴリズムが存在することが知られているアーベル隠れ部分群問題の特殊なケースです。
この問題は、決定木複雑性またはクエリ複雑性のモデルで設定され、 1994 年にDaniel R. Simonによって考案されました。 [ 2 ] Simon は、最良の確率的(または決定論的) 古典的アルゴリズムよりも指数関数的に速く、指数関数的に少ないクエリで Simon の問題を解決する量子アルゴリズムを示しました。特に、Simon のアルゴリズムは線形数のクエリを使用しますが、古典的な確率的アルゴリズムは指数関数的な数のクエリを使用する必要があります。
この問題により、複雑性クラスBPP (境界誤差古典クエリ複雑性) とBQP (境界誤差量子クエリ複雑性)の間にオラクル分離が生じます。 [ 3 ]これは、 Bernstein–Vazirani アルゴリズムが達成する分離と同じであり、 PとEQPを分離するDeutsch–Jozsa アルゴリズムによって提供される分離とは異なります。Bernstein–Vazirani アルゴリズムとは異なり、Simon のアルゴリズムの分離は指数関数的です。
この問題は、高速化を実現するために高度に構造化された「ブラックボックス」オラクルの存在を前提としているため、実用的な価値はほとんどありません。[ 4 ]しかし、そのようなオラクルがない場合、指数関数的な高速化は容易に証明できません。なぜなら、これはPがPSPACEと異なることを証明することになるからです。
サイモンの問題は関数へのアクセスを考慮に入れているブラックボックスまたはオラクルによって実装される。この関数は、 1対1関数または2対1関数であることが保証されています。2対1であり、さらに2つの入力が約束されていますそして同じ値に評価されるのは、そして固定ビットセットで異なる。つまり、
どこはビットごとの排他的論理和を表します。サイモンの問題は、決定版では、は1対1または2対1です。非決定版では、サイモンの問題は、1対1ですか、それとも値は何ですか(上記で定義したとおり)。目標は、以下のクエリ(評価)の最小数でこのタスクを解決することです。。
注意:、 それからそしてと一方(なぜなら すべての人々のためにそして)したがって、サイモンの問題は次のように言い換えることができる。
また、約束についても注意してください。もし2対1であれば、それは周期関数である。
以下の関数は、必要な特性を満たす関数の例です。:
この場合、(つまり、ソリューション)。すべての出力は 2 回発生し、任意の 1 つの出力に対応する 2 つの入力文字列のビットごとの XOR は、。
例えば、入力文字列そして両方ともマッピングされています(同じ出力文字列につまり、そして010と100にXORを適用すると110が得られます。
入力文字列001と111を使用して検証することもできます。これらは両方とも(fによって)同じ出力文字列010にマッピングされます。001と111にXORを適用すると110が得られます。つまり、これは同じ解決策を与える。以前と同様。
この例では、関数fは確かに 2 対 1 関数であり、。
直感的に言えば、これは「古典的な」方法では解決が難しい問題です。たとえランダム性を用い、小さなエラー確率を受け入れたとしてもです。難しさの背景にある直感は比較的単純です。古典的な方法で問題を解決しようとすると、2つの異なる入力を見つける必要があります。そしてそのために関数には必ずしも構造があるわけではない。それは、そのような入力を 2 つ見つけるのに役立ちます。より具体的には、次のようなことを発見できます。(あるいはそれが何をするのか)は、2つの異なる入力に対して同じ出力が得られる場合にのみ行われます。いずれにせよ、推測する必要があります。異なる入力は、ペアを見つける可能性が高い前に、誕生日問題と同様に、同じ出力が得られます。古典的には、 100%の確実性でsを見つけるには、チェックする必要があります。入力値に対して、サイモンの問題は、この古典的な方法よりも少ないクエリを使用してsを見つけようとするものです。

アルゴリズム全体としては、サブルーチンを使用して次の2つのステップを実行します。
量子回路(図参照)は、サイモンのアルゴリズムの量子部分を実装したものです。このアルゴリズムの量子サブルーチンは、アダマール変換を利用します。どこ、 どこXORを表します。
まず、アルゴリズムは、初期化された 2 つのレジスタから始まります。次に、最初のレジスタにアダマール変換を適用すると、次の状態が得られます。
オラクルに問い合わせる州を取得する
最初のレジスタに別のハダマール変換を適用します。これにより、次の状態が生成されます。
最後に、最初のレジスタを測定します(2番目のレジスタを最初のレジスタより先に測定してもアルゴリズムは機能しますが、これは不要です)。状態を測定する確率はこれは、このベクトルの大きさを取って二乗すると、第 2 レジスタのすべての可能な測定値のすべての確率の合計になるという事実によるもので、第 1 レジスタは測定には2つのケースがあります。
最初のケースでは、この場合、は1対1であり、範囲ははつまり、総和はすべての基底ベクトルについて行われるということです。2番目のケースでは、2つの文字列が存在することに注意してください。そして、したがって、 どこ。 したがって、さらに、、、 などこの式は簡単に評価できます。測定しているのは。 いつすると、この式は次のように評価されます。、そしてすると、この式は次のようになります。。
したがって、どちらの場合もそして、我々の測定値満たす。
線形独立なビット列のリストが得られるまで、アルゴリズムの量子部分を実行します。、そしてそれぞれ満たすしたがって、この連立方程式を古典的な方法で効率的に解くことで、。
確率線形独立であるのは少なくとも連立方程式を解いて解を導き出すとそうすればテストできますこれが本当なら、私たちは次のことがわかる、 以来もしつまり、、 そして以来1対1です。
サイモンのアルゴリズムを定数回繰り返すことで、時間計算量は変わらないまま、成功確率を任意に高めることができる。
アルゴリズムの最も単純な例を考えてみましょう。この場合、入力状態をアダマールゲートとオラクルを通して進化させると、(再正規化を除いて)次の状態が得られます。
もしつまり、すると、2 番目のレジスターを測定すると、常に次の結果が得られます。、そして常に最初のレジスタが(再正規化を除いて)次の状態に縮退する結果となる。
したがって、アダマールを適用して最初のレジスターを測定すると、常に次の結果が得られます。一方、1対1、つまり、すると、2 番目のアダマールの後の最初のレジスターを測定すると、両方の結果が得られる可能性がある。そして同じ確率で。
回復する測定結果から、常に測定していたかどうかを調べるその場合あるいは両方を測定したそして等しい確率で、その場合、我々は次のように推論する。この計画は、以下の場合には失敗します。しかし、それでも私たちは常に結果を見つけましたしかし、この事象の確率はと実施された測定の回数であり、統計量を増やすことで指数関数的に小さくすることができる。
次に、アルゴリズムの初期部分では、(正規化を除いて)次の状態が得られます。もし、 意味単射である場合、2 番目のレジスタでは、常に最初のレジスタが縮退します。すべての言い換えれば、アダマールゲートを適用し、最初のレジスターを測定すると、4 つの結果が得られます。したがって、それらは等しい確率で発見される。
一方、、 例えば、測定2 番目のレジスタでは、最初のレジスタが状態に縮約されますより一般的には、測定する与える最初のレジスタで。ハダマールゲートを適用し、最初のレジスタで測定すると、次の結果が得られます。そして等しい確率で。
他のケースにも同様の推論が適用されます。すると、考えられる結果は次のとおりです。そして、もし考えられる結果はそしてと互換性があり、一般的な場合で議論された規則。
回復するためにしたがって、我々はこれら4つのケースを区別するだけでよく、ある結果の確率分布を別の結果の確率分布と誤認する確率が十分に小さいことを保証するために十分な統計データを収集すればよい。
サイモンのアルゴリズムはブラックボックスへのクエリは、古典的なアルゴリズムでは少なくともクエリ。また、この問題を解く量子アルゴリズムは、サイモンのアルゴリズムが最適であるという意味で、最適であることも知られています。クエリ。[ 5 ] [ 6 ]
ここに示した量子回路は、IBMが開発したオープンソースの量子コンピューティングソフトウェア開発フレームワークであるQiskitを用いて、サイモンのアルゴリズムをPythonで実装する方法を示す簡単な例です。
