素数检查器令人难以置信地缓慢

时间:2011-02-13 11:17:14

标签: vb.net algorithm primes

我有这段代码检查给定的数字是否为素数:

If x Mod 2 = 0 Then
    Return False
End If
For i = 3 To x / 2 + 1 Step 2
    If x Mod i = 0 Then
        Return False
    End If
Next
Return True

我只将其用于数字1E7 <= x <= 2E7。但是,它非常慢 - 我几乎无法每秒检查300个数字,因此检查所有x将花费超过23天......

有人可以提供一些改进提示或说出我可能会以这种方式做多余的事情吗?

9 个答案:

答案 0 :(得分:6)

这是用于检查素数的通用算法。 如果要批量检查素数,请使用算法http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

答案 1 :(得分:4)

查找“Eratosthenes的筛子”一词。这是一个两千年前的算法,它比你的算法更好。它通常在学校教授。

答案 2 :(得分:3)

你一定要改变你的算法!您可以尝试Sieve of Eratosthenes或更高级Fermat primality test。请注意,您的代码将更复杂,因为您需要实现模块化算法。查看here以获取一些更加数学上先进的方法的列表。

答案 3 :(得分:3)

您还可以查找AKS primality test.
这是检查素性的好算法。

答案 4 :(得分:1)

由于x/2 + 1在循环操作中是常量,因此在For循环之前将其保存在单独的变量中。因此,节省分区&amp;每次循环时添加操作。虽然这可能会略微提高性能。

答案 5 :(得分:1)

使用Sieve of Eratosthenes创建一个Set,其中包含您需要检查的最大数量的所有素数。设置Set需要一段时间,但检查其中是否存在数字会非常快。

答案 6 :(得分:0)

在一些块中拆分范围,如果你有多核cpu,则在两个或多个线程中进行检查。或者使用Parallel.For

答案 7 :(得分:0)

要检查数字是否为素数,您只需检查它是否不能被素数除以它。

请查看以下代码段:

 Sub Main()

        Dim primes As New List(Of Integer)
        primes.Add(1)

        For x As Integer = 1 To 1000
            If IsPrime(x, primes) Then
                primes.Add(x)
                Console.WriteLine(x)
            End If
        Next

    End Sub

    Private Function IsPrime(x As Integer, primes As IEnumerable(Of Integer)) As Boolean
        For Each prime In primes
            If prime <> 1 AndAlso prime <> x Then
                If x Mod prime = 0 Then
                    Return False
                End If
            End If
        Next
        Return True
    End Function

答案 8 :(得分:0)

因为使用x / 2而变慢。我稍微修改了你的代码。 (我不知道VB的语法,也许你必须改变我的语法。)

If x < 2 Then
    Return False
IF x == 2 Then
    Return True
If x Mod 2 = 0 Then
    Return False
End If
For i = 3 To (i*i)<=x Step 2
    If x Mod i = 0 Then
        Return False
    End If
Next
Return True