JavaScriptでn番目の素数を効率的に求める方法
本記事では、数値 n を唯一の引数として受け取り、先頭から数えて n 番目の素数 を見つけて返す JavaScript 関数を作成します。
問題の概要
たとえば、n = 6 の場合、素数は「2, 3, 5, 7, 11, 13」の順に並ぶため、出力は 13 になります。
アルゴリズムのポイント
この実装では、以下の工夫によって計算量を抑えています。
- すでに見つけた素数だけを使って素数判定を行う(合成数で割る必要はない)
- 判定対象の平方根まで確認すれば十分という性質を利用する
- 2 以降の候補は奇数のみを順に調べることで無駄な処理を省く
サンプルコード
const findPrime = num => {
let i, primes = [2, 3], n = 5;
const isPrime = n => {
let i = 1, p = primes[i],
limit = Math.ceil(Math.sqrt(n));
while (p <= limit) {
if (n % p === 0) {
return false;
}
i += 1;
p = primes[i];
}
return true;
}
for (i = 2; i <= num; i += 1) {
while (!isPrime(n)) {
n += 2;
}
primes.push(n);
n += 2;
};
return primes[num - 1];
}
console.log(findPrime(6));
console.log(findPrime(16));
console.log(findPrime(66));コードの解説
- primes 配列:最初の素数 2 と 3 をあらかじめ格納し、以降見つかった素数を順次追加していきます。
- isPrime 関数:既知の素数列を使って割り算を行い、√n 以上の約数を持たなければ素数と判定します。Math.ceil(Math.sqrt(n)) で判定の上限を設定しています。
- メインループ:5 から始めて奇数のみを +2 ずつ調べながら素数を見つけ、配列に追加します。
実行結果
コンソールには以下のように出力されます。
13 53 317
このように、findPrime 関数は任意の n に対して正しく n 番目の素数を返します。素数判定を既知の素数だけで行うこのアプローチは、単純な全数チェックよりも効率的で、大きな n に対しても実用的な速度で動作します。
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実
-
C++でn!に含まれる素数pの冪指数を求める方法
問題概要この問題では、数値 n と素数 p が与えられます。求めるのは、n!(nの階乗)に含まれる素数pの冪指数、つまり n! を素因数分解したときに p が何回掛けられているかです。具体例で確認してみましょう。入力 : n = 6, p = 2出力 : 4この場合、6! = 720 であり、その素因数分解は次のようになります。720 = 2 × 2 × 2 × 2 × 3 × 3 × 52の個数は4つなので、出力は 4 となります。解決アプローチ(ルジャンドルの公式)最も単純な解法は、実際に n! の値を計算して素因数分解することですが、n が大きくなると階乗の値は爆発的に増大するため現実的