19日目 10001番目の素数【30日間1日1本マクロ生活】




30日間1日1本マクロ生活、19日目です。

マクロを書く準備は、0日目に記事を書きました。

素数

今日は素数のお話です。

素数については13日目から15日目にかけて話をしました。

そこでエラトステネスの篩を使って素数の分布を示したんですけど、素数の現れ方って規則性がないんですよね。

2の次は3。次は1つ飛んで5。1つ飛んで7。3つ飛んで11。また1つ飛んで13。3つ飛んで17。1つ飛んで19。3つ飛んで23。5つ飛んで29。

素数を返す関数って、今のところ無いんですよね。とても難しいんです。

10001番目の素数

素数を返す関数がないので、10001番目の素数を見つけようと思ったら、頭から順に数えていくしかありません。

こんな時こそ機械の出番です。

Excelのマクロにやってもらいましょう。

さっそくコードを

まずは15日目の素数の判定の関数。


Function sosu(n)
    If n <= 1 Then sosu = False: Exit Function
    If n = 2 Or n = 3 Or n = 5 Then
        ans = True
    ElseIf n Mod 2 = 0 Or n Mod 3 = 0 Then
        ans = False
    Else
        ans = True
        k = 5
        c = 2
        l = n ^ 0.5
        Do While k <= l
            If n Mod k = 0 Then
                ans = False
                Exit Do
            End If
            k = k + c
            c = 6 - c
        Loop
    End If
    
    sosu = ans
End Function

そして今日のメイン、素数の分布です。


Sub 素数の分布()
    n = 3
    k = 5
    c = 2
    Do
        k = k + c
        c = 4 - c
        If sosu(k) Then n = n + 1
        
    Loop While n <= 100000
    
    Cells(1,1) = k
End Sub

解説します。

2と3と5は初めから素数としてカウントします。

7からスタートし、6で割って1余る数と5余る数について素数の判定をし、素数であればnに1を足します。

nの値が10000を超えたらループから抜けます。

今日のループは、DoのところではなくLoopのところに条件を書いています。この書き方もOKです。

実行結果

マクロを記述するウィンドウの「Sub」と「End Sub」の間にカーソルを置いて、画面上方の再生ボタン的なアイコン(右向きの三角形)をクリックするか、[F5]キーを押して実行します。

実行結果はセルA1に10001番目の素数が表示されるだけですので、今日はスクリーンショットは省略します。

めでたく10001番目の素数である104743が表示されました。

驚いた結果

実は、以前この問題を解いて、この答えを見たときにすごく驚いたんです。

この問題は、まさに私が解くためにあったんだなあ、と。

というのも、わたしの誕生日は昭和47年4月3日。

「4743」という数字をいろんな所でわたしは使っているんですが、今回の答えが「104743」。

偶然にしちゃ、出来すぎてませんか?

10001番目の素数は、わたしの素数なんです。はい。

Excelは便利

悔しいですが、Excelは便利です。

Microsoftにお金を払うのは癪でしょうがないんですが、Excelばかりは仕方がない。

マクロを書くようになると、Excelからは離れられないですね。

30日間、頑張ります。