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分に。
もっとよ・・・もっと行けるわ!というダイエット中毒が味わえます。