【VBA】素数を書き出すプログラム
今回は素数を書き出すサンプルプログラムを紹介します。
VBAに慣れ始めると、ちょっと遊んでみたくなることがあります。
そんなときに素数の計算などは少しホネがあって、面白いと思います。
この記事では、素数を計算する単純なアルゴリズムと、素数を書き出すプログラムをお見せします。
自分でやってみたいという方はアルゴリズムを見て、素数を出力するプログラムを作成してみてください。
(プログラムは後で答え合わせとしてはみてはどうでしょうか)
素数を判定するアルゴリズム
先に、値が素数かどうかを判定するアルゴリズムについて簡単に説明します。
ここで説明する方法をプログラムで使います。
2, 3, …√Nで割り切れるか調べる
1とその数自身との外には約数がない正の整数。
素数の定義はこのようになります。
2, 3, …と割る値を増やしていって、割り切れる値がないかを確認します。割り切れなければ素数です。
単純な方法なのですが、ポイントとなるのは割る値をどこまで確認する必要があるかです。
素数か確認する値をNとします。2,3,…,Nまで割って割り切れる値がNだけであればNは素数と分かります。
ですが、実際はNまで調べる必要はなく、√Nまで確認できればOKです。
割り切れるということはN = a * b が成り立ちます。
もし、aが√Nよりも大きな値だとすると、bは√Nより小さな値となります。
そのため、a=2,3,…と順番に増やしていったとして、もしNが√Nより大きな値aで割り切れるなら、それに対応する√Nより小さな値bが存在します。
Nを割る数は、2,3,…と順番に増やしているので、この小さな値bに先に到達するはずです。
そのため、√Nで割り切れるかを確認できたら終わりで、割り切れなければ素数であることが確定します。
素数を書き出すプログラム
Sub OutPutPrimeNumber()
'''素数をシート上に書き出す
Dim out_row As Long
Dim n As Long
''1~1000の中にある素数だけ書き出す
For n = 1 To 1000
If IsPrimeNumber(n) Then
out_row = out_row + 1
Cells(out_row, 1) = n
End If
Next
End Sub
Function IsPrimeNumber(n As Long) As Boolean
'''nが素数であるか判定する
If n = 1 Then IsPrimeNumber = False: Exit Function '1は素数でない
If n = 2 Or n = 3 Then IsPrimeNumber = True: Exit Function '2と3は素数
If n Mod 2 = 0 Then IsPrimeNumber = False: Exit Function '2で割り切れる⇒素数でない
''2で割れないことを確認済なので奇数のみ確認
Dim i As Long
For i = 3 To n Step 2
''割り切れたら素数でない
If n Mod i = 0 Then IsPrimeNumber = False: Exit Function
''iが√Nより大きいなら素数
If i > n ^ (1 / 2) Then IsPrimeNumber = True: Exit Function
Next
End Function
このプログラムを実行すると、シート上に1~1,000の間にある素数が順番に書き出されます。
素数判定はIsPrimeNumberという関数で行っています。
ステップ実行して、どのような処理をしているか調べてみてください。