素数判定(再び)

2年ほど前に、素数判定のユーザー定義関数を作ってみた。
infoment.hatenablog.com
見返してみると、改善可能な個所がいくつかあった。この2年で、
私も少し成長したようだ(当社比)。
f:id:Infoment:20220301230026p:plain

といっても、改善点は以下の二つのみ。

  1. 4以上の偶数は素数ではない。
  2. 偶数で割りきれるかどうかは評価しない。

実際に作成し直したのがこちら。

' 素数判定。
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

f:id:Infoment:20220301230657p:plain

過去に作ったものの見直しは、やはり必要かも。

参考まで。