我有这段代码检查给定的数字是否为素数:
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天......
有人可以提供一些改进提示或说出我可能会以这种方式做多余的事情吗?
答案 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