1から107の範囲のすべての数値を因数分解します。エラトステネスのふるいの修正を使用すると、スペースを使用して1から時間までのすべての数値を因数分解できますn
(O(n*log n)
少し良いと思いますO(n*(log log n)²)
)O(n*log log n)
。それよりも優れているのは、おそらく最小の素因数の配列を作成することです。
// Not very optimised, one could easily leave out the even numbers, or also the multiples of 3
// to reduce space usage and computation time
int *spf_sieve = malloc((limit+1)*sizeof *spf_sieve);
int root = (int)sqrt(limit);
for(i = 1; i <= limit; ++i) {
spf_sieve[i] = i;
}
for(i = 4; i <= limit; i += 2) {
spf_sieve[i] = 2;
}
for(i = 3; i <= root; i += 2) {
if(spf_sieve[i] == i) {
for(j = i*i, step = 2*i; j <= limit; j += step) {
if (spf_sieve[j] == j) {
spf_sieve[j] = i;
}
}
}
}
そのふるいを使用して数を因数分解するにはn > 1
、最小の素因数p
を調べ、因数分解の多重度を決定しn
ます(再帰的に調べるかp
、残りの補因子が均等に分割されなくなるまで単純に除算することで、より高速に依存します)。補因子。補因子が1より大きい間、次の素因数を調べて繰り返します。
素数から整数へのマップを作成する
両方の配列をN
調べ、の各数値について、因数分解の各素数の指数をマップの値に加算し、の数値についてD
は減算します。
マップを確認し、素数の指数が正の場合p^exponent
、配列に入力しN
ます(指数が大きすぎる場合は複数のインデックスに分割する必要があり、値が小さい場合は、複数の素数を1つのエントリに結合します-664579があります素数が107未満であるため、配列内の100,000スロットでは、表示される各素数を正しい累乗で格納するのに十分でない場合があります)、指数が負の場合はD
配列で同じことを行い、0の場合はその素数を無視します。
N
またはの未使用のスロットはD
1に設定されます。