【问题标题】:Optimal method to check whether a number is prime or not? [duplicate]检查数字是否为素数的最佳方法? [复制]
【发布时间】:2020-11-21 07:51:37
【问题描述】:

我知道的最好的方法是 sqrt(n)。我读到了费马的素性检验和米勒-拉宾素性检验。它们在 O(log(n)) 时间内运行,但一个主要缺点是它们有时也会失败。 你能帮帮我吗?

如果可能的话,在python中提供算法和代码(即使算法就足够了)。

【问题讨论】:

  • 在实践中通常不用担心故障率。在 k 轮之后,Miller-Rabin 误报的几率是 1 in 4^(-k)。即使对于 k 的小值,例如 20,对于 n 的大值,sqrt(n) 和 k*log(n) 之间也存在显着差异,在这种情况下,您需要比简单除数测试更快的东西,而 Miller - 在这种情况下,Rabin 将在 99.9999999999% 的时间报告一个复合数字。
  • 而 4^(-k) 是一个保守的估计;对于大的n,速率下降到 8^(-k) 甚至更低。

标签: python algorithm time-complexity primes number-theory


【解决方案1】:

这是我在谷歌快速搜索后发现的。经过测试,似乎可以工作。如果您认为 1 是质数,则检查数字是否大于 1 可以更改为 num > 0

# Program to check if a number is prime or not

num = 407
    
# prime numbers are greater than 1
if num > 1:
   # check for factors
   for i in range(2,num):
       if (num % i) == 0:
           print(num,"is not a prime number")
           print(i,"times",num//i,"is",num)
           break
   else:
       print(num,"is a prime number")
       
# if input number is less than
# or equal to 1, it is not prime
else:
   print(num,"is not a prime number")

信用:https://www.programiz.com/python-programming/examples/prime-number

【讨论】:

  • 天真的“测试所有除数”算法远非最佳。
  • 这是 O(n) 解决方案。我想要一个小于 O(sqrt(n)) 的解决方案
猜你喜欢
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2015-11-03
  • 2012-07-10
  • 2013-07-08
  • 2020-09-20
  • 2017-08-23
  • 2018-05-04
相关资源
最近更新 更多