【问题标题】:Fastest-in term of space- way to find prime numbers with python用python找到素数的最快空间方式
【发布时间】:2012-03-07 06:58:11
【问题描述】:

也许这是一个愚蠢的问题,但我想知道您是否可以提供最短的资源来使用 Python 查找素数。 我还想知道如何使用 map() 或 filter() 函数来查找素数。 谢谢(:

编辑:当我说最快/最短时,我的意思是使用较少字符/单词的方式。无论如何,不​​要考虑竞争:我想知道是否有可能是单行源,而无需删除始终与 for 循环一起使用的缩进。 编辑2:这个问题并没有被认为是巨大的数字。我认为我们可以保持在一百万以下(范围(2,1000000) 编辑 3:最短,但仍然优雅。正如我在第一次编辑中所说,您不需要将变量的名称减少为单个字母。我只需要一个优雅的源代码。 谢谢!

【问题讨论】:

  • 您的意思是按字符数计算的最短源代码?
  • 质数应该有多大?是否有任何性能限制?你想找到所有在某个范围内的,还是一个具有特定位数的随机素数?
  • 为什么需要这样做?这是一个家庭作业/额外的学分问题吗?
  • 到目前为止你找到的最短的是什么?

标签: python primes


【解决方案1】:

Sieve of Eratosthenes 分两行。

primes = set(range(2,1000000))
for n in [2]+range(3,1000000/2,2): primes -= set(range(2*n,1000000,n))

编辑:我已经意识到上面不是真正的埃拉托色尼筛法,因为它过滤的是奇数集而不是素数集,这使得它不必要地慢。我已经在下面的版本中修复了这个问题,并且还包括了一些在 cmets 中指出的常见优化。

primes = set([2] + range(3, 1000000, 2))
for n in range(3, int(1000000**0.5)+1, 2): primes -= set(range(n*n,1000000,2*n) if n in primes else [])

第一个版本仍然较短,并且确实产生了正确的结果,即使它需要更长的时间。

【讨论】:

  • 你在最初的候选人名单之外放了两个,然后只跳到赔率……聪明。但是...primes -= set(... 是怎么回事?那是自弃集吗?
  • @Droogans,primes -= set 正在从另一组中减去一组。范围表达式生成 n 到 1000000 的所有倍数。
  • 我已将您的代码设为单行代码 =) stackoverflow.com/a/10640037/711085 : reduce((lambda r,x: r-set(range(2*x,N,x))), [2]+range(3,int(N**.5),2), set(range(2,N)))
  • 这可以是primes=set([2]+range(3,1000000,2)),然后是for n in range(3,1000,2): primes -= set(range(n*n,1000000,2*n))
  • 你可能更喜欢if n in primes: primes.difference_update(range(...))
【解决方案2】:

因为人们可以从网上剪切和粘贴前一百万个素数:

map(int,open('primes.txt'))

这有点类似于我昨天问的问题,wim 提供了一个相当简短的答案:

is this primes generator pythonic

【讨论】:

    【解决方案3】:

    与上述类似,但不像罗伯特·金的回答那么厚脸皮:

    from itertools import ifilter, imap
    def primes(max=3000):
        r = set(); [r.add(n) for n in ifilter(lambda c: all(imap(c.__mod__, r)), xrange(2, max+1))]; return sorted(r)
    

    【讨论】:

      【解决方案4】:

      这使用了更多的字符,但它是可读的:

      def primes_to(n):
          cands = set(xrange(2, n))
          for i in xrange(2, int(n ** 0.5) + 1):
              for ix in xrange(i ** 2, n, i):
                  cands.discard(ix)
          return list(cands) 
      

      编辑

      一种新方法,与上述类似,但在discard 的尝试失败次数更少:

      def primes_to(n):
          cands = set(xrange(3, n, 2))
          for i in xrange(3, int(n ** 0.5) + 1, 2):
              for ix in xrange(i ** 2, n, i * 2):
                  cands.discard(ix)
          return [2] + list(cands)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        • 2019-07-02
        • 2018-01-06
        • 1970-01-01
        相关资源
        最近更新 更多