算法 - 这个Erastothenes解决方案的问题有什么问题

时间:2015-12-30 00:28:53

标签: ruby algorithm primes sieve-of-eratosthenes

我以为我会创建自己的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个是安全的。然后我会清除这些素数的所有倍数,因为它们无法成为素数。

因此所有其他数字必须是素数

我震惊地发现我的测试失败了,我忽略了一些数字。这怎么可能?我完全遵循这个算法。

3 个答案:

答案 0 :(得分:2)

首先,你已经在素数列表中包含了9个。 9不是素数。 尝试以下方法。

  • 查找到达给定数字的所有素数。从最小的素数开始,2。
  • 将2标记为素数,并将所有2的倍数删除。
  • 接下来看,这是没有被删除的最小数字。它是3.打印3作为素数并且输出小于n的所有3的倍数。
  • 然后再次选择未被删除的下一个最小数字,依此类推

    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 循环标记素数倍数和最后一个选择重复部分中的下一个素数。