JavaScriptで素数と素数の日を判定
JavaScript を使って素数判定をしてみます。数学的に言えばいろいろ効率の良い方法は存在するのですが、普通の方法で判定してみます。遊べる範囲での判定はできるようになったと思っています。
ただ素数を判定するだけではあまり面白くないので、自動で素数の日まで判定してみました。

素数判定
素数とは「1と自分自身以外の約数を持たない数」なので、簡単に言うと「2以上の整数で割り切れない数」、つまり「2以上の数で割って余りが0になることのない数」(ただし、2を除く)です。
JavaScript
function primeNumber (num) {
//2 は素数なので true を返す
if(num === 2) {
return true;
} else {
for(i = 2; i < num; i++) {
//2以上の数で割ったとき余りが0になれば false を返す。つまり素数ではない。
if(num % i === 0) {
return false;
break;
}
//ループが最後まで行く、つまり割れる数がなかったら true を返す。つまり素数。
if(i + 1 === num) {
return true;
}
}
}
}
//使い方
primeNumber(101) //→ true
primeNumber(100) //→ false
true か false を返す関数です。数値であるかなどの判定はしていません。
1は素数ではないのですが、上の関数の場合1を入れると undefined が返ってきます。厳密にしたい場合は1も if 文などで判定してください。
デモ
下のテキストボックスに数値を入れると素数であるかを判定します。
20161007 は素数である。
あまりに大きな数値は JavaScript の制限上判定ができません。仕様なので仕方がないです。
素数の日を判定
例えば、2016年10月3日であれば、「3」「1003」「20161003」を素数かどうか自動で判定するコードを書きました。結果は下に出ています。
今日は素数の日?
上の関数を使って素数判定を行っています。
まとめ
JavaScript の制限上あまり大きな数字は素数判定ができません。ですので実用的?ではないかもしれませんが JavaScript でも数学チックなことはできますね。
最初に書いたように判定の仕方は効率があまりよくないです。例えば「2以上のすべての数」で割るのではなく「2と3以上の奇数」で割れば素数であるかの判定は十分です。ループも半分の量になります。こんな感じでまだ効率化をはかれるコードですがとりあえずこの記事ではこれで良しとします。