ショアのアルゴリズム
この「Qiskit in Classrooms」モジュールを実行するには、以下のパッケージがイ ンストールされた Python 環境が必要です:
qiskitv2.1.0 以降qiskit-ibm-runtimev0.40.1 以降qiskit-aerv0.17.0 以降qiskit.visualizationnumpypylatexenc
上記パッケージのセットアップとインストール方法については、Qiskit のインストールガイドを参照してください。 実際の量子コンピューターでジョブを実行するには、IBM Cloud アカウントのセットアップガイドの手順に従って IBM Quantum® のアカウントを作成する必要があります。
このモジュールはテスト済みで、QPU 時間を 3 秒使用しました。これはあくまで目安であり、実際の使用量は異なる場合があります。
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'
はじめに
1990 年代初頭、古典コンピューターには解くことが難しい問題を量子コンピューターが解けるかもしれないという期待が高まっていました。才能 ある計算機科学者たちが、いくつかのニッチで特殊な問題に対して量子コンピューティングの力を示すアルゴリズムを考案していましたが、量子コンピューティングの分野を確実に革命的に変える「キラーアプリ」はまだ誰も見つけていませんでした。そこに転機が訪れたのが 1994 年、Peter Shor が大きな数を素因数分解するための現在「ショアのアルゴリズム」と呼ばれる手法を考案したときです。
当時、大きな数の素因数を求めることが古典コンピューターにとって非常に困難であることは広く知られていました。実際、インターネットのセキュリティプロトコルはこの困難さに依存していました。Shor は、将来の理論的な量子コンピューターに困難なステップの一部を委ねることで、これらの因数を指数関数的に効率よく求める方法を発見しました。
このモジュールでは、ショアのアルゴリズムを探究します。まず、アルゴリズムの背景をさらに整理し、解く問題を形式化してサイバーセキュリティとの関連を説明します。次に、モジュラー数学の入門と、それを因数分解問題にどう応用するかを解説し、因数分解が「位数探索」と呼ばれる別の問題に帰着できることを示します。前のモジュールで学んだ量子フーリエ変換と量子位相推定がどのように関わるか、そしてそれらを使って位数探索問題を解く方法を説明します。
最後に、実際の量子コンピューター上でショアのアルゴリズムを実行します!ただし、このアルゴリズムが真に役立つのは、大規模なフォールトトレラント量子コンピューターが利用できるようになってからであり、それはまだ数年先のことです。ここでは、アルゴリズム の動作を確認するために小さな数を因数分解するにとどめます。
因数分解問題
因数分解問題の目標は、数 の素因数を求めることです。一部の については、これはかなり簡単です。たとえば が偶数であれば、素因数の 1 つは 2 です。( は素数)のような素数の冪であれば、 の 乗根を近似し、近くの素数を探すことで を比較的容易に求められます。
しかし、古典コンピューターが苦労するのは、 が奇数かつ素数の冪でない場合です。これがショアのアルゴリズムが扱うケースです。このアルゴリズムは を満たす 2 つの因数 と を求めます。すべての因数が素数になるまで再帰的に適用できます。次のセクションでこの問題にどう取り組むかを見ていきます。
サイバーセキュリティとの関連
大きな数の因数分解が困難であるという事実に基づいて、多くの暗号化方式が構築されており、今日広く使われている RSA もその 1 つです。RSA では、2 つの大きな素数を掛け合わせて を求めることで公開鍵を作成します。誰でもこの公開鍵を使ってデータを暗号化できますが、秘密鍵である と を持つ人だけがデータを復号できます。
を簡単に因数分解できれば、誰でも と を割り出して暗号を破ることができます。しかし実際にはそれは困難です。これは非常に難しい問題として知られています。実際、RSA1024 と呼ばれる数(2 進数で 1024 桁、10 進数で 309 桁)の素因数は、1991 年に $100,000 の懸賞が掛けられていたにもかかわらず、いまだに発見されていません。
Shor の解法
1994 年、Peter Shor は量子コンピューターが古典コンピューターよりも指数関数的に効率よく大きな数を因数分解できることに気づきました。その洞察は、この因数分解問題とモジュラー算術との関係に基づいています。まずモジュラー算術の簡単な入門を行い 、次にこれを使って を因数分解する方法を見ていきます。
モジュラー算術
モジュラー算術は循環的な計数システムです。通常の 0, 1, 2, … という整数での計数から始まりますが、ある周期 の後に数え直しが始まります。例を見てみましょう。周期が 5 の場合、通常なら 5 に到達するところで 0 に戻ります:
これは「モジュロ 5」の世界では 5 が 0 と等しいからです。 と表します。実際、5 のすべての倍数は と等しくなります。
理解度チェック
以下の問題を読み、答えを考えてから、三角形をクリックして解答を確認してください。
モジュラー算術を使って次の問題を解いてください:
あなたは午前 8 時に長距離大陸横断列車の旅に出発します。列車の旅は 60 時間です。到着時刻は何時ですか?
解答:
周期は 24 です(1 日は 24 時間のため)。したがって、この問題はモジュラー算術で次のように書けます:
つまり、目的地には 20:00(午後 8 時)に到着することになります。
と
2 つの集合 と を導入すると便利です。 は「モジュロ 」の世界に存在する数の集合です。たとえば、モジュロ 5 で数えていたときの集合は となります。別の例として、 です。 の要素に対して(モジュロ の)加算と乗算を行うと、結果も の要素となります。これにより は環と呼ばれる数学的対象になります。
ショアのアルゴリズムにとって特に重要な の部分集合があります。それは、各要素と の最大公約数が 1 である、つまり各要素が と「互いに素」であるような の部分集合です。これらの数の集合にモジュラー乗算演算を加えると、群と呼ばれる別の数学的対象が形成されます。これを と呼びます。(および有限群一般)の特徴として、任意の要素 を選んで を繰り返し自分自身に掛けると、必ず最終的に 1 が得られます。1 を得るために を自分自身に掛ける必要がある最小の回数を の位数と呼びます。この事実は、以下の因数分解方法の議論において非常に重要になります。
理解度チェック
以下の問題を読み、答えを考えてから、三角形をクリックして解答を確認してください。
とは何ですか?
解答:
以下の数を除外しました:
の各要素の位数はいくつですか?
解答:
位数 は、各要素 に対して を満たす最小の数です。
なお、 の数の位数を求めることができましたが、これはより大きな に対しては一般に簡単なことではありません。これが因数分解問題の核心であり、量子コンピューターが必要な理由です。残りのノートブックを進めていく中でその理由が明らかになります。
モジュラー算術を因数分解問題に応用する
を満たす因数 と を求める鍵は、次の条件を満たす別の整数 を見つけることにあります:
かつ
を求めることがどのように と の発見につながるのでしょうか?その論理を見ていきましょう。 より、 となります。つまり、 は の倍数です。したがって、ある整数 に対して、
を因数分解すると:
最初の仮定から なので、 は にも にも割り切れません。したがって、 の 2 つの因数 と は、それぞれ と を割り切る必要があります。 が の因数で が の因数か、あるいはその逆かのいずれかです。そのため、 と 、 それぞれとの最大公約数(GCD)を計算すれば、因数 と が求まります。2 つの数の GCD を計算することは古典的に容易なタスクで、たとえばユークリッドのアルゴリズムを使って実行できます。
理解度チェック
以下の問題を読み、答えを考えてから、三角形をクリックして解答を確認してください。
上記の各論理ステップを理解するのは難しいかもしれないので、具体例を使って確認してみましょう。、 を使います。まず かつ であることを確認してください。次に各ステップを確認し、最後に を計算して、それらが の因数であることを確認してください。
解答:
、これは なので、。
は と等しくありません。
は と等しくありません。
次に、ある整数 に対して が成り立つことを確認します。 と を代入すると 、 のとき成立。
次に と を計算します。
これで の因数が求まりました!
アルゴリズム
を満たす整数 を見つけることが の因数分解にどう役立つかを確認したところで、ショアのアルゴリズムを詳しく見ていきましょう。本質的には を求めることに帰着します:
- ランダムな整数を選ぶ を満たすランダムな整数 を選びます。
- を古典的に計算します。
- であれば、すでに因数を見つけたことになります。終了。
- そうでなければ続けます。
-
の に対する位数 を求める を満たす最小の正の整数 を求めます。
-
位数が偶数かどうかを確認する
- が奇数であれば、ステップ 1 に戻って新しい を選びます。
- が偶数であれば、ステップ 4 に進みます。
- を計算する
- かつ であることを確認します。
- であれば、ステップ 1 に戻って新しい を選びます。
- そうでなければ、GCD を計算して因数を取り出します:
これらが の自明でない因数となります。
- 必要に応じて再帰的に因数分解する
- や が素数でない場合は、アルゴリズムを再帰的に適用して完全に因数分解します。
- すべての因数が素数になれば、因数分解は完了です。
この手順を見ると、量子コンピューターがなぜ必要なのかすぐにはわからないかもしれません。それが必要な理由は、ステップ 2 の「 の に対する位数を求めること」が、古典的には非常に困難な問題だからです。計算量は の数に対して指数関数的に増 加します。しかし量子コンピューターを使えば、量子位相推定を利用してこれを解くことができます。ステップ 4 の 2 つの整数の GCD を求めることは、古典的には比較的容易なことです。したがって、実際に量子コンピューターの力が必要なのは位数探索のステップだけです。因数分解問題は位数探索問題に「帰着」すると言います。
難しい部分:位数探索
次に、量子コンピューターを位数探索にどのように活用できるかを説明します。まず「位数」の意味を明確にしておきましょう。数学的な意味はすでに述べました: を満たす最初の非ゼロの整数 です。ここではこの概念についてもう少し直感的に理解してみましょう。
が十分に小さければ、 の各冪を計算し、その数の に対する剰余を取り、 を満たす冪 が見つかったところで止めることで、単純に位数を求めることができます。これが先ほどの例 でやったことです。いくつかのサンプル値 と に対するモジュ ラー冪のグラフを見てみましょう:
何か気づきましたか?これらは周期関数です!そして位数 は周期と同じです!つまり、位数探索は周期探索と等価です。
量子コンピューターは関数の周期を求めることに非常に適しています。そのために、量子位相推定(QPE)と呼ばれるアルゴリズムのサブルーチンを使います。QPE と量子フーリエ変換との関係については前のモジュールで説明しました。詳しい復習は、QFT モジュール、またはジョン・ワトラスの量子アルゴリズムコースの量子位相推定のレッスンを参照してください。ここではその手順の概要を説明します:
量子位相推定(QPE)では、ユニタリ とそのユニタリの固有状態 から始めます。次に QPE を使って対応する固有値を近似します。演算子がユニタリなので、固有値は の形をとります。したがって、固有値を求めることは周期関数における の値を求めることと等価です。Circuit は 次のようになります:

制御 Qubit の数(上図の上部 個の Qubit)が近似の精度を決定します。
ショアのアルゴリズムでは、QPE をユニタリ演算子 に対して使います:
ここで は多 Qubit レジスタの計算基底状態を表し、Qubit の 2 進数の値が整数 に対応します。たとえば 、 の場合、 は 4 Qubit の基底状態