【问题标题】:Optimize code for nth prime number Ruby/Python优化第 n 个素数 Ruby/Python 的代码
【发布时间】:2013-09-13 18:39:36
【问题描述】:

我需要在 Ruby 或 Python 中以最快的方式找到第 n 个素数:

require "prime"

puts Prime.first(n).join("")  

对于 >= 100000 的数字,这需要很长时间。

如何优化这段代码?

【问题讨论】:

  • 最快的方法是只列出所有素数,然后索引它......但是它不现实,因为如果你在列表中放入 100000 个素数,我会要求第 100001 个素数.但是您可以对erathmus(sp?)进行筛分并用前1000个左右的素数(或100000或其他)播种(或者甚至只是第一个,但是您播种的素数越多,它应该越快)
  • @MartijnPieters 找到第 n 个素数与找到 n 以下的所有素数非常不同 :)
  • @Shashank:也许吧,我没有投票结束这个作为一个骗子。然而,另一篇文章必须具有与此问题相关的一些价值。
  • Monkeypatching Integer 和 Prime 类与找到的代码 here 导致边际改进(对于 n = 200000,在我的机器上从 11.52s 到 9.08s)。

标签: python ruby optimization primes


【解决方案1】:

试试这个:-

# Steps
    # List first 'n' prime
    # Choose the very last one


require "prime"

def nprime(n)
   (Prime.first n).last
end

puts nprime(10001)

它很快就给了我答案:

$ ruby nprime.rb
   104743

【讨论】:

    【解决方案2】:

    你可以在 python 中尝试这个动态程序,它在素数字典中查找(由程序本身动态构建),它最初是空的,当你找到更大的素数时它会变得更快。

    dict = {}
    def prime(x):
        dict[1] = 2
        s = x
        if x in dict:
            return dict[s]
        else:
            while s > 0:
                if s in dict:
                    pno = int(dict[s]) + 1
                    break 
                s-=1
    
            while s < x:
                m = 1
                while m <= s:
                    if pno % dict[m] == 0:
                        pno+=1
                        m=1
                    else:
                        m+=1
                dict[s+1]= pno
                s+=1
            return dict[x]
    

    最初为较低的素数构建字典以加速较高的素数。查找第 10000 个素数的示例,在运行模块的 python shell ahen 中执行以下操作: 素数(1000) 素数(5000) 素数(10000)

    【讨论】:

      【解决方案3】:

      Prime ruby doc.

      require "prime"
      Prime::EratosthenesSieve.instance.get_nth_prime(1000000)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-30
        • 1970-01-01
        相关资源
        最近更新 更多