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を使ったので、それが原因か、と思ったんですが、今見直したら別のところで間違っていました。
来週はきっと忙しくないので、暇なときに見直します。