メインコンテンツへスキップ

ショアのアルゴリズム

次に、整数因数分解問題に注目し、位相推定を用いて量子コンピュータ上でこの問題を効率的に解く方法を見ていきましょう。 導出されるアルゴリズムが 整数因数分解のためのショアのアルゴリズム です。 ショアは自身のアルゴリズムを特に位相推定の言葉で説明していませんでしたが、その仕組みを説明するうえで自然かつ直感的なアプローチです。

まず、位数発見問題 と呼ばれる中間問題について説明し、位相推定がこの問題の解を与えることを確認します。 次に、位数発見問題の効率的な解が整数因数分解問題の効率的な解をもたらすことを見ていきます。 (ある問題の解が別の問題の解を与えるとき、後者の問題は前者に 帰着する と言います。ここでは整数因数分解を位数発見に帰着しています。) ショアのアルゴリズムのこの第二部分は量子計算をまったく使いません。完全に古典的です。 量子計算が必要なのは位数発見を解くためだけです。

位数発見問題

初等整数論の基礎

位数発見問題と、それを位相推定で解く方法を説明するために、まずいくつかの基本的な整数論の概念を確認し、便利な記法を導入しておきましょう。

はじめに、任意の正整数 NN に対して、集合 ZN\mathbb{Z}_N を次のように定義します。

ZN={0,1,,N1}\mathbb{Z}_N = \{0,1,\ldots,N-1\}

例えば、 Z1={0},  \mathbb{Z}_1 = \{0\},\; Z2={0,1},  \mathbb{Z}_2 = \{0,1\},\; Z3={0,1,2},  \mathbb{Z}_3 = \{0,1,2\},\; などとなります。

これらは数の集合ですが、単なる集合以上のものとして考えることができます。 特に、ZN\mathbb{Z}_N 上の 演算(加算や乗算など)を考えることができ、答えを常に NN で割った余り(すなわち NN を法とした剰余)として取ることで、これらの演算を施しても常にこの集合の中に留まります。 NN を法とした加算と乗算という二つの演算によって、ZN\mathbb{Z}_N は代数において基本的に重要なオブジェクトである になります。

例えば、3355Z7\mathbb{Z}_7 の元であり、これらを掛け合わせると 35=153\cdot 5 = 15 となり、これを 77 で割ると余りが 11 になります。 これを次のように表すことがあります。

351  (mod 7)3 \cdot 5 \equiv 1 \; (\textrm{mod } 7)

ただし、Z7\mathbb{Z}_7 内で計算していることが明確な場合は、記法を簡潔にするために単に 35=13 \cdot 5 = 1 と書くこともできます。

例として、Z6\mathbb{Z}_6 の加算表と乗算表を示します。

+012345001234511234502234501334501244501235501234012345000000010123452024024303030340420425054321\begin{array}{c|cccccc} + & 0 & 1 & 2 & 3 & 4 & 5 \\\hline 0 & 0 & 1 & 2 & 3 & 4 & 5 \\ 1 & 1 & 2 & 3 & 4 & 5 & 0 \\ 2 & 2 & 3 & 4 & 5 & 0 & 1 \\ 3 & 3 & 4 & 5 & 0 & 1 & 2 \\ 4 & 4 & 5 & 0 & 1 & 2 & 3 \\ 5 & 5 & 0 & 1 & 2 & 3 & 4 \\ \end{array} \qquad \begin{array}{c|cccccc} \cdot & 0 & 1 & 2 & 3 & 4 & 5 \\\hline 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 2 & 3 & 4 & 5 \\ 2 & 0 & 2 & 4 & 0 & 2 & 4 \\ 3 & 0 & 3 & 0 & 3 & 0 & 3 \\ 4 & 0 & 4 & 2 & 0 & 4 & 2 \\ 5 & 0 & 5 & 4 & 3 & 2 & 1 \\ \end{array}

ZN\mathbb{Z}_NNN 個の元のうち、gcd(a,N)=1\gcd(a,N) = 1 を満たす元 aZNa\in\mathbb{Z}_N は特別です。 これらの元からなる集合は、しばしば次のようにアスタリスクを用いて表されます。

ZN={aZN:gcd(a,N)=1}\mathbb{Z}_N^{\ast} = \{a\in \mathbb{Z}_N : \gcd(a,N) = 1\}

乗算という演算に注目すると、集合 ZN\mathbb{Z}_N^{\ast}、とりわけ アーベル群 を形成します。これも代数において重要なオブジェクトの一つです。 これらの集合(および有限群一般)についての基本的な事実として、任意の元 aZNa\in\mathbb{Z}_N^{\ast} を選んで aa を繰り返し自身に掛けていくと、いずれ必ず 11 が得られます。

最初の例として、N=6N=6 を取りましょう。 gcd(5,6)=1\gcd(5,6) = 1 なので 5Z65\in\mathbb{Z}_6^{\ast} であり、55 を自身に掛けると 11 が得られます。これは上の表からも確認できます。

