素数判定は、その値の平方根まで確認すればいい(ついでにPython)
昨日、素数判定は「その数の半分まで約数が存在しないことを確認すればいい?」という考えで関数を作成してみた。
infoment.hatenablog.com
これについて複数の方から、「平方根(ルート)まで確認すればOK」と教えていただいた(ありがとうございます)。
そこで、昨日の関数を改修してみる。
といっても、直す部分は一か所。
変更前: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」で再現してみた。
↓ 結果はこちら。
VBAで言うところの「Exit Function」をどう書けばよいか分からず、フラグを一つ立ててしまった。
今後も、「VBAならこうで、pythonならこう」のように対比して書くことで、自身の学習に繋げたい。
(有言不実行の恐れ大)
参考まで。