素数判定は、その値の平方根まで確認すればいい(ついでにPython)

昨日、素数判定は「その数の半分まで約数が存在しないことを確認すればいい?」という考えで関数を作成してみた。
infoment.hatenablog.com

これについて複数の方から、「平方根(ルート)まで確認すればOK」と教えていただいた(ありがとうございます)。

そこで、昨日の関数を改修してみる。
f:id:Infoment:20200504172827p:plain

といっても、直す部分は一か所。
変更前:num / 2
変更後:num ^ 0.5

結果、このようになった。

Function 素数判定(num As Long) As Boolean
    Dim i As Long
        If num <= 1 Then
            素数判定 = False
        ElseIf num = 2 Then
            素数判定 = True
        Else
            For i = 2 To WorksheetFunction.RoundUp(num ^ 0.5, 0)
                If num Mod i = 0 Then
                    素数判定 = False
                    Exit Function
                End If
            Next
            素数判定 = True
        End If
End Function

たったこれだけなのに、効果は劇的だ。例えば「10007」を評価するとき、
【評価の回数】
変更前:5003回
変更後:101回

ということで、桁違いに早くなっている。

いつもならここで終わりなのだが、一か所変えただけでは余りに味気ない。
ということで、先日仲間内で勉強した「python」で再現してみた。
f:id:Infoment:20200504173720p:plain

↓ 結果はこちら。
f:id:Infoment:20200504173752p:plain

VBAで言うところの「Exit Function」をどう書けばよいか分からず、フラグを一つ立ててしまった。

今後も、「VBAならこうで、pythonならこう」のように対比して書くことで、自身の学習に繋げたい。

(有言不実行の恐れ大)

参考まで。