52=1(Z6 内での計算)5^2 = 1 \quad \text{($\mathbb{Z}_6$ 内での計算)}

第二の例として、N=21N = 21 を取りましょう。 00 から 2020 までの数の中で、2121 との GCD が 11 になるものは次の通りです。

Z21={1,2,4,5,8,10,11,13,16,17,19,20}\mathbb{Z}_{21}^{\ast} = \{1,2,4,5,8,10,11,13,16,17,19,20\}

これらの元それぞれについて、その数を正整数乗すると 11 が得られます。 その最小の乗数を示すと次の通りです。

11=182=1163=126=1106=1176=143=1116=1196=156=1132=1202=1\begin{array}{ccc} 1^{1} = 1 \quad & 8^{2} = 1 \quad & 16^{3} = 1 \\[1mm] 2^{6} = 1 \quad & 10^{6} = 1 \quad & 17^{6} = 1 \\[1mm] 4^{3} = 1 \quad & 11^{6} = 1 \quad & 19^{6} = 1 \\[1mm] 5^{6} = 1 \quad & 13^{2} = 1 \quad & 20^{2} = 1 \end{array}

これらの等式はすべて Z21\mathbb{Z}_{21} 内での計算であることは省略しています。記述を煩雑にしないよう、以後のレッスン全体でもこれを暗黙の前提とします。

問題の定式化と位相推定との関係

これで位数発見問題を定式化できます。

位数発見

入力: gcd(N,a)=1\gcd(N,a) = 1 を満たす正整数 NNaa
出力: ar1a^r \equiv 1 (mod N)(\textrm{mod } N) を満たす最小の正整数 rr

あるいは、先ほど導入した記法では、aZNa \in \mathbb{Z}_N^{\ast} が与えられ、ar=1a^r = 1 を満たす最小の正整数 rr を求めることになります。 この数 rr を、aaNN を法とした 位数 と呼びます。

位数発見問題を位相推定と結び付けるために、古典的な状態が ZN\mathbb{Z}_N に対応するシステムに対して、固定した元 aZNa\in\mathbb{Z}_N^{\ast} で乗算する演算を考えましょう。

Max=ax(各 xZN に対して)M_a \vert x\rangle = \vert ax \rangle \qquad \text{(各 $x\in\mathbb{Z}_N$ に対して)}

明確にしておくと、ZN\mathbb{Z}_N 内での乗算を行っているので、右辺のケットの内側の積が NN を法としていることは暗黙の前提です。

例えば、N=15N = 15a=2a=2 とすると、M2M_2 の標準基底 {0,,14}\{\vert 0\rangle,\ldots,\vert 14\rangle\} への作用は次の通りです。

M20=0M25=10M210=5M21=2M26=12M211=7M22=4M27=14M212=9M23=6M28=1M213=11M24=8M29=3M214=13\begin{array}{ccc} M_{2} \vert 0 \rangle = \vert 0\rangle \quad & M_{2} \vert 5 \rangle = \vert 10\rangle \quad & M_{2} \vert 10 \rangle = \vert 5\rangle \\[1mm] M_{2} \vert 1 \rangle = \vert 2\rangle \quad & M_{2} \vert 6 \rangle = \vert 12\rangle \quad & M_{2} \vert 11 \rangle = \vert 7\rangle \\[1mm] M_{2} \vert 2 \rangle = \vert 4\rangle \quad & M_{2} \vert 7 \rangle = \vert 14\rangle \quad & M_{2} \vert 12 \rangle = \vert 9\rangle \\[1mm] M_{2} \vert 3 \rangle = \vert 6\rangle \quad & M_{2} \vert 8 \rangle = \vert 1\rangle \quad & M_{2} \vert 13 \rangle = \vert 11\rangle \\[1mm] M_{2} \vert 4 \rangle = \vert 8\rangle \quad & M_{2} \vert 9 \rangle = \vert 3\rangle \quad & M_{2} \vert 14 \rangle = \vert 13\rangle \end{array}

gcd(a,N)=1\gcd(a,N)=1 のとき、この演算はユニタリです。標準基底 {0,,N1}\{\vert 0\rangle,\ldots,\vert N-1\rangle\} の元を並べ替えるため、行列として見ると置換行列となります。 定義から明らかにこの演算は決定論的であり、逆演算が存在することを確認する簡単な方法は、aaNN を法とした位数 rr を考え、MaM_a の逆演算が Mar1M_a^{r-1} であることに気づくことです。

Mar1Ma=Mar=Mar=M1=IM_a^{r-1} M_a = M_a^r = M_{a^r} = M_1 = \mathbb{I}

rr(求めようとしている量)に関する知識を必要としない逆演算の考え方もあります。 aZNa\in\mathbb{Z}_N^{\ast} のすべての元に対して、ab=1ab=1 を満たす一意の元 bZNb\in\mathbb{Z}_N^{\ast} が常に存在します。 この元 bba1a^{-1} と表記し、効率的に計算できます。 ユークリッドの GCD アルゴリズムの拡張により、lg(N)\operatorname{lg}(N) の 2 乗オーダーのコストで計算できます。 したがって、

