エラトステネスのふるい
2329 ワード
少数
1課自分を弱点とするすべての自然数(2,3,5,7,11...)と言います.
よくある素数判別方法
一般に、小数は以下のように判別できる.function isPrime(x) {
for (let i = 2; i < x; i++) {
if (x % i === 0) return false;
return true;
}
}
console.log(isPrime(100));
console.log(isPrime(99));
2から、自分の1つの数字を発見すれば、少数ではありません.
しかし、この方式は2から自分の直前まで、すべての状況が順番に確認され、時間の複雑さはO(N)であり、効率的ではない.
より効果的な方法
一般的に、すべての数の約数は対称です.例えば、10は2 x 5 = 5 x 2
であり、約数対称である.
ここから,数値の平方根が弱いかどうかを検証するだけで少数を判別できることが分かる.function isPrime(x) {
let end = Math.sqrt(x);
for (let i = 2; i < end; i++) {
if (x % i === 0) return false;
return true;
}
}
console.log(isPrime(100));
console.log(isPrime(99));
特定の数字の平方根のみをチェックしても,約数の対称性に基づいて少数の判別が可能である.
エラトステネスのふるい
一度に大量の少数を判別するには、より効果的な方法が必要です.このとき使っているのがエラトステネスのふるいです.
100以下の小数を探します.
function isPrime(x) {
for (let i = 2; i < x; i++) {
if (x % i === 0) return false;
return true;
}
}
console.log(isPrime(100));
console.log(isPrime(99));
function isPrime(x) {
let end = Math.sqrt(x);
for (let i = 2; i < end; i++) {
if (x % i === 0) return false;
return true;
}
}
console.log(isPrime(100));
console.log(isPrime(99));
一度に大量の少数を判別するには、より効果的な方法が必要です.このとき使っているのがエラトステネスのふるいです.
100以下の小数を探します.
これで少数を求めた.
ウィキペディアが提供する画像の説明。
エラトネスのふるいは任意の自然数N以下の少数の方法の中で最も簡単で最も速い方法を探す.
JavaScriptで実現
JavaScriptでエラトステネスの体を実現.
function eratosthenesSieve(array, number) {
let tempArray = [];
for (let i = 2; i <= number; i++) {
tempArray[i] = i;
}
for (let i = 2; i <= number; i++) {
if (tempArray[i] === 0) continue;
for (let j = i + i; j <= number; j += i) {
tempArray[j] = 0;
}
}
for (let i = 2; i <= number; i++) {
if (tempArray[i] !== 0) {
array.push(tempArray[i]);
}
}
return array;
}
let result = [];
console.log(eratosthenesSieve(result, 100));
[2,3,4,5,6…98,99,100]
少数ではないので.
[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 ]
これで少数しか残っていない.
Reference
この問題について(エラトステネスのふるい), 我々は、より多くの情報をここで見つけました https://velog.io/@arthur/에라토스테네스의-체テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol