Я написал алгоритм, который, я считаю, корректен для вычисления простых чисел до n с помощью сита Эратосфена. К сожалению, эта программа зависает на действительно больших значениях n (попробуйте 10 миллионов). Вот что я написал ...Помогите ускорить этот алгоритм? Сито из Eratosthenes
Protected Function Eratosthenes(ByVal n As Integer) As String
Dim maxValue As Integer = Math.Sqrt(n)
Dim values As Generic.List(Of Integer) = New Generic.List(Of Integer)
Dim i As Integer
''//create list.
For i = 2 To n
values.Add(i)
Next
For i = 2 To maxValue
If values.Contains(i) Then
Dim k As Integer
For k = i + 1 To n
If values.Contains(k) Then
If (k Mod i) = 0 Then
values.Remove(k)
End If
End If
Next
End If
Next
Dim result As String = ""
For i = 0 To values.Count - 1
result = result & " " & values(i)
Next
Return result
End Function
Как я могу ускорить этот алгоритм? Где мои узкие места?
Вы хотите пометить композиты, начиная с квадрата найденного штриха, а не в два раза больше этого числа. для (INT кратные = я * I; кратные <= тах; кратные + = I) – hughdbrown
@hughdbrown: К сожалению, да, конечно :) –
Этот алгоритм, безусловно, более быстрый, чем мой оригинал (я могу сказать с числами таких как «Одна тысяча»), однако все еще слишком медленно обрабатывать десять миллионов (время ожидания). – Chris