Ma1Ma=Ma1a=M1=I.M_{a^{-1}} M_a = M_{a^{-1}a} = M_1 = \mathbb{I}.

以上より、演算 MaM_a は決定論的かつ可逆です。 これは MaM_a が置換行列で表されることを意味し、したがってユニタリです。

では、aZNa\in\mathbb{Z}_N^{\ast} を仮定した上で、演算 MaM_a の固有ベクトルと固有値について考えましょう。 今述べたように、この仮定から MaM_a がユニタリであることがわかります。

MaM_a の固有値は NN 個あり(同じ固有値が重複することもあります)、対応する固有ベクトルの選び方には一般に自由度があります。ただし、すべての可能性を考慮する必要はありません。 まず簡単に始めて、MaM_a の固有ベクトルを一つだけ特定しましょう。

ψ0=1+a++ar1r\vert \psi_0 \rangle = \frac{\vert 1 \rangle + \vert a \rangle + \cdots + \vert a^{r-1} \rangle}{\sqrt{r}}

rraaNN を法とした位数であり、以後のレッスン全体でもこれを前提とします。 この固有ベクトルに対応する固有値は 11 です。aa を掛けてもこのベクトルは変化しないためです。

Maψ0=a++ar1+arr=a++ar1+1r=ψ0M_a \vert \psi_0 \rangle = \frac{\vert a \rangle + \cdots + \vert a^{r-1} \rangle + \vert a^r \rangle}{\sqrt{r}} = \frac{\vert a \rangle + \cdots + \vert a^{r-1} \rangle + \vert 1 \rangle}{\sqrt{r}} = \vert \psi_0 \rangle

これは ar=1a^r = 1 のため、各標準基底状態 ak\vert a^k \ranglekr1k\leq r-1 のとき ak+1\vert a^{k+1} \rangle にシフトされ、ar1\vert a^{r-1} \rangle1\vert 1\rangle に戻るからです。 直感的に言えば、ψ0\vert \psi_0 \rangle をゆっくりかき混ぜているようなものですが、すでに完全にかき混ざっているため何も変わりません。

次に MaM_a の別の固有ベクトルの例を示します。 こちらは位数発見と位相推定の文脈でより興味深いものです。

ψ1=1+ωr1a++ωr(r1)ar1r\vert \psi_1 \rangle = \frac{\vert 1 \rangle + \omega_r^{-1} \vert a \rangle + \cdots + \omega_r^{-(r-1)}\vert a^{r-1} \rangle}{\sqrt{r}}

あるいは、このベクトルを和の記法で次のように書けます。

ψ1=1rk=0r1ωrkak\vert \psi_1 \rangle = \frac{1}{\sqrt{r}} \sum_{k = 0}^{r-1} \omega_r^{-k} \vert a^k \rangle

ここで複素数 ωr=e2πi/r\omega_r = e^{2\pi i/r} が自然に現れています。これは NN を法とした aa による乗算の仕組みによるものです。 今度の対応する固有値は ωr\omega_r です。 これを確認するために、まず次のように計算します。

Maψ1=1rk=0r1ωrkMaak=1rk=0r1ωrkak+1=1rk=1rωr(k1)ak=1rωrk=1rωrkakM_a \vert \psi_1 \rangle = \frac{1}{\sqrt{r}}\sum_{k = 0}^{r-1} \omega_r^{-k} M_a\vert a^k \rangle = \frac{1}{\sqrt{r}}\sum_{k = 0}^{r-1} \omega_r^{-k} \vert a^{k+1} \rangle = \frac{1}{\sqrt{r}}\sum_{k = 1}^{r} \omega_r^{-(k - 1)} \vert a^{k} \rangle = \frac{1}{\sqrt{r}}\omega_r \sum_{k = 1}^{r} \omega_r^{-k} \vert a^{k} \rangle

次に、ωrr=1=ωr0\omega_r^{-r} = 1 = \omega_r^0 かつ ar=1=a0\vert a^r \rangle = \vert 1\rangle = \vert a^0\rangle であることから、

1rk=1rωrkak=1rk=0r1ωrkak=ψ1,\frac{1}{\sqrt{r}}\sum_{k = 1}^{r} \omega_r^{-k} \vert a^{k} \rangle = \frac{1}{\sqrt{r}}\sum_{k = 0}^{r-1} \omega_r^{-k} \vert a^k \rangle = \vert\psi_1\rangle,

よって Maψ1=ωrψ1M_a \vert\psi_1\rangle = \omega_r \vert\psi_1\rangle が成り立ちます。

同様の議論により、MaM_a の追加の固有ベクトル・固有値ペアを特定できます。 任意の j{0,,r1}j\in\{0,\ldots,r-1\} に対して、

ψj=1rk=0r1ωrjkak\vert \psi_j \rangle = \frac{1}{\sqrt{r}} \sum_{k = 0}^{r-1} \omega_r^{-jk} \vert a^k \rangle

