[VBA]ウラムの螺旋を作る[1/2]

VBA

どうも、えんちゃです。まぁまぁマイナーなのきましたね。
世の中で何パーセントの人が知っている言葉なのでしょうか。
今回は、前後半に分けて、前半ではウラムの螺旋の概要と、素数判定プログラムについて
後半では、並べるプログラムと完成品について書いていきます。

ウラムの螺旋とは

まず、ウラムの螺旋を作るためにウラムの螺旋の理解を深めていきましょう。
ウラムの螺旋

素数の分布をある簡単なルールに従って2次元平面に並べ、可視化したものである。これは1963年、数学者のスタニスワフ・ウラムによって発見された。彼によれば学会の「長くて非常に退屈な論文」の発表の際に落書きをしていてこれを発見した[wiki引用]

つまり、数字を図のようならせん状に並べていき、

素数を塗りつぶすと、完全にランダムに出現すると思われていた素数に、規則性らしきものが出てくるという書き方です。

これをエクセル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は素数か?
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/

コメント

タイトルとURLをコピーしました