我以为我会创建自己的Sieve算法实现来更快地找到素数。令人惊讶的是,这未通过多项测试。
这是我在Ruby中的算法,用于确定数字是否为素数。
def prime?(n)
primes = [2,3,5,7,9,11,13,17]
primes.include?(n) || primes.none? { |p| n % p == 0 }
end
算法是如何工作的,你采取前几个素数,我采取前8个是安全的。然后我会清除这些素数的所有倍数,因为它们无法成为素数。
因此所有其他数字必须是素数
我震惊地发现我的测试失败了,我忽略了一些数字。这怎么可能?我完全遵循这个算法。
答案 0 :(得分:2)
首先,你已经在素数列表中包含了9个。 9不是素数。 尝试以下方法。
然后再次选择未被删除的下一个最小数字,依此类推
def primeSeive(n)
while primes[index]**2 <= primes.last
prime = primes[index]
primes = primes.select { |x| x == prime || x%prime != 0 }
index += 1
end
答案 1 :(得分:2)
要测试给定数字n
的素数,您需要检查它是否可以被任何素数&lt; = sqrt(n
)整除。由于您已将17个素数硬连线到其中,因此您的算法仅适用于n
<= 17 2 的值。
最重要的是,你在&#34; primes&#34;的列表中包含9。除了值9本身之外,这不应该影响你的测试,因为任何可被9整除的东西也可以被3整除,但它非常顽皮。
答案 2 :(得分:1)
我不太擅长红宝石,但似乎你没有遵循这个算法。 你也加9作为素数而不是真的。
在筛选算法中,首先只需要 2 作为素数。
<强>伪代码强>:
Sieve(n) {
a[1] := 0
for i := 2 to n do a[i] := 1
p := 2
while p2 < n do {
j := p2
while (j < n) do {
a[j] := 0
j := j+p
}
repeat p := p+1 until a[p] = 1
}
return(a)
}
此处 A 是数组,其索引值表示质量。 0 not prime , 1 prime 。 在 while 循环标记素数倍数和最后一个选择重复部分中的下一个素数。