MaM_a の固有ベクトルであり、対応する固有値は ωrj\omega_r^j です。

Maψj=ωrjψjM_a \vert \psi_j \rangle = \omega_r^j \vert \psi_j \rangle

MaM_a には他にも固有ベクトルが存在しますが、それらは気にしなくて構いません。ここでは特定した固有ベクトル ψ0,,ψr1\vert\psi_0\rangle,\ldots,\vert\psi_{r-1}\rangle にのみ注目します。

位相推定による位数発見

与えられた aZNa\in\mathbb{Z}_N^{\ast} に対する位数発見問題を解くには、演算 MaM_a に位相推定手順を適用します。

そのためには、MaM_a だけでなく Ma2M_a^2Ma4M_a^4Ma8M_a^8 など、位相推定手順から十分精度の高い推定値を得るために必要なだけ量子回路で効率的に実装する必要があります。 ここではその方法を説明し、必要な精度の度合いについては後ほど詳しく確認します。

まず MaM_a 単体の演算から始めましょう。 量子回路モデルで作業しているため、当然ながら 00 から N1N-1 までの数を2進法で符号化します。 符号化すべき最大の数は N1N-1 なので、必要なビット数は

n=lg(N1)=log(N1)+1n = \operatorname{lg}(N-1) = \lfloor \log(N-1) \rfloor + 1

となります。

例えば、N=21N = 21 の場合は n=lg(N1)=5n = \operatorname{lg}(N-1) = 5 です。 Z21\mathbb{Z}_{21} の元を長さ 55 の2進数文字列として符号化すると次のようになります。

0000001000012010100\begin{gathered} 0 \mapsto 00000\\[1mm] 1 \mapsto 00001\\[1mm] \vdots\\[1mm] 20 \mapsto 10100 \end{gathered}

そして、MaM_ann 量子ビット演算として定義した正確な定義を示します。

