妻が、料理用の篩(ふるい)が欲しいと言うので、インターネットで検索してみました。すると、素数判定
アルゴリズム「
エラトステネスの篩」というページが目に飛び込んできました。
ソフトウェア開発技術者受験時に、ソートや探索など、様々な古典的アルゴリズムを勉強しましたが、エラトステネスの篩というのは、恥ずかしいことに聞いたことがありませんでした。なんでも、
ヘレニズム時代(紀元前200年頃)のギリシア人学者であるエラトステネスが考案したもので、要約すると、以下のようなものらしいです。
与えられた数(n)までの素数を見つける~エラトステネスの篩
① 2からnまでの数値をリストアップする。
② pに2を代入
③ pより大きく、n以下のpの倍数をリストから間引く(つまり、pは間引かない)
④ ③で間引かれなかった数値のうち、pの次に小さい数を、新たなpとする
⑤ pの2乗がn以下の場合、③に戻る
⑥ ここまでで間引かれなかった数が、n以下の素数すべてである
ほほぅ、これは
面白そう
にわか庭師は技術屋魂をくすぐられてしまいました。。。では、
EXCELのVBA(マクロ)でプログラミングしてみますか。。。
Sub Eratosthenes()
'概要:ユーザから入力された数値以下の素数を求め、A列に表示する
'作者:つんつん
'''計算用の変数宣言
Dim flg() As Boolean '素数かどうかを格納する
'素数ではないと判明するとTrueになる
Dim n As Long 'ユーザが入力した数値を格納
Dim p As Long '未検証の最小の数値を格納
Dim q As Long 'pの倍数(素数でない、除去すべき数)を格納
'''表示用の変数宣言
Dim r As Long '素数出力用添字
Dim s As Long '行用添字
'''初期処理 sheetのクリア
Cells.Select
Selection.ClearContents
Range("A1").Select
'''調べる数値を受け取る
n = CLng(InputBox("入力した数以下の素数をすべて出力します。" _
& "数を入力してください。"))
'''2より小さい素数は存在しないので、終了
If n < 2 Then
MsgBox "該当する素数は存在しません。"
Exit Sub
End If
'''エラトステネスの篩 本処理
p = 2
ReDim flg(n) '素数かどうかのフラグ用の配列の大きさ確定
'初期値は False
Do Until p * p > n '探索終了条件 入力値よりも
'未検証数値の平方が大きくなると終了
If flg(p) = False Then 'フラグがFalseなら
q = p * p 'その倍数を篩にかける
Do Until q > n 'その数の倍数>入力値 になるまで
flg(q) = True '素数ではないと判定
q = q + p '倍率を上げる
Loop
End If
p = p + 1 '次の検証値へ
Loop
'''セルへの表示処理
s = 1 '表示行の初期化
For r = 2 To n '配列を巡回する
If flg(r) = False Then 'フラグがFalse なら素数
Range("A" & s).Select 'A列に書き出し
ActiveCell.FormulaR1C1 = r
s = s + 1 '次の行へ
End If
Next r
'''終了メッセージ
MsgBox "A列に " & n & "以下の素数を表示しました。"
End Sub
これ、
ちゃんと動きますよ
遊び方は以下のとおりです。
①EXCELを起動して、ツール→マクロ→Visual Basic Editor を選択
②左側のThisWorkBookをダブルクリックして、白い入力画面を表示させる
③Sub Eratosthenes() から End Sub までをコピーして②の画面に貼り付け
④EXCELのSheetに戻って、ツール→マクロ→マクロの実行
⑤ThisWorkbook.Eratosthenes を選択して実行ボタンをクリック
⑥数値をきいてくるので、そこに任意の数値を入力
⑦⑥で入力された数値以下の素数をA列にひたすら表示
…で、何が面白いって?
単なる自己満足です。ただ、情報処理の勉強してる人は、知ってて損はないかもしれませんよ
←クリックしてみてください!