サイモンのアルゴリズムは、サイモン問題 として知られる問題に対する量子クエリアルゴリズムです。
これは、ドイチュ・ジョザ問題やバーンスタイン・ヴァジラニ問題に似た性質を持つ約束問題ですが、詳細は異なります。
サイモンのアルゴリズムは、量子アルゴリズムが古典(確率的なものを含む)アルゴリズムに対して指数的 な優位性を持つことを示すものとして重要です。また、このアルゴリズムで用いられた技法は、ピーター・ショアによる整数因数分解の効率的な量子アルゴリズムの発見に着想を与えました。
サイモン問題
サイモン問題への入力関数は次の形をとります。
f : Σ n → Σ m f:\Sigma^n \rightarrow \Sigma^m f : Σ n → Σ m
ここで n n n と m m m は正の整数です。
簡単のため m = n m = n m = n の場合に限定することもできますが、この仮定から得られるものはほとんどありません。サイモンのアルゴリズムとその解析は、いずれの場合でも基本的に同じです。
サイモン問題
入力: 関数 f : Σ n → Σ m f:\Sigma^n \rightarrow \Sigma^m f : Σ n → Σ m
約束: すべての x , y ∈ Σ n x,y\in\Sigma^n x , y ∈ Σ n に対して [ f ( x ) = f ( y ) ] ⇔ [ ( x = y ) ∨ ( x ⊕ s = y ) ] [f(x) = f(y)] \Leftrightarrow
[(x = y) \vee (x \oplus s = y)] [ f ( x ) = f ( y )] ⇔ [( x = y ) ∨ ( x ⊕ s = y )] を満たす文字列 s ∈ Σ n s\in\Sigma^n s ∈ Σ n が存在する
出力: 文字列 s s s
約束の内容をすぐに詳しく説明しますが、まずはっきりさせておきたいのは、この約束が f f f に非常に特殊な構造を要求しているという点です。つまり、ほとんどの関数はこの約束を満たしません。
また、この問題は実用的な重要性を意図したものではないことも認識しておくべきでしょう。
むしろ、量子コンピュータに とっては易しく、古典コンピュータにとっては難しいように、人工的に設計された問題です。
主に 2 つのケースがあります。第 1 のケースは s s s がすべてゼロの文字列 0 n 0^n 0 n であり、第 2 のケースは s s s がすべてゼロの文字列ではない場合です。
ケース 1: s = 0 n . s=0^n. s = 0 n .
s s s がすべてゼロの文字列であれば、約束の必要十分条件を単純化して [ f ( x ) = f ( y ) ] ⇔ [ x = y ] [f(x) = f(y)] \Leftrightarrow [x = y] [ f ( x ) = f ( y )] ⇔ [ x = y ] と表せます。
これは f f f が全単射関数であることと同値です。
ケース 2: s ≠ 0 n . s\neq 0^n. s = 0 n .
s s s がすべてゼロの文字列でない場合、この文字列に対して約束が満たされることは、f f f が2対1 であることを意味します。つまり、f f f のすべての可能な出力文字列に対して、f f f がその文字列を出力するような入力文字列がちょうど 2 つ存在します。さらに、それらの 2 つの入力文字列はある文字列 w w w を用いて w w w と w ⊕ s w \oplus s w ⊕ s の形をとらなければなりません。
約束が満たされる場合、条件を満たす文字列 s s s はただ 1 つしか存在し得ないことを認識することが重要です。つまり、約束を満たす関数に対しては常に一意の正しい答えが存在します。
次に、文字列 s = 011 s = 011 s = 011 に対して約束を満たす f : Σ 3 → Σ 5 f:\Sigma^3 \rightarrow \Sigma^5 f : Σ 3 → Σ 5 形式の関数の例を示します。
f ( 000 ) = 10011 f ( 001 ) = 00101 f ( 010 ) = 00101 f ( 011 ) = 10011 f ( 100 ) = 11010 f ( 101 ) = 00001 f ( 110 ) = 00001 f ( 111 ) = 11010 \begin{aligned}
f(000) & = 10011 \\
f(001) & = 00101 \\
f(010) & = 00101 \\
f(011) & = 10011 \\
f(100) & = 11010 \\
f(101) & = 00001 \\
f(110) & = 00001 \\
f(111) & = 11010
\end{aligned} f ( 000 ) f ( 001 ) f ( 010 ) f ( 011 ) f ( 100 ) f ( 101 ) f ( 110 ) f ( 111 ) = 10011 = 00101 = 00101 = 10011 = 11010 = 00001 = 00001 = 11010
入力文字列は 8 8 8 種類あり、出力文字列は 4 4 4 種類で、それぞれ 2 回ずつ現れます。つまりこれは 2 対 1 の関数です。
さらに、同じ出力文字列を生成する 2 つの異なる入力文字列の任意の組み合わせについて、それらのビット単位の XOR が 011 011 011 に等しいことが確認できます。これは一方が他方と s s s の XOR に等しいことと同値です。
実際の出力文字列について重要なのは、異なる入力文字列の選択に対して同じかどうかという点だけであるこ とに注目してください。
例えば上の例では、f f f の出力として ( 10011 , (10011, ( 10011 , 00101 , 00101, 00101 , 00001 , 00001, 00001 , 11010 ) 11010) 11010 ) の 4 つの文字列が現れます。これらの 4 つの文字列をすべて異なる別の文字列に置き換えても、正しい解 s = 011 s = 011 s = 011 は変わりません。
アルゴリズムの説明
サイモンのアルゴリズムを表す量子回路図を以下に示します。
上部の n n n 個の量子ビットがアダマールゲートによって操作され、下部の m m m 個の量子ビットはクエリゲートに直接入力されます。
このレッスンでこれまで説明したアルゴリズムと非常によく似ていますが、今回は位相キックバックがありません。下部の m m m 個の量子ビットはすべて ∣ 0 ⟩ \vert 0\rangle ∣0 ⟩ の状態でクエリゲートに入力されます。
この回路を使ってサイモン問題を解くには、実際には回路を複数回独立して実行し、その後に古典的な後処理ステップを行う必要があります。後処理については、回路の動作を解析した後に説明します。
サイモンのアルゴリズムの解析は、ドイチュ・ジョザアルゴリズムと同様の手順で始まります。
上部の n n n 個の量子ビットに対して最初のアダマールゲートの層が実行されると、状態は次のようになります。
1 2 n ∑ x ∈ Σ n ∣ 0 m ⟩ ∣ x ⟩ . \frac{1}{\sqrt{2^n}} \sum_{x\in\Sigma^n} \vert 0^m \rangle \vert x\rangle. 2 n 1 x ∈ Σ n ∑ ∣ 0 m ⟩ ∣ x ⟩ .
U f U_f U f が実行されると、関数 f f f の出力が下部の m m m 個の量子ビットのすべてゼロの状態に XOR として書き込まれ、状態は次のようになります。
1 2 n ∑ x ∈ Σ n ∣ f ( x ) ⟩ ∣ x ⟩ . \frac{1}{\sqrt{2^n}} \sum_{x\in\Sigma^n} \vert f(x) \rangle \vert x\rangle. 2 n 1 x ∈ Σ n ∑ ∣ f ( x )⟩ ∣ x ⟩ .
2 番目のアダマールゲートの層が実行されると、以前と同じアダマールゲートの層の作用の式を使って次の状態が得られます。
1 2 n ∑ x ∈ Σ n ∑ y ∈ Σ n ( − 1 ) x ⋅ y ∣ f ( x ) ⟩ ∣ y ⟩ \frac{1}{2^n} \sum_{x\in\Sigma^n} \sum_{y\in\Sigma^n} (-1)^{x\cdot y} \vert f(x) \rangle \vert y\rangle 2 n 1 x ∈ Σ n ∑ y ∈ Σ n ∑ ( − 1 ) x ⋅ y ∣ f ( x )⟩ ∣ y ⟩
この時点で、解析はこのレッスンの前のアルゴリズムとは異なる方向へ進みます。
ここでの関心は、測定によって各可能な文字列 y ∈ Σ n y\in\Sigma^n y ∈ Σ n が得られる確率です。
量子情報の基礎 コースの複数系 のレッスンで説明した測定の解析規則を用いると、文字列 y y y が得られる確率 p ( y ) p(y) p ( y ) は次のように表されることがわかります。
p ( y ) = ∥ 1 2 n ∑ x ∈ Σ n ( − 1 ) x ⋅ y ∣ f ( x ) ⟩ ∥ 2 . p(y) = \left\|\frac{1}{2^n} \sum_{x\in\Sigma^n} (-1)^{x\cdot y} \vert f(x) \rangle \right\|^2. p ( y ) = 2 n 1 x ∈ Σ n ∑ ( − 1 ) x ⋅ y ∣ f ( x )⟩ 2 .
これらの確率をより詳しく把握するために、若干の記法と用語が必要です。
まず、関数 f f f の値域 はすべての出力文字列を含む集合です。
range ( f ) = { f ( x ) : x ∈ Σ n } \operatorname{range}(f) = \{ f(x) : x\in \Sigma^n \} range ( f ) = { f ( x ) : x ∈ Σ n }
次に、各文字列 z ∈ range ( f ) z\in\operatorname{range}(f) z ∈ range ( f ) に対して、関数がこの出力文字列 z z z に評価されるすべての入力文字列の集合を f − 1 ( { z } ) f^{-1}(\{z\}) f − 1 ({ z }) と表します。
f − 1 ( { z } ) = { x ∈ Σ n : f ( x ) = z } f^{-1}(\{z\}) = \{ x\in\Sigma^n : f(x) = z \} f − 1 ({ z }) = { x ∈ Σ n : f ( x ) = z }
集合 f − 1 ( { z } ) f^{-1}(\{z\}) f − 1 ({ z }) は f f f による { z } \{z\} { z } の逆像 として知られています。
同様の方法で、{ z } \{z\} { z } の代わりに任意の集合に対する f f f による逆像を定義できます。これは f f f がその集合に写像するすべての元の集合です。
(この記法は関数 f f f の逆関数 と混同しないでください。逆関数は存在しない場合があります。
左辺の引数が元 z z z ではなく集合 { z } \{z\} { z } であることが、この混同を避けるための手がかりです。)
この記法を用いて、上記の確率の式における和を分割すると次のようになります。
p ( y ) = ∥ 1 2 n ∑ z ∈ range ( f ) ( ∑ x ∈ f − 1 ( { z } ) ( − 1 ) x ⋅ y ) ∣ z ⟩ ∥ 2 . p(y) =
\left\|
\frac{1}{2^n}
\sum_{z\in\operatorname{range}(f)}
\Biggl(\sum_{x\in f^{-1}(\{z\})} (-1)^{x\cdot y}\Biggr)
\vert z \rangle
\right\|^2. p ( y ) = 2 n 1 z ∈ range ( f ) ∑ ( x ∈ f − 1 ({ z }) ∑ ( − 1 ) x ⋅ y ) ∣ z ⟩ 2 .
x ∈ Σ n x\in\Sigma^n x ∈ Σ n のすべての文字列は 2 つの和によってちょうど 1 回ずつ表されます。基本的には、関数 f f f を評価したときに生成される出力文字列 z = f ( x ) z = f(x) z = f ( x ) に応じてこれらの文字列を別々のバケツに分け、すべてのバケツに対して別々に和をとっているだけです。
ユークリッドノルムの 2 乗を評価すると次のようになります。
p ( y ) = 1 2 2 n ∑ z ∈ range ( f ) ∣ ∑ x ∈ f − 1 ( { z } ) ( − 1 ) x ⋅ y ∣ 2 . p(y) = \frac{1}{2^{2n}}
\sum_{z\in\operatorname{range}(f)}
\left\vert \sum_{x\in f^{-1}(\{z\})} (-1)^{x\cdot y} \right\vert^2. p ( y ) = 2 2 n 1 z ∈ range ( f ) ∑ x ∈ f − 1 ({ z }) ∑ ( − 1 ) x ⋅ y 2 .
これらの確率をさらに簡略化するために、次の値を見てみましょう。
∣ ∑ x ∈ f − 1 ( { z } ) ( − 1 ) x ⋅ y ∣ 2 (1) \left\vert \sum_{x\in f^{-1}(\{z\})} (-1)^{x\cdot y} \right\vert^2
\tag{1} x ∈ f − 1 ({ z }) ∑ ( − 1 ) x ⋅ y 2 ( 1 )
これは任意の z ∈ range ( f ) z\in\operatorname{range}(f) z ∈ range ( f ) の選択に対するものです。
s = 0 n s = 0^n s = 0 n の場合、f f f は全単射関数であり、すべての z ∈ range ( f ) z\in\operatorname{range}(f) z ∈ range ( f ) に対して f − 1 ( { z } ) f^{-1}(\{z\}) f − 1 ({ z }) の元はただ 1 つだけです。
この場合、式 ( 1 ) (1) ( 1 ) の値は 1 1 1 です。
一方、s ≠ 0 n s\neq 0^n s = 0 n の場合、集合 f − 1 ( { z } ) f^{-1}(\{z\}) f − 1 ({ z }) にはちょうど 2 つの文字列があります。
具体的に言えば、w ∈ f − 1 ( { z } ) w\in f^{-1}(\{z\}) w ∈ f − 1 ({ z }) をこれら 2 つの文字列のうち任意の 1 つとすると、もう 1 つの文字列はサイモン問題の約束によって w ⊕ s w \oplus s w ⊕ s でなければなりません。
この観察を用いると、( 1 ) (1) ( 1 ) を次のように簡略化できます。
∣ ∑ x ∈ f − 1 ( { z } ) ( − 1 ) x ⋅ y ∣ 2 = ∣ (