JavaScriptで半素数を判定する方法|素因数分解を使ったチェック関数の実装
本記事では、引数として受け取った数値が半素数(semiprime)であるかどうかを判定するJavaScript関数の実装方法を解説します。
半素数とは
半素数とは、2つの素数の積として表される特殊な合成数のことです。例えば、6(= 2×3)、10(= 2×5)、15(= 3×5)、77(= 7×11)などが半素数に該当します。
また、同じ素数同士の積、つまり素数の2乗も半素数として扱われます。4(= 2×2)、9(= 3×3)、25(= 5×5)などがその例です。
判定アルゴリズムの考え方
ある数が半素数かどうかを調べるには、その数を素因数分解し、素因数の個数がちょうど2つになるかを確認します。小さい数から順に割り算を繰り返す「試し割り法」を使えば、効率よく判定できます。
処理の流れ
- カウンター変数を用意し、素因数を見つけるたびにインクリメントする
- 平方根以下の数まで試し割りを行い、割り切れる限り除算を続ける
- ループ後に残った値が1より大きければ、それも1つの素因数としてカウントする
- 最終的にカウントが2であれば半素数と判定する
サンプルコード
以下は、与えられた数値が半素数であるかどうかを判定するJavaScriptのコード例です。
const num = 141;
const checkSemiprime = num => {
let cnt = 0;
for (let i = 2; cnt < 2 && i * i <= num; ++i){
while (num % i == 0){
num /= i, ++cnt;
}
}
if (num > 1){
++cnt;
}
// カウントが2ならtrue、そうでなければfalseを返す
return cnt === 2;
}
console.log(checkSemiprime(num));
コードの解説
- for文の条件:カウントが2未満であり、かつ i の2乗が num 以下である間だけループを続けます。これにより計算量を大幅に削減できます。
- while文:同じ素因数が複数回含まれる場合(例:4 = 2×2)にも正しく対応できます。
- ループ後の判定:num が1より大きいまま残った場合、それは1より大きい素因数であるため、カウントに加算します。
実行結果
コンソールには次のように出力されます。141 = 3 × 47 と素因数分解できるため、true が返されます。
true
まとめ
このように、素因数の個数を数えるシンプルなアプローチで、半素数の判定を効率的に実装できます。暗号理論(RSA暗号など)でも半素数は重要な役割を果たすため、その性質と判定方法を理解しておくと役立ちます。
-
JavaScriptで桁の和が回文数かどうかを判定する関数を作る方法
問題概要今回は、数値 num を第1引数(唯一の引数)として受け取る JavaScript 関数を作成します。この関数は、num の各桁の数字を合計した値が回文数(palindrome number)である場合に true を返し、そうでない場合は false を返す必要があります。例えば、関数への入力が次のようだったとします。const num = 781296;このとき、期待される出力は以下の通りです。const output = true;出力の解説781296 の各桁の和を計算すると、7 + 8 + 1 + 2 + 9 + 6 = 33 となります。33 は左右から読んでも同じ値になる
-
JavaScriptで数値に序数接尾辞(st・nd・rd・th)を追加する方法
問題JavaScriptで関数を作成する必要があります。この関数は、数値 num を最初の(唯一の)引数として受け取ります。関数の役割は、英語の序数表記のルールに従って、数値に「st」「nd」「rd」「th」という接尾辞を追加することです。具体的なルールは以下の通りです。一の位が1で終わる数値には「st」を使用します(例:1st、発音はfirst)一の位が2で終わる数値には「nd」を使用します(例:92nd、発音はninety-second)一の位が3で終わる数値には「rd」を使用します(例:33rd、発音はthirty-third)上記ルールの例外として、下二桁が11・12・13となる数値に