わたしの日常に価値はありますか?

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

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

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

マクロを書く準備早速マクロを書こうと思ったんですが、マクロって何?食えんの?って人もいると思うんで、丁寧に行こうかな、と。マクロってのは、通常は人間の手でやるような作業を、プログラムを書くことで機械に自動的にやらせるってことです。Excelの場合はVBA(Visual Basic for Application)という言語を使ってマクロを書きます。まずはその準備を。Excelを起動すると、ワークシートが現れます。ここでキーボードの「ALT+」を押してください。はキーボードの上方にあるファンクションキーの11番です。すると、このウィンドウが開...
0日目 マクロを書く準備をしよう【30日間1日1本マクロ生活】 - わたしの日常に価値はありますか?

素数

今日は素数のお話です。

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

30日間1日1本マクロ生活、13日目です。マクロを書く準備は、0日目に記事を書きました。エラトステネスの篩中学校や高校の数学で、エラトステネスの篩について学習しませんでしたか? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 301から30までの整数を表にしてみました。まず1を消します。 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30次に2を残し、...
13日目 エラトステネスの篩(ふるい)を知ってますか?【30日間1日1本マクロ生活】 - わたしの日常に価値はありますか?
30日間1日1本マクロ生活、14日目です。マクロを書く準備は、0日目に記事を書きました。素数の判定昨日は、エラトステネスの篩で100以下の素数だけを表に残すということをやりました。そのときに残った表がこれです。この表に残っているのは、素数だけです。そして、意図的に数字6個で改行をしています。6で割って1余る数と5余る数どうですか。2と3以外の素数は、6で割って1余る数と、6で割って5余る数だけが残っているのが分かりますか?そりゃそうですよね。素数というのは、1と自分自身以外では割り切れない数です。6の倍数は、当た...
14日目 素数の判定【30日間1日1本マクロ生活】 - わたしの日常に価値はありますか?
30日間1日1本マクロ生活、15日目です。30日の半分、15日目までたどり着きました。頑張って続けることができています。マクロを書く準備は、0日目に記事を書きました。素数の判定昨日は、2と3以外の素数はすべて6で割って1余る数か5余る数のどちらかだという話をしました。さらに、自分自身の平方根よりも小さい全ての数で割り切れなければ、その数は素数だという話をしました。Functionここまで、マクロを書くときは「Sub」で始まって「End Sub」で終わるというお話をしていました。今日のマクロはSubの代わりに「Function」で始まりま...
15日目 素数を判定する関数を作ろう【30日間1日1本マクロ生活】 - わたしの日常に価値はありますか?

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

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 

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


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

解説します。

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日間、頑張ります。

モバイルバージョンを終了