素数判定(再び)
2年ほど前に、素数判定のユーザー定義関数を作ってみた。
infoment.hatenablog.com
見返してみると、改善可能な個所がいくつかあった。この2年で、
私も少し成長したようだ(当社比)。
といっても、改善点は以下の二つのみ。
- 4以上の偶数は素数ではない。
- 偶数で割りきれるかどうかは評価しない。
実際に作成し直したのがこちら。
' 素数判定。 Function IsPrime(num As Long) As Boolean ' 1以下は素数ではない。 If num <= 1 Then Exit Function ' 2と3は素数。 ElseIf num <= 3 Then IsPrime = True: Exit Function ' 2を除く偶数は素数ではない。 ' ※2については直前で判定済み。 ElseIf WorksheetFunction.IsEven(num) Then Exit Function End If Dim i As Long Dim iMax As Long ' 素数判定は、その数の平方根までで可。 iMax = WorksheetFunction.RoundUp(num ^ 0.5, 0) ' この時点で評価するのは奇数のみなので、偶数で ' 割れば必ず奇数の余りがでる。従って奇数でのみ ' 余りを確かめている。 For i = 3 To iMax Step 2 ' iで割り切れる(=iが約数)なら、素数ではない。 If num Mod i = 0 Then Exit Function Next IsPrime = True End Function
過去に作ったものの見直しは、やはり必要かも。
参考まで。