どうも、えんちゃです。まぁまぁマイナーなのきましたね。
世の中で何パーセントの人が知っている言葉なのでしょうか。
今回は、前後半に分けて、前半ではウラムの螺旋の概要と、素数判定プログラムについて
後半では、並べるプログラムと完成品について書いていきます。
ウラムの螺旋とは
まず、ウラムの螺旋を作るためにウラムの螺旋の理解を深めていきましょう。
ウラムの螺旋
つまり、数字を図のようならせん状に並べていき、
素数を塗りつぶすと、完全にランダムに出現すると思われていた素数に、規則性らしきものが出てくるという書き方です。
これをエクセルVBAで作れるようにしていきましょう。
素数判定
まず、綺麗に並べたとしても素数を塗りつぶさなければ話が進まないので、
まずは素数を判定する関数から作っていきましょう。
引数の数字が素数ならばTrueを返し、素数以外ならばFalseを返す関数を作っていきます。
まずはVBAから…
'素数判定' Private Function primaryNumber(num) As Boolean Dim i As Integer '1' If (num <= 1) Then primaryNumber = False Exit Function End If '偶数' If (num = 2) Then primaryNumber = True Exit Function ElseIf (num Mod 2 = 0) Then primaryNumber = False Exit Function End If '奇数チェック' primaryNumber = True For i = 3 To Math.Sqr(num) Step 2 If (num Mod i = 0) Then primaryNumber = False Exit Function End If Next i End Function
ひとつづつ解説してきます。
まず素数ですが、どのように書いていけば効率よく判定できるでしょうか。
1は自分の数字以外では割れないけど、素数ではない、唯一の数です。
なので1の時Falseを返すように直接書いていきます。
If (num <= 1) Then primaryNumber = False Exit Function End If
次に、偶数です。偶数は2以外全部素数ではありません。
なので2は素数でTrueだけど、それ以外の2の倍数はFalseを返すように書いていきます。
If (num = 2) Then primaryNumber = True Exit Function ElseIf (num Mod 2 = 0) Then primaryNumber = False Exit Function End If
最後に奇数の素数判定です。
一番単純な方法は、例えば7が素数であるか判定する時、
2から自分の数-1まで割り続けて、余りが0の数字がない場合素数です。
7/2 = 3 あまり 1
7/3 = 2 あまり 1
7/4 = 1 あまり 3
7/5 = 1 あまり 2
7/6 = 1 あまり 1
余りが0のものがないため素数である。
しかしこれだとあまりに非効率です。
既に7が偶数ではないことは確認しているので、2の倍数で割って調べる必要はありません。
さらに、自分の数-1(6)まで調べる必要はなく、結論として√自分の数 まで計算すれば大丈夫です。
Excel VBA 数学教室 合成数 N は 1 より大きく √N 以下の約数をもちます
こちらに詳しく書いてあります。
よって、
primaryNumber = True For i = 3 To Math.Sqr(num) Step 2 If (num Mod i = 0) Then primaryNumber = False Exit Function End If Next i
以下のように書けます。
これで完成です。試しにPrivateからPublicに書き換えてエクセルで確認してみましょう。
Public Function primaryNumber(num) As Boolean
素数の時True、素数以外の時Falseが表示されていることが確認できます。
つづく
——————-
関連記事
https://pasteldrops.com/2020/04/30/post-905/
コメント