Max={ax  (mod  N)0x<NxNx<2nM_a \vert x\rangle = \begin{cases} \vert ax \; (\textrm{mod}\;N)\rangle & 0\leq x < N\\[1mm] \vert x\rangle & N\leq x < 2^n \end{cases}

ここで重要なのは、MaM_a がどのように機能するかは 0,,N1\vert 0\rangle,\ldots,\vert N-1\rangle に対してのみ関心がありますが、残りの 2nN2^n - N 個の標準基底状態に対しても動作を指定する必要があり、それがユニタリ演算となるようにしなければならないことです。 残りの標準基底状態に対して MaM_a が何もしないと定義することでこれを実現できます。

前のレッスンで説明した整数乗算・除算のアルゴリズムと、それらのリバーシブルかつガベージフリーな実装の方法論を用いることで、任意の aZNa\in\mathbb{Z}_N^{\ast} に対して O(n2)O(n^2) のコストで MaM_a を実行する量子回路を構築できます。 その実現方法の一つを以下に示します。

  1. 演算

    xyxyfa(x)\vert x \rangle \vert y \rangle \mapsto \vert x \rangle \vert y \oplus f_a(x)\rangle

    を実行する回路を構築します。ここで

    fa(x)={ax  (mod  N)0x<NxNx<2nf_a(x) = \begin{cases} ax \; (\textrm{mod}\;N) & 0\leq x < N\\[1mm] x & N\leq x < 2^n \end{cases}

    前のレッスンで説明した方法を使います。これにより O(n2)O(n^2) のサイズの回路が得られます。

  2. nn 個のスワップゲートを使って2つの nn 量子ビットシステムを入れ替えます(量子ビットを個別にスワップします)。

  3. 最初のステップと同様に、演算

    xyxyfa1(x)\vert x \rangle \vert y \rangle \mapsto \vert x \rangle \bigl\vert y \oplus f_{a^{-1}}(x)\bigr\rangle

    のための回路を構築します。ここで a1a^{-1}ZN\mathbb{Z}_N^{\ast} における aa の逆元です。

下側の nn 量子ビットを初期化して3つのステップを合成すると、次の変換が得られます。

x0nステップ1xfa(x)ステップ2fa(x)xステップ3fa(x)xfa1(fa(x))=fa(x)0n\vert x \rangle \vert 0^n \rangle \stackrel{\text{ステップ1}}{\mapsto} \vert x \rangle \vert f_a(x)\rangle \stackrel{\text{ステップ2}}{\mapsto} \vert f_a(x)\rangle \vert x \rangle \stackrel{\text{ステップ3}}{\mapsto} \vert f_a(x)\rangle \bigl\vert x \oplus f_{a^{-1}}(f_a(x)) \bigr\rangle = \vert f_a(x)\rangle\vert 0^n \rangle

この方法はワークスペース量子ビットを必要としますが、最終的に初期化された状態に戻されるため、位相推定にこれらの回路を使用できます。 得られる回路の総コストは O(n2)O(n^2) です。

Ma2M_a^2Ma4M_a^4Ma8M_a^8 などを実行するには、全く同じ方法を使えます。ただし、aaZN\mathbb{Z}_N^{\ast} の元として a2a^2a4a^4a8a^8 などに置き換えます。 すなわち、任意の冪 kk に対して、MaM_a の回路を kk 回繰り返すのではなく、b=akZNb = a^k \in \mathbb{Z}_N^{\ast} を計算して MbM_b の回路を使うことで MakM_a^k の回路を作成できます。

akZNa^k \in \mathbb{Z}_N の計算は、前のレッスンで言及した モジュラー冪乗 問題です。 この計算は前のレッスンで言及したモジュラー冪乗アルゴリズム(計算的数論では 冪アルゴリズム とも呼ばれる)を用いて 古典的に 実行できます。 実際に必要なのは aa2の冪乗 のみ、具体的には a2,a4,a2m1ZNa^2, a^4, \ldots a^{2^{m-1}} \in \mathbb{Z}_N^{\ast} であり、これらは m1m-1 回の反復的な平方演算によって得られます。 各平方演算は O(n2)O(n^2) のサイズのブール回路で実行できます。

本質的に、ここで行っているのは、MaM_a を最大 2m12^{m-1} 回繰り返す問題を効率的な古典計算にオフロードすることです。 そしてこれが可能であることは幸運なことです! 位相推定問題における量子回路の任意の選択では、これが可能でない場合が多く、その場合の位相推定のコストは制御量子ビット数 mm に対して 指数的 に増大します。

都合のよい固有ベクトルが与えられた場合の解法

位相推定を使って位数発見問題をどのように解けるかを理解するために、まず操作 MaM_a に固有ベクトル ψ1\vert\psi_1\rangle を用いて位相推定の手順を実行する場合を考えてみましょう。 実はこの固有ベクトルを手に入れることは容易ではないため、これが話の終わりではありませんが、ここから始めるのが理解の助けになります。

固有ベクトル ψ1\vert \psi_1\rangle に対応する MaM_a の固有値は

ωr=e2πi1r\omega_r = e^{2\pi i \frac{1}{r}}

です。つまり、θ=1/r\theta = 1/r として ωr=e2πiθ\omega_r = e^{2\pi i \theta} となります。 したがって、固有ベクトル ψ1\vert\psi_1\rangle を使って MaM_a に対して位相推定を実行すると、1/r1/r の近似値が得られます。 その逆数を計算することで、近似が十分に精度よければ rr を求めることができます。

さらに詳しく説明すると、mm 個の制御量子ビットを使って位相推定の手順を実行した場合、得られるのは y{0,,2m1}y\in\{0,\ldots,2^m-1\} という数です。 次に y/2my/2^mθ\theta の推定値とします。今の場合、θ=1/r\theta = 1/r です。 この近似から rr を求めるには、近似の逆数を取って最近傍の整数に丸めるのが自然な方法です。

2my+12\left\lfloor \frac{2^m}{y} + \frac{1}{2} \right\rfloor

例えば、r=6r = 6 の場合に固有ベクトル ψ1\vert\psi_1\rangle を用いて m=5m = 5 個の制御ビットで MaM_a に対する位相推定を行うとしましょう。 1/r=1/61/r = 1/6 に対する最良の 55 ビット近似は 5/325/32 であり、位相推定から結果 y=5y=5 が得られる確率はかなり高く(この場合約 68%68\%)なります。 このとき

2my=325=6.4\frac{2^m}{y} = \frac{32}{5} = 6.4

となり、最近傍の整数に丸めると 66 が得られ、これは正しい答えです。

一方、精度が不十分な場合は正しい答えが得られないこともあります。 例えば、位相推定で m=4m = 4 個の制御量子ビットを使った場合、1/r=1/61/r = 1/6 に対する最良の 44 ビット近似である 3/163/16 が得られる可能性があります。 その逆数を取ると

2my=163=5.333\frac{2^m}{y} = \frac{16}{3} = 5.333 \cdots

となり、最近傍の整数に丸めると誤った答えの 55 が得られてしまいます。

では、正しい答えを得るためにはどれほどの精度が必要でしょうか? 位数 rr は整数であることがわかっており、直感的には 1/r1/r を近傍の候補(1/(r+1)1/(r+1)1/(r1)1/(r-1) を含む)と区別できるだけの精度が必要です。 1/r1/r に最も近い、注意すべき数は 1/(r+1)1/(r+1) であり、これら2つの数の距離は

1r1r+1=1r(r+1)\frac{1}{r} - \frac{1}{r+1} = \frac{1}{r(r+1)}

です。

したがって、1/r1/r1/(r+1)1/(r+1) と間違えないようにするには、最良近似 y/2my/2^m1/r1/r に対して 1/(r+1)1/(r+1) よりも近くなるような精度を保証すれば十分です。 精度が十分で

y2m1r<12r(r+1)\left\vert \frac{y}{2^m} - \frac{1}{r} \right\vert < \frac{1}{2 r (r+1)}

すなわち誤差が 1/r1/r1/(r+1)1/(r+1) の距離の半分未満であれば、y/2my/2^m1/(r+1)1/(r+1)1/(r1)1/(r-1) を含む他のどの候補よりも 1/r1/r に近くなります。

これを次のように確認できます。

y2m=1r+ε\frac{y}{2^m} = \frac{1}{r} + \varepsilon

ここで ε\varepsilon

ε<12r(r+1)\vert\varepsilon\vert < \frac{1}{2 r (r+1)}

を満たすとします。逆数を取ると

2my=11r+ε=r1+εr=rεr21+εr\frac{2^m}{y} = \frac{1}{\frac{1}{r} + \varepsilon} = \frac{r}{1+\varepsilon r} = r - \frac{\varepsilon r^2}{1+\varepsilon r}

となります。分子を最大化し分母を最小化することで、rr からどれだけ離れているかを以下のように評価できます。

εr21+εrr22r(r+1)1r2r(r+1)=r2r+1<12\left\vert \frac{\varepsilon r^2}{1+\varepsilon r} \right\vert \leq \frac{ \frac{r^2}{2 r(r+1)}}{1 - \frac{r}{2r(r+1)}} %= \frac{r^2}{2 r (r+1) - r} = \frac{r}{2 r + 1} < \frac{1}{2}

rr から 1/21/2 未満の距離にありますので、予想どおり丸めると rr が得られます。

残念ながら、rr がまだわからないため、必要な精度を rr から直接求めることはできません。 代わりに、rrNN より小さいという事実を利用して、十分な精度を確保することができます。 具体的には、1/r1/r に対する最良近似 y/2my/2^m

y2m1r12N2\left\vert \frac{y}{2^m} - \frac{1}{r} \right\vert \leq \frac{1}{2N^2}

を満たすだけの精度を確保すれば、逆数を取ったときに rr を正しく決定できます。 m=2lg(N)+1m = 2\operatorname{lg}(N)+1 とすることで、前述の方法を使ってこの精度の推定が高い確率で得られるようになります。 (成功確率の下限が 40% でも問題なければ、m=2lg(N)m = 2\operatorname{lg}(N) で十分です。)

一般的な解法

先ほど見たように、MaM_a の固有ベクトル ψ1\vert \psi_1 \rangle があれば、十分な数の制御量子ビットを使って精度を確保することで、位相推定を通じて rr を求めることができます。 しかし、固有ベクトル ψ1\vert\psi_1\rangle を手に入れることは容易ではないため、どのように進めるかを考える必要があります。

一時的に、ψ1\vert\psi_1\rangle の代わりに任意の k{0,,r1}k\in\{0,\ldots,r-1\} に対する固有ベクトル ψk\vert\psi_k\rangle を用いて同様に進めると仮定しましょう。 位相推定の手順から得られる結果は、近似値

y2mkr\frac{y}{2^m} \approx \frac{k}{r}

になります。

kkrr もわからないという前提で考えると、これが rr の特定につながる場合もあればそうでない場合もあります。 例えば、k=0k = 0 の場合は 00 の近似値 y/2my/2^m が得られますが、残念ながらこれからは何もわかりません。 ただし、これは例外的なケースであり、kk が非ゼロの値であれば、少なくとも rr に関する何らかの情報を得ることができます。

連分数アルゴリズムと呼ばれるアルゴリズムを使うと、近似値 y/2my/2^m を近傍の分数に変換できます。近似が十分に精度よければ k/rk/r も求めることができます。 ここでは連分数アルゴリズムの説明は省略します。 代わりに、このアルゴリズムに関する既知の事実を述べます。

事実

整数 N2N\geq 2 と実数 α(0,1)\alpha\in(0,1) が与えられたとき、v0v\neq 0 かつ gcd(u,v)=1\gcd(u,v)=1 を満たし、αu/v<12N2\vert \alpha - u/v\vert < \frac{1}{2N^2} を満たす整数 u,v{0,,N1}u,v\in\{0,\ldots,N-1\} の選択は高々1つしか存在しません。 α\alphaNN が与えられると、連分数アルゴリズムuuvv を求めるか、それらが存在しないことを報告します。 このアルゴリズムは O((lg(N))3)O((\operatorname{lg}(N))^3) のサイズを持つブール回路として実装できます。

k/rk/r に対する非常に精度の高い近似 y/2my/2^m があり、NNα=y/2m\alpha = y/2^m に対して連分数アルゴリズムを実行すると、事実に記載された uuvv が得られます。 この事実の分析から、次の結論が導かれます。

uv=kr.\frac{u}{v} = \frac{k}{r}.

特に注意すべき点として、必ずしも kkrr を個別に学習するわけではなく、既約分数の形で k/rk/r のみを学習することになります。

例えば、すでに述べたように、k=0k=0 からは何も学べません。 ただし、それが起きるのは k=0k=0 の場合だけです。 kk が非ゼロの場合、kkrr の間に公約数があるかもしれませんが、連分数アルゴリズムで得られる vv は少なくとも rr の約数になります。

自明ではありませんが、k{0,,r1}k\in\{0,\ldots,r-1\}一様ランダムに選んで u/v=k/ru/v = k/ruuvv を学習できる能力があれば、数回のサンプリングで高確率に rr を復元できることは事実です。 具体的には、観測した分母 vv のすべての値の最小公倍数rr の推定値とすれば、高い確率で正解になります。 直感的に言えば、kk の値によっては rr との公約数があるために都合が悪く、uuvv を学習しても rr の因数が隠されてしまうことがあります。 しかし、ランダムkk の選択は長期間 rr の因数を隠し続けることはほぼなく、観測した分母の最小公倍数による推定が失敗する確率は、サンプル数の増加に対して指数関数的に減少します。

残る問題は、位相推定を実行するための MaM_a の固有ベクトル ψk\vert\psi_k\rangle をどのように手に入れるかです。 実は、固有ベクトルを実際に準備する必要はないのです!

代わりに行うのは、固有ベクトル ψ\vert\psi\rangle の代わりに、数 11nn ビット二進数表現を意味する状態 1\vert 1\rangle を用いて位相推定を実行することです。 これまでは特定の固有ベクトルに対して位相推定を実行することについてのみ説明しましたが、MaM_a の固有ベクトルでない入力状態に対して手順を実行することも問題ありません。ここではまさにその状態 1\vert 1\rangle を用いています。 (a=1a=1 でない限り、これは MaM_a の固有ベクトルではありませんが、a=1a=1 は興味の対象となる選択ではありません。)

MaM_a の固有ベクトルの代わりに状態 1\vert 1\rangle を選ぶ根拠は、次の等式が成り立つことです。

1=1rk=0r1ψk\vert 1\rangle = \frac{1}{\sqrt{r}} \sum_{k = 0}^{r-1} \vert \psi_k\rangle

この等式を確認する一つの方法は、両辺と各標準基底状態の内積を比較することです。右辺の評価には、本レッスンで前述した公式を活用します。 この結果として、k{0,,r1}k\in\{0,\ldots,r-1\} を一様ランダムに選んで固有ベクトル ψk\vert\psi_k\rangle を使った場合とまったく同じ測定結果が得られます。

さらに詳しく説明すると、固有ベクトル ψk\vert\psi_k\rangle の1つの代わりに状態 1\vert 1\rangle を用いて位相推定を実行するとしましょう。 逆量子フーリエ変換が実行された後、残る状態は

1rk=0r1ψkγk\frac{1}{\sqrt{r}} \sum_{k = 0}^{r-1} \vert \psi_k\rangle \vert \gamma_k\rangle

となります。ここで

γk=12my=02m1x=02m1e2πix(k/ry/2m)y\vert\gamma_k\rangle = \frac{1}{2^m} \sum_{y=0}^{2^m - 1} \sum_{x=0}^{2^m-1} e^{2\pi i x (k/r - y/2^m)} \vert y\rangle

です。ベクトル γk\vert\gamma_k\rangle は、逆量子フーリエ変換が適用された後の上位 mm 量子ビットの状態を表しています。

したがって、{ψ0,,ψr1}\{\vert\psi_0\rangle,\ldots,\vert\psi_{r-1}\rangle\} が正規直交集合であるという事実から、上位 mm 量子ビットの測定により、k{0,,r1}k\in\{0,\ldots,r-1\} が一様ランダムに選ばれた値 k/rk/r に対する近似値 y/2my/2^m が得られることがわかります。 すでに述べたように、これにより複数回の独立した実行を経て高い確信度で rr を求めることができ、これが目標でした。

総コスト

各制御ユニタリ MakM_a^k を実装するコストは O(n2)O(n^2) です。 制御ユニタリ演算は mm 個あり、m=O(n)m = O(n) ですので、制御ユニタリ演算の総コストは O(n3)O(n^3) となります。 さらに、mm 個のアダマールゲート(コストへの寄与は O(n)O(n))と、O(n2)O(n^2) を寄与する逆量子フーリエ変換があります。 したがって、制御ユニタリ演算のコストが手順全体のコストを支配し、全体コストは O(n3)O(n^3) となります。

量子回路自体に加えて、途中でいくつかの古典的計算も必要です。 これには、制御ユニタリゲートの作成に必要な ZN\mathbb{Z}_N における冪 aka^kk=2,4,8,,2m1k = 2, 4, 8, \ldots, 2^{m-1})の計算、および θ\theta の近似値を分数に変換する連分数アルゴリズムが含まれます。 これらの計算は、総コスト O(n3)O(n^3) のブール回路で実行できます。

通常のケースと同様に、漸近的に高速なアルゴリズムを使用することでこれらの上限をすべて改善できます。上記の上限は基本的な算術演算に標準的なアルゴリズムを使用していると仮定しています。

位数発見による素因数分解

最後に議論すべきことは、位数発見問題を解くことが素因数分解にどのように役立つかです。 この部分は完全に古典的なものであり、量子計算とは直接関係しません。

基本的な考え方は以下のとおりです。 数 NN を素因数分解したいと考えており、これを再帰的に行うことができます。 具体的には、NN分割(任意の2つの整数 b,c2b,c\geq 2N=bcN = bc を満たすものを見つけること)に集中できます。 NN が素数の場合はこれが不可能ですが、まず素数判定アルゴリズムで NN が素数かどうかを効率的に確認でき、素数でなければ分割を試みます。 NN を分割したら、bbcc に対して再帰を繰り返し、すべての因数が素数になって NN の素因数分解が得られるまで続けます。

偶数の分割は簡単で、22N/2N/2 を出力するだけです。

完全冪数、すなわち整数 s,j2s,j\geq 2 に対して N=sjN = s^j の形の数の分割も容易です。 N1/2,N^{1/2}, N1/3,N^{1/3}, N1/4N^{1/4} などの根を近似し、ss の候補として近傍の整数を確認することで行えます。 根が 22 を下回って追加の候補が現れなくなるため、この数列の log(N)\log(N) ステップ先まで調べれば十分です。

これらの両方ができることは重要です。位数発見は偶数の因数分解や、ss が素数である素数冪の因数分解には役立たないからです。 しかし、NN が奇数かつ素数冪でない場合は、位数発見を使って NN を分割することができます。

素数冪でない奇数の合成数 N を分割する確率的アルゴリズム
  1. a{2,,N1}a\in\{2,\ldots,N-1\} をランダムに選ぶ。

  2. d=gcd(a,N)d=\gcd(a,N) を計算する。

  3. d>1d > 1 ならば b=db = dc=N/dc = N/d を出力して終了する。そうでなければ aZNa\in\mathbb{Z}_N^{\ast} であることがわかっているので次のステップへ進む。

  4. rraaNN に対する位数とする(ここで位数発見が必要になります)。

  5. rr が偶数の場合:

    5.1 x=ar/21x = a^{r/2} - 1NN を法として)を計算する
    5.2 d=gcd(x,N)d = \gcd(x,N) を計算する。
    5.3 d>1d>1 ならば b=db=dc=N/dc = N/d を出力して終了する。

  6. この地点に達した場合、アルゴリズムは NN の因数を見つけることに失敗しています。

