素数かどうかを判定するFunction(2)
素数かどうかを判定するFunction(2)
前回
をちょこっと修正。
割り算の試行は平方根近似値までで良い
高校生が実に明解に説明してくれていた。
富山県立富山東高等学校の諸君、本当にありがとう!!!!!!!!!!!!!!!!
コードの修正
生まれ変わったisPrimeNumber
メソッドがコチラ。
リスト1 標準モジュール
Option Explicit Private Const NOT_NATURAL_NUMBER As String = _ "引数は自然数でなければいけません。" Public Function isPrimeNumber( _ ByVal targetNumber As Long) As Boolean isPrimeNumber = False '1よりも小さな数字を受け取ったらエラーを吐く' If targetNumber < 1 Then _ Call Err.Raise(Number:=10001, _ Source:="Arg is not natural number.", _ Description:=NOT_NATURAL_NUMBER) '1だったらFalse' If targetNumber = 1 Then Exit Function '2だったらTrue' If targetNumber = 2 Then GoTo Finalizer '中央の値までループして合成数判定' '……(*)' Dim turningPoint As Integer 'ループするのは平方根の近似値までで良い' turningPoint = Int(Sqr(targetNumber)) Dim i As Long For i = 2 To turningPoint If targetNumber Mod i = 0 Then Debug.Print i & "で割り切れる。" Exit Function End If Next Finalizer: isPrimeNumber = True End Function
変えたのは、(*)からの4行(コメント行含む)だけ。
前回は単純に真ん中の数字にしていたのを、平方根の近似値にした。
実行結果
何かと話題の(ウソ)「30001
」と「30011
」で実験。
「30001
」は「19
」で割り切れるらしい。
まあ、本当にちゃんと素数判定してくれるものなのかどうなのかは、どのように点検したらよいのか分かりませんけど。
おわりに
平方根を、小数部分を切り捨てて整数化するのに使ったConversion.Int
関数の返り値がInteger
型だったので、変数turningPoint
もInteger
型にしたのだけれど、大丈夫なのかなあ?