【问题标题】:Python prime number list wrong?Python素数列表错误?
【发布时间】:2012-05-26 13:59:00
【问题描述】:

我尝试了几种不同的方法来获得 10001 素数。

def isPrime(value):
  if ((2**value)-2)%value==0:
    return True

def nthPrime(n):
  count = 0
  value = 1
  while count < n:
    value += 1
    if isPrime(value):
      count += 1
  return value

当参数为 10001 时,返回 103903。当我期待 104743 时。

我试过了:

primes = []
for i in range(2,105000):
  if ((2**i) - 2) % i == 0:
    primes.append(i)

print primes[10001] ---> 103903

【问题讨论】:

  • 你的isPrime 函数对数字的回答是什么:1105、1729、2465?您一眼就知道 1105 和 2465 不是 素数...(提示:en.wikipedia.org/wiki/Carmichael_number
  • 伪素数 嗯,我依稀记得以前遇到过这个,但是,这给了它一些上下文。好东西,谢谢!

标签: python list primes


【解决方案1】:

我相信你的初筛是错误的。尝试使用一个 isPrime 函数,该函数采用该数字对每个较小的素数进行模数。如果其中任何一个为 0,则该数字是合数(不是素数)。据我所知,没有单一的比较可以告诉您一个数字是否为素数,正如您的 isPrime 函数所假设的那样。

【讨论】:

    【解决方案2】:

    这是为 Project Euler 设计的吗?这对我来说似乎很熟悉。

    你的 isPrime 函数是错误的,就像 TEOUltimus 说的那样,没有一种方法可以判断一个数字是否是素数。

    Simple Prime Generator in Python

    我猜这几乎回答了你的问题。

    【讨论】:

      【解决方案3】:

      您可以创建一个函数来生成素数,这可能会很慢,但它会起作用。

      这是我的功能:

      def PrimesSieve(limit):
          np=set()
          p=[2]
          for i in xrange(1,limit+1,2):
                  if i == 1: continue
                  if {i} & np: continue
                  beg=2 if i % 2 == 0 else 0
                  for j in xrange(beg,int(limit)+1,i):
                          np.add(j)
                  p.append(i)
          return p
      

      【讨论】:

      • 我没用过筛法。在看到您的实现之后,它变得更加清晰。您通过逐步递增整数的范围来填充因子数组,如果整数在因子数组中,则它不是素数,如果不是。
      • 另外,我在得到要点后,使用上面给出的描述写了一个筛子。只是,我从 2 开始外循环,从 0 开始内循环。我得到了正确的结果,我认为这是一个轻微的性能改进?
      • 对您的代码的一个小优化。您可以在sets() 上使用逻辑运算符。 if i in np: continue可以改为if {i} &amp; np: continue
      • 感谢优化:)
      • 使用if {i} &amp; npif i in np是否更快?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2017-06-25
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多