合成数(n > 3)が与えられ、次のように書くことができると仮定しn = a*b
ます。ここで、aとbは任意の整数です。
今、私たちの仕事は、の値を計算することである&Bを関数があるよう、最小限に抑えます。。f(a,b) = |a-b|
int n;
cin >> n; // Take it from the user
/* Now, find the value of the a and b */
int a = 1;
int b = n;
int temp_a;
int temp_b;
for(temp_a=1; temp_a<=sqrt(n); temp_a++) {
if(n % temp_a == 0) {
temp_b = n / temp_a;
if((temp_b - temp_a) < (b - a)) {
b = temp_b;
a = temp_a;
}
}
}
print a and b
sqrt(N)以下のNの最大除数を見つけたいとします。これを行う最も簡単な方法は、考えられるすべての除数を反復処理してチェックすることです。最悪の場合、O(sqrt(N))時間がかかります。
残念ながら、最悪の場合、O(log N)時間でこの問題を解決する方法はありません。実際、どのpについてもO((log N)^ p)時間でもそれを行うことはできません。可能であれば、バイト単位のサイズの多項式時間で任意の数の素因数分解を見つけることができることを示すのは簡単です。現在、誰もそれを行うことはできません。また、広く使用されているRSA暗号システムがあります。これは、数値をそれほど速く因数分解できないという事実に強く依存しています。それが、誰もが量子コンピューターをとても恐れている理由の1つです=)
ただし、O(sqrt(N))よりも漸近的に高速なアルゴリズムがあります。また、因数分解のためのより高速なヒューリスティックアルゴリズムがいくつかあります。この問題に関するウィキペディアの記事を読むことを強くお勧めします。
複雑さをわずかに改善する方法の1つは、sqrt(N)までのすべての素数を事前計算することです。あなたが分割しようとする場合は、Nをそれらだけで、あなたはの素因数分解を見つけることができるだろうNを。素因数分解がわかっているので、再帰検索を使用して、考えられるすべての除数を効率的に反復できます。階乗の検索には、チェックされている素数と同じくらいの時間がかかります。つまり、O(sqrt(N)/ log(N))です。すべての除数を反復処理するには、それらの約数の数に比例する時間がかかります。これは、Nのどの多項式よりも漸近的に短くなります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加