素数かどうかを判定するFunction(2)

素数かどうかを判定するFunction(2)

前回

akashi-keirin.hatenablog.com

をちょこっと修正。

割り算の試行は平方根近似値までで良い

高校生が実に明解に説明してくれていた。

www.higashi-h.tym.ed.jp

富山県立富山東高等学校の諸君、本当にありがとう!!!!!!!!!!!!!!!!

コードの修正

生まれ変わった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」で実験。

f:id:akashi_keirin:20190601074922j:plain

30001」は「19」で割り切れるらしい。

まあ、本当にちゃんと素数判定してくれるものなのかどうなのかは、どのように点検したらよいのか分かりませんけど。

おわりに

平方根を、小数部分を切り捨てて整数化するのに使ったConversion.Int関数の返り値がInteger型だったので、変数turningPointInteger型にしたのだけれど、大丈夫なのかなあ?