第10講 Sub プロシージャと Function プロシージャの呼び出し
第6話 素数判定プログラムの改良
実は前回改良した素数判定プログラムはまだ改良の余地があります。
3から対象の整数のルートまですべての奇数で割っていますが、
割るべき数は実は、対象の平方根以下の素数のみでよいのです。
例えば、161が素数であるかは、
3,5,7,11,13,17,19,23,29,31,37のみで割れなければ素数であると判定してよいのです。
素数判定プログラムでは
3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39
で割って調べていますからいかに無駄が多いかわかります。
それで判明している素数を蓄えておいてそれで割るようにプログラムを改良しましょう。
Dim sosuu(2000) As Integer
Dim sousuu As Integer
Private Sub CommandButton1_Click()
Dim i As Integer
Dim h As Integer
Dim sousuua As Integer
Dim sousuus As Integer
sousuu = 1
sosuu(sousuu) = 2
Cells(5, 1) = "1から10,000までの素数個数="
Cells(6, 1) = 2
For i = 3 To 10000 Step 2
h = sosuuhantei(i)
If h = 1 Then
sousuua = sousuu Mod 20
sousuus = Int(sousuu / 20)
Cells(6 + sousuus, 1 + sousuua) = i
sousuu = sousuu + 1
sosuu(sousuu) = i
Cells(5, 6) = sousuu
End If
Next
End Sub
Function sosuuhantei(g As Integer)
Dim i As Integer, h As Integer, o As Integer
sosuuhantei = 1
o = Int(Sqr(g))
For i = 2 To sousuu
If sosuu(i) > o Then Exit For
If g Mod sosuu(i) = 0 Then
sosuuhantei = 0
Exit For
End If
Next
End Function
このようにして素数判定改良プログラムができます。