エラトステネスのふるいを使ってJavaScriptで素数を求める方法
JavaScriptで、ある数値 n を受け取る関数を作成する必要があります。
この関数は、1から n までの間に存在するすべての素数を配列として返します。
アルゴリズムの考え方
まず、与えられた数値と同じ大きさの配列を作成し、すべての値を true で初期化します。この配列のインデックスが「素数の候補」を表し、最初はすべてが素数候補(true)であるという状態になります。
次に、2から与えられた数値の平方根まで繰り返す for ループを作成します。合成数(整数の積)は定義上素数になり得ないため、各 i の倍数にあたるインデックスを false に設定していきます。0 と 1 は、それらで割り切れるかどうかは素数判定に影響しないため、あらかじめ除外しておきます。
最後に、false の値をすべて除外すれば、残ったものが求める素数のリストとなります。
コード例
const num = 100;
const findPrimes = (num = 10) => {
const numArr = new Array(num + 1);
numArr.fill(true);
numArr[0] = numArr[1] = false;
for (let i = 2; i <= Math.sqrt(num); i++) {
for (let j = 2; i * j <= num; j++){
numArr[i * j] = false;
}
}
return numArr.reduce((acc, val, ind) => {
if(val){
return acc.concat(ind);
}else{
return acc;
};
},[]);
};
console.log(findPrimes(num));出力結果
コンソールには以下のように出力されます。
[
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
]処理のポイント
このアルゴリズムでは、内側のループの上限を「与えられた数値の平方根」までとしている点が重要です。ある数が合成数であれば、必ずその平方根以下の約数を持つため、平方根まで調べれば十分に素数判定が完了します。これにより、全ての数を個別に判定する方法と比べて計算量を大幅に削減でき、効率的に素数を列挙できます。
-
Firebugを使ったJavaScriptデバッグ徹底ガイド|基本機能から実践手順まで
デバッグとは何か デバッグとは、ソフトウェアから欠陥(バグ)を体系的に取り除くプロセスのことです。作業はテストケースの実行から始まります。テストケースを実行すると、実際の結果と期待される結果が比較され、両者に不一致があれば根本原因の分析が行われます。さらに、リグレッションテストなどの追加テストを実施することで、結果が期待どおりのラインに沿っていることを確認します。 静的なWebページの作成にはHTMLが広く使われています。一方、動的なWebアプリケーションを開発するには、Webのスクリプト言語であるJavaScriptが欠かせません。コードをバグのない状態に保つため、プログラマーはさまざまなデ
-
JavaScriptのimportで波括弧「{}」を使う理由とは?名前付きエクスポートの基本をわかりやすく解説
JavaScript(ESモジュール)でモジュールを読み込む際、import 文に波括弧 { } を付けるかどうか迷ったことはありませんか?実はこの波括弧は、名前付きエクスポート(named export)を読み込むために必要な記法です。本記事では、実際のコード例を使いながら、{ } の役割と使い方を詳しく解説します。 importで { } を使う場面とは JavaScriptのESモジュールでは、エクスポート方法によって読み込み側の書き方が変わります。 名前付きエクスポート:export { 関数名 } のようにエクスポートされたものを読み込む場合は、import { 名前 } fro