数学において、整数因数分解とは、正の整数を整数の積に分解することです。1より大きいすべての正の整数は、1より大きい2つ以上の整数因数の積で表すことができ、その場合は合成数、そうでない場合は素数です。たとえば、15は15 = 3 · 5なので合成数ですが、7はこのように分解できないので素数です。因数のいずれかが合成数である場合、それはさらに小さな因数の積として表すことができます。たとえば、60 = 3 · 20 = 3 · (5 · 4)です。すべての因数が素数になるまでこのプロセスを続けることを素因数分解と呼びます。素因数分解定理により、結果は因数の位数を除いて常に一意です。
小さな整数n を暗算または紙とペンを使った計算で因数分解する最も簡単な方法は試行除法です。これは、 nの平方根までの素数 2、3、5 などで割り切れるかどうかを調べる方法です。より大きな数、特にコンピュータを使用する場合は、さまざまな高度な因数分解アルゴリズムの方が効率的です。素因数分解アルゴリズムでは、通常、因数が見つかるたびに、その因数が素数かどうかをテストします。
数が十分に大きい場合、効率的な非量子整数因数分解アルゴリズムは知られていない。しかし、そのようなアルゴリズムが存在しないことは証明されていない。この問題の難しさは、RSA公開鍵暗号やRSAデジタル署名などの暗号で使用されるアルゴリズムにとって重要である。[ 1 ]楕円曲線、代数的整数論、量子コンピューティングなど、数学とコンピュータサイエンスの多くの分野がこの問題に応用されてきた。
与えられた長さのすべての数が同じように素因数分解が難しいわけではありません。現在知られている手法では、これらの問題の中で最も難しいのは、2 つの素数の積である半素数です。たとえば、2 千ビットを超える長さで、ランダムに選択され、ほぼ同じ大きさである場合 (ただし、たとえばフェルマーの素因数分解法による効率的な素因数分解を避けるほど近すぎない場合)、最速の古典コンピュータ上の最速の素因数分解アルゴリズムでさえ、探索が非現実的になるほどの時間がかかることがあります。つまり、素因数分解される整数の桁数が増えるにつれて、どの古典コンピュータでも素因数分解を実行するために必要な演算回数が劇的に増加します。
多くの暗号プロトコルは、大きな合成整数の素因数分解の難しさ、あるいは関連する問題(例えばRSA問題)に基づいています。任意の整数を効率的に素因数分解できるアルゴリズムが存在すれば、RSAベースの公開鍵暗号は安全性を失うことになります。

算術の基本定理によれば、すべての正の整数は一意の素因数分解を持ちます。(慣例として、1は空積です。)整数が素数であるかどうかの判定は、例えばAKS素数判定法によって多項式時間で行うことができます。しかし、合成数の場合、多項式時間での判定では因数をどのように求めるかについての手がかりは得られません。
整数の因数分解に関する一般的なアルゴリズムが与えられれば、任意の整数をこのアルゴリズムを繰り返し適用することで、その構成要素である素因数に分解できます。しかし、特殊な目的の因数分解アルゴリズムでは状況がより複雑になり、分解中に生成される因数では、その利点が十分に得られない、あるいは全く得られない場合もあります。例えば、n = 171 × p × q ( p < qが非常に大きな素数)の場合、試行除算によって因数 3 と 19 はすぐに得られますが、次の因数を見つけるにはp回除算する必要があります。対照的な例として、n が素数 13729、1372933、および 18848997161の積である場合、13729 × 1372933 = 18848997157となり、フェルマーの因数分解法は⌈ √ n ⌉ = 18848997159から始まり、すぐにb = √ a 2 − n = √ 4 = 2が得られ、したがって因数a − b = 18848997157およびa + b = 18848997161が得られます。これらはそれぞれ合成数と素数として容易に認識できますが、フェルマーの方法では合成数を因数分解するのに非常に時間がかかります。なぜなら、a の開始値⌈ √ 18848997157 ⌉ = 137292は1372933の 10 倍だからです。
bビット数の中で、既存のアルゴリズムを用いて実際に素因数分解するのが最も難しいのは、因数がほぼ同じ大きさである半素数である。そのため、これらの半素数は暗号化アプリケーションで使用される整数である。
2019年、ポール・ツィンマーマンを含む研究者チームが、約900コア年の計算能力を用いて、240桁(795ビット)の数(RSA-240 )を素因数分解した。 [ 2 ]これらの研究者は、1024ビットのRSAモジュラスでは約500倍の時間がかかると推定した。[ 3 ]
これまでに素因数分解された最大の半素数は、 2020年2月に解読されたRSA-250で、これは10進数で250桁の829ビット数です。総計算時間は、2.1GHzのIntel Xeon Gold 6130を使用した場合、およそ2700コア年でした。最近のすべての素因数分解記録と同様に、この素因数分解も、数百台のマシンで実行された、高度に最適化された一般数体篩法 の実装によって完了しました。
すべての整数を多項式時間で因数分解できるアルゴリズム、つまり、ある定数kに対してbビットの数n をO ( b k )の時間で因数分解できるアルゴリズムは発表されていません。そのようなアルゴリズムの存在も非存在も証明されていませんが、一般的には存在しないと考えられています。[ 4 ] [ 5 ]
すべての正のεに対してO((1 + ε ) b )よりも高速なアルゴリズム、すなわち準指数関数的なアルゴリズムが発表されている。 2022年現在理論上の漸近実行時間が最も短いアルゴリズムは、1993年に初めて発表された一般数体篩法(GNFS) [ 6 ]であり、 bビット数nに対して以下の時間で実行されます。
現在のコンピュータでは、GNFS は大きなn (約 400 ビット以上)に対して最も優れた公開アルゴリズムです。しかし、量子コンピュータの場合、ピーター・ショアは1994 年に多項式時間で解くアルゴリズムを発見しました。ショアのアルゴリズムは、 bビットの数の入力に対してO( b 3 ) の時間およびO( b )の空間しか必要としません。2001 年に、ショアのアルゴリズムは、7 量子ビットを提供する分子にNMR技術を使用して初めて実装されました。[ 7 ]
P、NP、co-NPなどの複雑性クラスについて議論するためには、問題を決定問題として定式化する必要がある。
決定問題(整数因数分解)—すべての自然数に対して そしてnは1以外にkより小さい約数を持っていますか?
これはNPとco-NP の両方に属することが知られており、つまり「はい」と「いいえ」の両方の回答を多項式時間で検証できます。「はい」の回答は、d ≤ kの因数分解n = d ( n / d )を示すことで証明できます。「いいえ」の回答は、nをkより大きい異なる素数に因数分解することで証明できます。AKS素数判定法を使用して素数性を検証し、それらを掛け合わせてnを得ます。算術の基本定理により、受け入れられる増加素数の列は 1 つしかないことが保証され、この問題がUPと co-UPの両方に属することがわかります。[ 8 ]ショアのアルゴリズムにより、BQPに属することが知られています。
この問題は、複雑性クラス P、NP 完全、 [ 9 ]、およびco-NP 完全の 3 つのいずれにも該当しないと考えられています。したがって、 NP 中間複雑性クラスの候補となります。
対照的に、「nは合成数か?」(あるいは同等に「nは素数か?」)という判定問題は、 nの約数を特定する問題よりもはるかに簡単であるように思われる。合成数/素数判定問題は、AKS素数判定法を用いれば、 nの桁数bに対して多項式時間で解くことができる。さらに、極めて小さな誤差の可能性を許容できるのであれば、実際に素数判定を非常に迅速に行える確率的アルゴリズムもいくつか存在する。素数判定の容易さはRSAアルゴリズムの重要な要素であり、まず大きな素数を見つける必要がある。
特殊な因数分解アルゴリズムの実行時間は、因数分解する数の特性、あるいは未知の因数(大きさ、特殊な形式など)に依存します。実行時間を決定するパラメータは、アルゴリズムによって異なります。
特殊目的の因数分解アルゴリズムの重要なサブクラスは、カテゴリ 1または第 1 カテゴリアルゴリズムであり、その実行時間は最小の素因数の大きさに依存します。未知の形式の整数が与えられた場合、これらの方法は通常、小さな因数を取り除くための汎用的な方法の前に適用されます。[ 10 ]例えば、単純な試行除算はカテゴリ 1 アルゴリズムです。
汎用因数分解アルゴリズムは、カテゴリ 2、第 2 カテゴリ、またはKraitchikファミリーアルゴリズムとも呼ばれ、[ 10 ]実行時間は因数分解する整数のサイズのみに依存します。これは、 RSA 番号の因数分解に使用されるタイプのアルゴリズムです。ほとんどの汎用因数分解アルゴリズムは、平方の合同法に基づいています。
数論には、経験的に期待実行時間を持つ多くの整数因数分解アルゴリズムが存在する。
リトルオー記法とL記法で表されます。これらのアルゴリズムの例としては、楕円曲線法と二次篩法があります。また、Schnorr [ 11 ] Seysen [ 12 ]および Lenstra [ 13 ]によって提案されたクラス群関係法もそのようなアルゴリズムの一つで、彼らは未証明の一般化リーマン予想を仮定してこれを証明しました。
Schnorr–Seysen–Lenstra 確率アルゴリズムは、GRH 仮定を乗数の使用に置き換えることにより、 Lenstra と Pomerance [ 14 ]によって期待実行時間がL n [ 1 / 2 , 1+ o (1)]であることが厳密に証明されています。このアルゴリズムは、判別式Δの正の二進二次形式のクラス群G Δを使用します。G Δは、互いに素である整数の 3 つ( a , b , c )の集合です。
因数分解される整数nが与えられたとき、 n はある定数より大きい奇数の正の整数である。この因数分解アルゴリズムでは、判別式Δはnの倍数として選択され、Δ = − dnとなる。ここでd はある正の乗数である。このアルゴリズムは、1 つのdに対してG Δに十分な滑らかな形式が存在することを前提としている。Lenstra と Pomerance は、滑らかさの結果を保証するためにdの選択を小さな集合に制限できることを示している。
P Δを、クロネッカー記号( Δ / q ) = 1を満たすすべての素数qの集合とする。G Δの生成元集合と、 qがP Δに含まれるG Δの素数形式f qを構成することにより、生成元集合とf qの間の関係の列が生成される。q のサイズは、ある定数c 0 に対して c 0 ( log | Δ | ) 2で制限できる。
使用する関係は、G Δの中立要素に等しいべき乗の積の関係です。これらの関係を使用して、 G Δのいわゆる曖昧形式、つまり 2 を割り切る位数のG Δの要素を構築します。Δ の対応する因数分解を計算し、最大公約数を取ることで、この曖昧形式はnの完全な素因数分解を提供します。このアルゴリズムの主な手順は次のとおりです。
nを因数分解する数とする。
任意の正の整数を因数分解するアルゴリズムを得るには、試行除算やヤコビ和判定法などのいくつかのステップをこのアルゴリズムに追加する必要があります。
前述のアルゴリズムは、ランダムな選択を行うため、確率的アルゴリズムです。期待される実行時間は最大でL n [ 1 / 2 , 1+ o (1)]です。[ 14 ]