Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Shorのアルゴリズム

266bb3207004f0cbf3780d32e93affdd?s=47 gyu-don
March 22, 2019
5.4k

 Shorのアルゴリズム

量子コンピュータを使った素因数分解アルゴリズムの「Shorのアルゴリズム」について解説をしたスライドです。

266bb3207004f0cbf3780d32e93affdd?s=128

gyu-don

March 22, 2019
Tweet

Transcript

  1. Shorのアルゴリズム 加藤 拓己*, 湊 雄一郎*, 中田 真秀** *MDR株式会社, **理化学研究所 1

  2. 量子コンピュータ ➔ 近年、量子コンピュータのハードウェアに関する進展が目覚ましい ◆ 誤り訂正なし・中規模の量子コンピュータの実現が目前に迫っている ◆ 現在のハードウェアで動くアルゴリズムの開発が活発に行われている ➔ 従来から研究されていた、誤り耐性のある量子コンピュータでのアルゴリズムも重 要性が増してきた

    ➔ 素因数分解を高速に行う「ショアのアルゴリズム」は最も有名で重要な量子アルゴ リズムのひとつ 2
  3. 素因数分解と、その難しさ (2以上の)すべての自然数は、素数と、その積でできている 例: 15 = 3x5, 24 = 23 x

    3, 57 = 3x19, 119 = 7x17, 8633 = 89x96, … 自然数Nを素数の積に戻す計算は、特にNの桁数が大きくなると非常に難しく、効率的 に解けるアルゴリズムが存在するかは分かっていない (証明はされていないものの、ないと考えている人が多い.) そのため、素因数分解が難しいことを利用した暗号などもある. (RSA暗号) 量子アルゴリズムの「ショアのアルゴリズム」を使うと、素因数分解が効率よく(多項式時 間で)解ける 3
  4. ショアのアルゴリズムでは、素因数分解を「位数発見問題」に帰着させて解く. 位数発見問題を理解するために、まず、モジュロ演算を理解する. Nで割った余りを求める計算をモジュロ演算と呼び、x mod Nと書き表す. 例: 12 mod 5 =

    2, 2 mod 99 = 2, 34 mod 80 = 1 ここで 3n mod 10を考える. 31 mod 10 = 3, 32 mod 10 = 9, 33 mod 10 = 7, 34 mod 10 = 1 35 mod 10 = 3, 36 mod 10 = 9, 37 mod 10 = 7, 38 mod 10 = 1 n = 4で初めて1になり、4ごとの周期で同じ数が出てきている. ⇒位数が4 モジュロ演算と位数 4
  5. 位数 xj mod Nは必ず周期 (=位数)を持つのか? ⇒持つ。モジュロ演算では、0〜N-1までのN個の数字しか出てこないので、x1からxj+1ま でに必ず、同じ数字が2度以上出ている. 例えば、xk = xm

    (k > m)とすると、xk+1 = xm+1なので、必ずk-mの周期を持つ xj mod N = 1となるjは必ずあるのか? 必ず周期と一致するのか? ⇒必ずあり、周期と一致する. 周期をrとすると、1 = x0 = xr+0 mod N ※上の説明は、やや厳密さに欠ける. (Z/NZ)× = {m | 0 < m < N, mとNは互いに素} が群をなすことが、例えば参考文献[2]の系2.4.14に示されている. この群は既約剰余類群という名前で知られている. xk mod Nがx ∈ (Z/NZ)× から生成された部分群であることをいえば、巡回群の性質から上の性質が示せる. また、xとNが互いに素でない場合は、既約剰余類群の元とならない. その場合はGCD(x, N)≠1はNを割り切るので、素因数分解が 目的の場合は、そのようなxが偶然見つかった場合は、位数を求めずにすぐに計算を打ち切ることができる. 5
  6. 位数と素因数分解 xr mod N = 1となる位数rが分かれば、Nの素因数が分かる ⇒xは何でもいい。rは偶数であることが必要 xr mod N

    = 1ならば: xr = mN + 1となる整数mが存在する(「Nで割った余り」の性質より) ⇔ xr - 1 = mN ⇔ (xr/2 + 1)(xr/2 - 1) = mN ⇒ Nは、(xr/2 + 1)または(xr/2 - 1)と共通の約数を持つ (xr/2 + 1)とN、または(xr/2 - 1)とNの最大公約数は、Nを割り切る 6
  7. 素因数分解アルゴリズム 位数発見によって素因数分解をするアルゴリズム 入力: Lビット長の整数N 出力: Nの素因数のうちのひとつ 1. 前処理 答えが明らかなものは、その場で答えを返す  例:

    偶数の場合は2, N = abの形で書き表せる場合は aを返す (詳細は[1]を参照) x = 2〜N-1をランダムに選択する  xとNの最大公約数が1でなければ、その場で最大公約数を返す 2. 位数発見 xr = 1 mod N となるrを量子位数発見アルゴリズム で発見する 3. 素因数の発見 (xr/2 + 1)とN、または(xr/2 - 1)とNの最大公約数のうち、 1でない方を返す [1] M. Nielsen, I. Chuang, Quantum Computation and Quantum Information 7
  8. 位数発見 位数発見が効率よく行えれば、素因数分解が効率よくできることが分かった. 量子コンピュータでは、位数発見を効率よく行うことができる. 次のユニタリ演算子 Uを考える. Uの固有状態|u s >は、次のように表される .(rは位数、sは整数0≦s≦r-1) 実際、計算すると、

    (xr = 1 = x0 を使った) 量子位相推定により、固有値の位相 sk/rが得られるので、位数 rが求まる. 8
  9. |u s >をどのように用意するか? 固有状態|u s >には、位数rが含まれている. 今、解こうとしている「位数発見」問題の目的は位数を見つけることであり、 仮に|u s >を用意するために位数が必要なら、|u

    s >を使った方法は採用できない. ところが、次に示す等式の右辺を用意できれば、 rを知らずに|u s >の重ね合わせ状態を用意できる. 9
  10. 等式の導出 (1) を導出する. その前に、まず、以下の等式を示す . ただしδ i,j はクロネッカーのデルタ . j

    = 0のとき: 明らかに、左辺 = r = 右辺 j ≠ 0のとき: jとrは互いに素とする. jとrの最大公約数を考えれば、互いに素な形にできるので、このように 議論しても一般性を損なわない . exp(-2πisj/r) (s=0, 1, …, r-1) は、方程式 zr = 1 の解なので、 (z-exp(-2πi0j/r))(z-exp(-2πi1j/r))…(z-exp(-2πi(r-1)j/r)) = 1 左辺を展開し、また、 zr-1の項のみを左辺と右辺で比較すると、 -(exp(-2πi0j/r) + exp(-2πi1j/r) + … + exp(-2πi(r-1)j/r))zr-1 = 0 よって、示された. 10
  11. 等式の導出 (2) を導出する. より、 (左辺) を左辺に代入すると、 = (右辺). よって、示された. 11

  12. 量子位数発見アルゴリズム 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る .

    多いほどs/rの精度が上がる. (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 12
  13. 量子位数発見アルゴリズム 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る .

    多いほどs/rの精度が上がる. (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 13
  14. 量子位数発見アルゴリズム - 初期状態の準備 14 : : H H H 第1レジスタ:

    このレジスタにs/rの推定結果が入る. 2L + 1 ビットが必要. また、2L + 1 + log(3 + 1/2ε) ビット以上用意すると、 s/rからrを推定する手続きが失敗する確率の上限を εにできる. (Lは、素因数分解したい数 N、すなわち位数の上限を表現するのに必要なビット数 ) X : 第2レジスタ: このレジスタに状態|u s >を作る. Lビットが必要. 2進数表現で|1>の状態を作る. すなわち最下位ビットのみ 1にする. : 第3レジスタ: 以後の操作で使う補助ビット . 以後のユニタリ演算子の作り方により必要となる . |0>のままとしておく.
  15. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ s Σ j |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 量子位数発見アルゴリズム 15
  16. 量子位数発見アルゴリズム - ユニタリ変換U x,N 16 2進数の足し算/引き算: 古典ではXOR, ANDなどで作れる. 量子ではToffoliゲートで古典ゲートを模倣できる .

    2進数の掛け算: 例えば2進数で101 x 011は 101 * 0 + 1010 * 1 + 10100 * 1のようにできる. これらに、モジュロ計算を組み合わせた、モジュロ加算回路が参考文献 [3]などに示されている. [3] V. Vedral, A. Barenco, A. Ekert, Quantum Networks for Elementary Arithmetic Operation, arXiv:quant-ph/9511018 (1995)
  17. 量子位数発見アルゴリズム - ユニタリ変換U x,N 17 : : H H H

    X : : U x,N 各|j>ごとに|xj mod N>を計算できる. より、これは以下と等しい .
  18. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 量子位数発見アルゴリズム 18
  19. 量子位数発見アルゴリズム - 量子フーリエ逆変換 19 に注意すると 重ね合わせ状態なので、観測するといずれかが得られる . ここで、|s/r>は (s/r)2tを2進数表現した整数. すなわちs/rを2進数固定小数点表示したビット列

    . QFTの回路例 QFT-1は、QFTの逆計算なので、ゲートをかける順を反転し、Rで の回転角を-1倍したもの. (出典: https://en.wikipedia.org/wiki/Quantum_Fourier_transform)
  20. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 量子位数発見アルゴリズム 20
  21. 量子位数発見アルゴリズム - s/rからrを推定 21 : : H H H X

    : : U x,N QFT-1 m 0 m 1 m 2L+1 観測結果から s/r ≈ m 0 /2 + m 1 /4 + … + m 2L+1 /22L が得られる. (m 0 , m 1 , …, m 2L+1 ∈ {0, 1}) s/rからs, rを復元したい. 一度、連分数に近似すると、 s/rが得られる. (桁落ちしているので、必ずしもうまくいかない . その場合は、やり直すと、 sが再度ランダムに選ばれるた め、別のs/rが得られる)
  22. 連分数に近似して、分数に直す 22 連分数とは: 右図で表される形の式 . ただし、a 1 , a 2

    , …, a n-1 は正の整数で、a 0 は整数. 量子位数発見では、 a 0 = 0となる. (s < r なので s/r < 1) 例: 0.42857を連分数にする. 0.42857の整数部分: a 0 = 0. 小数部分0.42857の逆数を取ると2.33334 2.33334の整数部分: a 1 = 2. 小数部分0.33334の逆数を取ると2.99994 2.99994の整数部分: a 2 = 2. 小数部分0.99994の逆数を取ると1.00006 1.00006の整数部分: a 3 = 1. 小数部分が十分小さくなったので、ここで打ち切る . 数式の出典 Wikipedia: https://ja.wikipedia.org/wiki/%E9%80%A3%E5%88%86%E6%95 %B0 連分数が求まったので、内側から計算すれば分数になる . = 0 .428571 428571 428571 ...
  23. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる (再掲) 量子位数発見アルゴリズム 23
  24. (再掲) 素因数分解アルゴリズム 位数発見によって素因数分解をするアルゴリズム 入力: Lビット長の整数N 出力: Nの素因数のうちのひとつ 1. 前処理 答えが明らかなものは、その場で答えを返す

     例: 偶数の場合は2, N = abの形で書き表せる場合は aを返す (詳細は[1]を参照) x = 2〜N-1をランダムに選択する  xとNの最大公約数が1でなければ、その場で最大公約数を返す 2. 位数発見 xr = 1 mod N となるrを量子位数発見アルゴリズム で発見する 3. 素因数の発見 (xr/2 + 1)とN、または(xr/2 - 1)とNの最大公約数のうち、 1でない方を返す [1] M. Nielsen, I. Chuang, Quantum Computation and Quantum Information 24
  25. 計算量の評価 量子コンピュータを使って、素因数分解ができることは分かったが、 古典コンピュータと比べて効率がいいことを示したい. 桁数が増えるとどういったオーダで計算が大変になるかを、計算量と呼ぶ. 古典コンピュータでの素因数分解の計算量は[4]が詳しいが、多項式時間では解けない. ショアのアルゴリズムで多項式時間で解けるのであれば、ショアのアルゴリズムは、知ら れている古典アルゴリズムのどれよりも速い. 量子コンピュータでは、計算量は使用するゲートの数で評価できる. 25

  26. (再掲) 素因数分解アルゴリズム 位数発見によって素因数分解をするアルゴリズム 入力: Lビット長の整数N 出力: Nの素因数のうちのひとつ 1. 前処理 答えが明らかなものは、その場で答えを返す

     例: 偶数の場合は2, N = abの形で書き表せる場合は aを返す (詳細は[1]を参照) x = 2〜N-1をランダムに選択する  xとNの最大公約数が1でなければ、その場で最大公約数を返す 2. 位数発見 xr = 1 mod N となるrを量子位数発見アルゴリズム で発見する 3. 素因数の発見 (xr/2 + 1)とN、または(xr/2 - 1)とNの最大公約数のうち、 1でない方を返す [1] M. Nielsen, I. Chuang, Quantum Computation and Quantum Information 26
  27. (再掲) 素因数分解アルゴリズム 位数発見によって素因数分解をするアルゴリズム 入力: Lビット長の整数N 出力: Nの素因数のうちのひとつ 1. 前処理 答えが明らかなものは、その場で答えを返す

     例: 偶数の場合は2, N = abの形で書き表せる場合は aを返す (詳細は[1]を参照) x = 2〜N-1をランダムに選択する  xとNの最大公約数が1でなければ、その場で最大公約数を返す 2. 位数発見 xr = 1 mod N となるrを量子位数発見アルゴリズム で発見する 3. 素因数の発見 (xr/2 + 1)とN、または(xr/2 - 1)とNの最大公約数のうち、 1でない方を返す [1] M. Nielsen, I. Chuang, Quantum Computation and Quantum Information 27 古典計算部分はいずれも、 重い計算を含んでいない.
  28. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる (再掲) 量子位数発見アルゴリズム 28
  29. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 量子位数発見アルゴリズム 29 Nのビット数(Lとする)の2倍より少し多い程度. O(L)で十分収まる.
  30. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 量子位数発見アルゴリズム 30 参考文献[3]には、入力ビット数の3乗と書かれてい るので、O(L3)
  31. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 量子位数発見アルゴリズム 31 回路を見るか、参考文献[1]を参照すると、 O(L2)が分かる.
  32. 1. 初期状態の準備 1.1. s/rの値を得るための量子ビットを用意する . (第1レジスタ) 素因数分解したい数字 Nのビット数の2倍よりも何ビットか多めに取る . 多いほどs/rの精度が上がる.

    (ビット数をtとする) 第1レジスタには、全部の量子ビットに Hadamardゲートを適用しておく 1.2. Nと同じビット数の量子ビットを用意する . (第2レジスタ) 0ビット目にだけXゲートを適用し、|1>にし、他は|0>とする 2. ユニタリ変換 U x,N : |j>|k> → |j>|xjk mod N>を行う 初期状態 1/√2tΣ j |j>|1> に適用すると 1/√2t Σ j |j>|xj mod N>が得られる. これは、先程示した等式より、 1/√r2t Σ j Σ s |exp(2πisj/r)|j>|u s > と等価 3. 第1レジスタに量子フーリエ逆変換を行う 1/√r Σ s |s/r>|u s > が得られる 4. 第1レジスタを観測する ランダムにsが選ばれ、s/rが得られる. s/rからrを求めることで、位数が分かる 量子位数発見アルゴリズム 32 連分数アルゴリズムを何回やるかによるが、 O(L)の桁数しかないのだから、O(L)回やれば十分.
  33. ゲート数の評価 使用したゲートの数は O(L3) のオーダであることが分かった. 位数発見時にrが奇数だった場合はやり直すことなどを考慮に入れても O(L3)のオーダ で済むことは参考文献[1]に記述がある. 古典コンピュータで多項式時間で解く方法が知られていないのに対し、量子コンピュータ では、多項式時間の O(L3)

    で解くことができ、桁数の大きい数の素因数分解では特に、 非常に大幅な改善であると言える. 33
  34. まとめ ➔ 近年、量子コンピュータのハードウェアの進展は目覚ましく、アプリケーション開発も 活発に行われている ➔ 素因数分解を高速に解く量子アルゴリズム「Shorのアルゴリズム」について解説を した ➔ ショアのアルゴリズムでは、以下の手順で素因数分解を行う ◆

    素因数分解を位数発見問題に帰着させる ◆ 量子フーリエ逆変換を使って位相推定を行うことで、位数を発見する ◆ 発見した位数から素因数を求める ➔ ショアのアルゴリズムの計算量は O(L3) ◆ Lは素因数分解したい数のビット数 34
  35. 参考文献 [1] M. Nielsen, I. Chuang, 木村 達也(訳), 量子コンピュータと量子通信〈2〉量子コン ピュータとアルゴリズム,

    オーム社 (2005) (原著) M. Nielsen, I. Chuang, Quantum Computation and Quantum Information, Cambridge University Press (2000) [2] 雪江明彦, 代数学1 群論入門, 日本評論社 (2010) [3] V. Vedral, A. Barenco, A. Ekert, Quantum Networks for Elementary Arithmetic Operation, arXiv:quant-ph/9511018 (1995) [4] 木田祐司, 素因数分解計算機実験 研究調査報告書, CRYPTREC (2004) https://www.cryptrec.go.jp/exreport/cryptrec-ex-0201-2003.pdf 35