このアルゴリズムの実行は NN の因数を見つけることに失敗する場合があります。 具体的には、次の2つの状況で失敗します。

  • aaNN に対する位数が奇数である。
  • aaNN に対する位数が偶数であり、gcd(ar/21,N)=1\gcd\bigl(a^{r/2} - 1, N\bigr) = 1 である。

基本的な整数論を用いると、ランダムな aa の選択に対して、少なくとも 1/21/2 の確率でこれらのいずれの事象も起きないことが証明できます。 実際、どちらかの事象が起きる確率は 2(m1)2^{-(m-1)} 以下であり、ここで mmNN の異なる素因数の数です。 これが NN が素数冪でないという仮定が必要な理由です。 (NN が奇数であるという仮定も、この事実が成立するために必要です。)

つまり、各実行で NN を分割できる確率は少なくとも 50% です。 したがって、aa をそれぞれランダムに選びながらアルゴリズムを tt 回実行すれば、少なくとも 12t1 - 2^{-t} の確率で NN の分割に成功します。

アルゴリズムの基本的な考え方は次のとおりです。 位数 rr が偶数となる aa の選択があれば、r/2r/2 は整数となり、次の数を考えることができます。

ar/21  (mod  N)andar/2+1  (mod  N).a^{r/2} - 1\; (\textrm{mod}\; N) \quad \text{and} \quad a^{r/2} + 1\; (\textrm{mod}\; N).

公式 Z21=(Z+1)(Z1)Z^2 - 1 = (Z+1)(Z-1) を使うと、

(ar/21)(ar/2+1)=ar1\bigl(a^{r/2} - 1\bigr) \bigl(a^{r/2} + 1\bigr) = a^r - 1

が導かれます。

位数の定義から ar  (mod  N)=1a^r \; (\textrm{mod}\; N) = 1 であることがわかります。つまり NNar1a^r - 1 を整除するということです。 したがって NN は次の積を整除します。

(ar/21)(ar/2+1).\bigl(a^{r/2} - 1\bigr) \bigl(a^{r/2} + 1\bigr).

これが成り立つためには、NN のすべての素因数が ar/21a^{r/2} - 1 または ar/2+1a^{r/2} + 1(あるいは両方)の素因数でなければなりません。ランダムな aa の選択では、NN のすべての素因数が一方の項のみを割り切り、もう一方は割り切らないことはほぼ起こりません。 そうでなければ、NN の素因数の一部が第一項を割り切り、残りが第二項を割り切る限り、第一項との GCD を計算することで NN の非自明な因数を見つけることができます。