【问题标题】:Will checking if the number is even (of course > 2) before checking if it is a prime number increase the performance?在检查它是否是素数之前检查数字是否是偶数(当然> 2)会提高性能吗?
【发布时间】:2020-07-28 03:03:56
【问题描述】:

好吧,这个问题说明了一切,我还是会用一些代码来详细说明。简而言之:这两个代码中哪个更好? :

代码 1:

检查 num==2 和 num==1 ;)

if(num%2) {
    checkPrime(num) //function definition not needed
}
else {
    //not prime
}

代码 2:

检查 num==2 和 num==1 ;)

if(isPrime(num)) {
    //prime
}
else {
    //not prime
}

checkPrimeisPrime 都不检查均匀度

【问题讨论】:

  • 最好的方法是自己测量差异
  • 这完全取决于你的checkPrimeisPrime 函数是如何实现的。如果是从2开始试划分,那差别就很小了。如果是其他一些对偶数需要很长时间的素数测试,那么添加检查会让事情变得更快。
  • 关于“checkPrime 和 isPrime 都不检查均匀度”,你确定吗?这些功能是如何实现的?您是否应该只跳过(不测试)偶数?

标签: c++ performance primes


【解决方案1】:

对于一个简单的isPrime() 函数,我使用类似于以下伪代码的代码:

isPrime(num)

  // Negatives, 0, 1 are not prime.
  if (num < 2)
    return false
  endif

  // 2 is the only even prime.
  if (num MOD 2 == 0)
    return (num == 2)
  endif

  // Try odd divisors.
  limit = 1 + sqrt(num)
  for (i <- 3 to limit step 2)
    if (num MOD i == 0)
      return false
    endif
  endfor

  // If we get this far, the number is prime.
  return true

end isPrime

【讨论】:

    【解决方案2】:

    检查一个数是否为素数的所有逻辑都应该包含在函数中。因此,您的第一个选项毫无意义。

    您的第二个选项也不是最佳的,因为检查均匀性是对我想您所指的简单经典素性测试算法的优化,因此检查应该作为算法本身的一部分在函数内部。

    可以对经典算法进行一些优化,其中之一是检查均匀性,但所有这些都应该在函数中完成。

    话虽如此,如果关注的是性能,请注意有一些更快但更复杂的算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2015-09-15
      • 2010-12-29
      • 2013-03-22
      • 1970-01-01
      相关资源
      最近更新 更多