JavaScriptで特定の数までの素数をすべて列挙する方法
はじめに
本記事では、数値 n を受け取り、n 以下に存在するすべての素数を配列として返すJavaScript関数の実装方法を解説します。素数判定のロジックと、それを活用した一括取得の手法を順を追って見ていきましょう。
問題の概要
例えば、入力された数値 n が 24 の場合、期待される出力は以下の通りです。
const output = [2, 3, 5, 7, 11, 13, 17, 19, 23];
このように、24以下の素数だけを抽出した配列が得られれば成功です。
実装コード
処理は大きく分けて2つの関数で構成します。
- isPrime関数: 引数の数値が素数かどうかを判定するヘルパー関数。2から num / 2 + 1 未満まで順に割り切れるかを確認し、1つでも割り切れる数があれば false を返します。
- primeUpto関数: 指定した数値までの素数を格納した配列を返します。2未満の数値が渡された場合は空配列を返し、初期値として [2] を持った配列に対して、3以降の数値を順番に素数判定しながら追加していきます。
具体的なコードは以下の通りです。
const num = 24;
const isPrime = num => {
let count = 2;
while(count < (num / 2)+1){
if(num % count !== 0){
count++;
continue;
};
return false;
};
return true;
};
const primeUpto = num => {
if(num < 2){
return [];
};
const res = [2];
for(let i = 3; i <= num; i++){
if(!isPrime(i)){
continue;
};
res.push(i);
};
return res;
};
console.log(primeUpto(num));実行結果
上記のコードをコンソールで実行すると、以下のように出力されます。
[
2, 3, 5, 7, 11,
13, 17, 19, 23
]補足:より効率的な判定について
今回の isPrime 関数は試し割り法を採用しており、判定範囲を num / 2 までに絞ることで計算量を抑えています。さらに効率化したい場合は、判定範囲を √num までに縮めることで、大きな数値に対しても高速に動作させることが可能です。また、大量の素数を一度に求めたいケースでは「エラトステネスのふるい」と呼ばれるアルゴリズムを検討するのも有効です。
-
JavaScriptで1からnまでのすべての数値で割り切れる最小の数値を求める方法
問題 数値 n を引数として受け取る JavaScript 関数を作成する必要があります。この関数は、1 から n までのすべての整数で割り切れる最小の正の整数を求めて返します。 実は、この問題は数学における「最小公倍数(LCM)」を求める問題と同じです。1 から n までのすべての数値の最小公倍数こそが、求めるべき答えとなります。 例 n = 10 の場合を考えてみましょう。2520 という数値は、1・2・3・…・10 のすべての数値で余りなく割り切ることができる、最も小さい数値です。 以下のコードを見てみましょう − const num = 11; const smallestDivis
-
JavaScriptで指定した間隔(ギャップ)を持つ2つの素数のペアを見つける方法
問題 数値 gap を第一引数として、また2つの数値からなる範囲配列を第二引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在し、かつ絶対差が gap と一致する素数のペアを見つけて返すものです。 例えば、gap = 4、範囲が [20, 200] の場合、「37」と「41」はどちらも素数であり、その差はちょうど4であるため、条件を満たすペアとなります。 解決のアプローチ この問題は以下のステップで解決できます。 素数判定: 与えられた数が素数かどうかを判定するヘルパー関数を用意します。 素数の収集: 指定された範囲内のすべての素数を配列に