West Ryder Silver Bullet

仕事中にふと、素数スパコンで割り出すってイメージわかねぇな、と思い、自分でやってみようと思い立ちました(仕事中に)。
まぁいかにも素人に毛が生えた人間が思いつきそうな問題ではありますが、VB.NETでざっと書きました。


物としては、2から指定した数まで(1は素数じゃないから)の間にある素数を並べあげる、名づけてプッチ神父関数。
ちなみに先に断っておきますが、今から述べる方法が実際のスパコンで行われている方法ではないですし(たぶん。調べてないから知らない)、もっと効率のいい方法はいくらでもあるでしょう。


ソースを貼ればいいんですが、忘れたのでちゃんとしたのはまた今度。
適当に書くと
Private Sub ShowSosu(ByVal x As Long)
 Dim strSosu As Text.StringBuilder

 For i1 As Long = 2 to x
  Dim flgSosu As Boolean = True

  For i2 As Long 2 to i1
   If i1 MOD i2 = 0 AndAlso i1 <> i2 Then
    flgSosu = False
    Exit For
   End If
  End For

  If flgSosu Then
   strSosu.AppendLine(i1.ToString)
  End If
 End For

MsgBox(strSosu.ToString)
End Sub


こんな感じ。
2から自分の値までの数で自分を延々と割り続けて、もし途中で自分以外の数字で割り切れたら素数じゃないので除外、自分でしか割り切れなかったら素数、というように計算しました。
結果どのくらいかかったかというと
2〜10000
→ 約0.7秒
2〜100000
→ 約57秒
2〜1000000
→ 約7分

一桁増えると格段に時間がかかる。
7桁で7分かかってるのに、スパコンといえど1700万桁ってどのくらい時間かかるんでしょ。
ちなみに最初、Exit Forを忘れてひどい目にあった。


でも、家帰ってから考えたら、前回の素数割り出したときの計算が使えるんだから、もっともっと短くなるんじゃないかと思います。
明日試してみます。
そんな暇ホントはないけど。

うそ。風呂入って落ち着いて考えたら前回の素数割り出しの計算なんか使えない。