over over

先日の日記での実際に書いたコード。


==========================================================================================
Imports System.Text

Public Class Sosu
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim from1 As Date = Date.Now

    Dim lngMax As Long
    If Not Long.TryParse(TextBox1.Text, lngMax) Then
      Exit Sub

    End If

    TextBox2.Text = makeSosu(lngMax)

    Dim to1 As Date = Date.Now

    TextBox3.Text = to1.Subtract(from1).ToString

  End Sub

  Private Function makeSosu(ByVal lngMaxNum As Long) As String
    Dim str As StringBuilder = New StringBuilder("")

    For i1 As Long = 2 To lngMaxNum
      Dim flgSosu As Boolean = True
      For i2 As Long = 1 To i1
        If i1 Mod i2 = 0 Then
          If i1 <> i2 AndAlso i2 <> 1 Then
            flgSosu = False
            Exit For

          End If

        End If

      Next

      If flgSosu Then
        str.Append(i1.ToString & " ")

      End If

    Next

    Return str.ToString

  End Function

End Class
==========================================================================================
めんどくさいのでFormクラスに直で書いています。
会社の自分のマシンでかかった秒数は以下の通り。
1000までの内の割り出し → 00:00:00
10000までの内の割り出し → 00:00:00.1874976
100000までの内の割り出し → 00:00:05.5155191
1000000までの内の割り出し → 00:07:12.0374984
1000では秒の最小値を下回ったので計測できませんでした。
1000000で実行するとマシンがブンブン言って一生懸命計算しているのがわかりました。


ない頭を一生懸命しぼって考えた結果、以下のような仮定を考えました。
・ある整数nが、2からnの間に存在するいずれかの素数(ただしn自身は含まない)で割り切れる場合、nは素数ではない
これが正しければ計算の回数はかなり減るぞ!
と思って書き直したけど、以前より時間がかかってしまいました。
For文の代わりにFor Eachを使ったので、それが原因か、と思ったんですが、今見直したら別のところで間違っていました。


来週はきっと忙しくないので、暇なときに見直します。