JavaScriptで指定範囲内の特定の距離を持つk-素数ペアを見つける方法
k-素数(K-Prime)とは
自然数のうち、素因数を重複込みで数えてちょうどk個持つものを「k-素数(k-prime)」と呼びます。
たとえば4の場合、素因数は2だけですが、4 = 2 × 2 と分解できるため、2が2回カウントされます。このことから4は2-素数であるといえます。
同様に、8 = 2 × 2 × 2 と3つの素因数に分解できるため、8は3-素数ということになります。
問題の概要
今回は、次の3つの引数を受け取るJavaScript関数を実装します。
- k:素因数の個数(重複込み)
- step:求めるペア間の距離(間隔)
- range:探索対象となる範囲[開始値, 終了値]
この関数は、指定された範囲内に存在し、かつ互いの距離がちょうどstepと一致するk-素数のペアを「配列の配列」として返す必要があります。
コード例
以下が実際のコードです。
const k = 2;
const step = 2;
const range = [0, 50];
const kPrimeSteps = (k = 1, step = 1, [start, end]) => {
const res = [];
let i = start;
const findLen = (n = 1) => {
let count = 0, i = 2;
while (i * i <= n) {
while (n % i === 0) {
count++;
n /= i;
}
i++;
}
if (n > 1) count++;
return count;
}
while (i <= end - step) {
if ((findLen(i) == k && findLen(i+step) == k))
res.push([i, i+step]);
i++;
}
return res;
};
console.log(kPrimeSteps(k, step, range));アルゴリズムのポイント
内部関数 findLen(n) は、試し割り法によってnの素因数の個数(重複込み)を求めます。2から√nまで順に割り切れるかどうかを確認しながらカウントし、最後に残った1より大きい数も素因数として加算します。これにより、効率よくk-素数かどうかを判定できます。
続いて、start から end − step まで各数値iについて「i自身」と「i + step」の両方がk-素数であるかをチェックし、条件を満たす場合はペアとして結果配列に追加していきます。
出力結果
上記のコードを実行すると、コンソールには以下が出力されます。
[ [ 4, 6 ], [ 33, 35 ] ]
この結果から、範囲0〜50の中で距離2を持つ2-素数のペアは [4, 6] と [33, 35] の2組であることがわかります。
- 4 = 2 × 2(2-素数)、6 = 2 × 3(2-素数)→ 距離2 ✓
- 33 = 3 × 11(2-素数)、35 = 5 × 7(2-素数)→ 距離2 ✓
このように、素因数の個数判定と間隔チェックを組み合わせることで、任意の範囲・距離・kの値に対応した柔軟な検索処理を実現できます。
-
JavaScriptで指定範囲内の「逆さま数字(Upside Down Numbers)」を数える方法
逆さま数字(Upside Down Numbers)とは?180度回転させても元の数字と同じように見える数字のことを「逆さま数字」と呼びます。例えば、「9116」や「69」などが該当します。これは次の桁だけが回転しても有効だからです。0 → 01 → 16 → 98 → 89 → 6一方、2・3・4・5・7は回転すると別の記号や無効な形になってしまうため、これらが含まれる数字は逆さま数字にはなりません。問題2つの数値からなる範囲の配列を受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在するすべての逆さま数字の個数を返さなければなりません。コード例以下が
-
JavaScriptで指定した範囲内にある「ある数で割り切れる数」の個数を求める方法
問題2つの整数からなる範囲(配列)を第1引数に、1つの数値を第2引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在する「入力された数値で割り切れる数」をすべて見つけ、その合計個数を返します。サンプルコード以下がその実装例です。const range = [6, 57]; const num = 3; const findDivisibleCount = (num = 1, [l, h]) => { let count = 0; for(let i = l; i <= h; i++