【问题标题】:What is the complexity of a prime algorithm?素数算法的复杂度是多少?
【发布时间】:2018-05-05 04:54:18
【问题描述】:

我想知道这个算法的复杂度是多少。 N>=3 一个整数作为输入。谢谢!

initialisation : i=2
LOOP:
if N%i==0
     return 1; 
if i == [sqrt(N)]
     return 0; 
i= i + 1;

【问题讨论】:

  • 唯一的一次N == sqrt(N)N == 1。如所写,该代码的复杂度为 O(1)。你可能打算让它循环吗?
  • “N 是二进制数”是什么意思?
  • 计算机中的所有数字变量(整数、浮点数等)都存储为二进制数。
  • @Lamaman 仅供参考,我怀疑您的问题被否决的原因是因为它看起来像“请为我做功课”。我不会太担心,但在未来,你应该阅读documentation on how to ask good questions,并且通常会更加努力地自己解决问题,以避免投票失败。
  • 如果我的回答为您解答了问题,请点击绿色复选标记表明它是正确的。否则,如果你能澄清还有什么问题有待解决,那就太好了。

标签: algorithm conditional complexity-theory


【解决方案1】:
initialisation : i=2
LOOP:
if N%i==0
     return 1;       # 1 <-----
if i == [sqrt(N)]
     return 0;       # 2 <-----
i= i + 1;

案例 1:N 是偶数。然后我们在O(1) 中完成 - 见行 (# 1)。或者 N 是奇数且非质数。然后当我们达到 N 的某个除数时我们就完成了(这会发生在平方根之前,或者同时发生)。

案例 2:N 是素数。然后我们将在完成之前点击[ n^0.5 ] 数字(见# 2 行)。

但是,正如@Lutzl 在他们的评论中指出的那样,精确的计算可能会考虑runtime of the division involved。这有点不合时宜,因为我们不知道使用了什么乘法和除法算法。但总运行时间为O(max{a * sqrt(N), sqrt(N)}),其中O(a)N % i == 0 检查的运行时间。我在这里假设实际的平方根计算实际上是恒定的时间并且只进行一次,所以O(n^0.5) 是因为这是在算法结束之前您获得的迭代次数。

【讨论】:

  • 你为什么要挑出n是偶数的情况?这与 n 被 3 或 5 整除并没有什么不同。
  • 嗯,好点子。因为i被初始化为2,但是现在我看到我的答案是不正确的。
  • 我不会说这是错误的。你得到的结果O(N^0.5)是正确的。
  • 由于除法和平方根的成本也取决于N,因此复杂度更准确地说是O(N^0.5*M(log(N))),其中M(x)=x^2 是逐位乘法到@ 的成本987654339@ 或类似的基于 FFT 的乘法,Schönhage-Strassen。
  • 在计算渐近复杂度时,您正在调查任意大输入的行为。这需要某种具有可变位数的 BigInteger 类型。然后算术运算不再有单位成本。 -- 请注意,复杂度类是指数级的,因为这将输入大小 x=log(n) 与运行时 O(2^(0.5x*)*M(x)) 相关联。
猜你喜欢
  • 2023-03-07
  • 2012-08-14
  • 1970-01-01
  • 2019-05-14
  • 2012-07-10
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多