make a move

改良版を作ったら速くなったぞ!最早当初の目的なんてくそくらえだ!


===================================================================================
  Private Function makeSosu(ByVal lngMaxNum As Long) As String
    Dim str As StringBuilder = New StringBuilder("")
    Dim arrSosu As List(Of Long) = New List(Of Long)
    arrSosu.Add(2)

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

        End If

      Next

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

      End If

    Next

    Return str.ToString
  End Function
===================================================================================


素数を発見する度にListに追加し、For EachでListから取り出して割り算します。
これで計算は半分以上減るはず。
前回遅かったのは
arrSosu.Add(i1)

If flgSosu Then
の外にあったからでした。そりゃ遅くなるわ。


計測結果は
1000 → 00:00:00
10000 → 00:00:00.0467880
100000 → 00:00:01.0761240
1000000 → 00:01:01.9785040
7桁で7分だったのが1分に。
もっとよ・・・もっと行けるわ!というダイエット中毒が味わえます。