【问题标题】:Fast Prime Generator besides Sieve除筛外的快速素数发生器
【发布时间】:2017-01-14 21:56:57
【问题描述】:

我最近编写了这段代码,但想知道是否有更快的方法来查找素数(不是筛子;我仍在尝试这样做)。有什么建议吗?我正在使用 Python,我对它比较陌生。

def isPrime(input):
    current = 0
    while current < repetitions:
        current = current + 2
        if int(input) % current == 0:
            if not current == input:
                return "Not prime."
            else:
                return "Prime"
        else:
            print current

    return "Prime"

i = 1
primes = []
while len(primes) < 10001:
    repetitions = int(i)-1
    val = isPrime(i)
    if val == "Prime":
        primes.append(i)
    i = i + 2
print primes[10000]

【问题讨论】:

    标签: python primes sieve


    【解决方案1】:

    这是一个检测 x 是否为素数的函数

    def is_prime(x):
        if x == 1 or x==0:
            return False
        elif x == 2:
            return True
        if x%2 == 0:
            return False
        for i in range(3, int((x**0.5)+1), 2):
            if x%i == 0:
                return False
        return True
    

    和另一个打印素数的实现

    def prime_range(n):
        print(2)
        for x in range(3, n, 2):
            for i in range(3, int((x**0.5)+1), 2):
                if x%i == 0:
                    break
            else:
                print(x)
    

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      如果您不使用筛子,那么下一个最好的可能是wheel methods。 2 轮检查 2 和奇数之后。 6 轮检查 2、3 和 (6n +/- 1) 形式的数字,即没有因数 2 或 3 的数字。上面 taoufik A 的答案是 2 轮。

      我不会写 Python,所以这里是 6 轮实现的伪代码:

      function isPrime(x) returns boolean
      
        if (x <= 1) then return false
      
        // A 6-wheel needs separate checks for 2 and 3.
        if (x MOD 2 == 0) then return x == 2
        if (x MOD 3 == 0) then return x == 3
      
        // Run the wheel for 5, 7, 11, 13, ...
        step <- 4
        limit <- sqrt(x)
        for (i <- 5; i <= limit; i <- i + step) do
          if (x MOD i == 0) then return false
          step <- (6 - step)  // Alternate steps of 2 and 4.
        end for
      
        return true
      
      end function
      

      我留给你把它转换成 Python。

      【讨论】:

        【解决方案3】:

        n = 10000
        for p in range(2, n+1):
            for i in range(2, p):
                if p % i == 0:
                    break
            else:
                print p
        print 'Done'
        

        ?

        【讨论】:

        • 这似乎与我已经拥有的代码相似-虽然更简单
        • 它可以通过将内部循环设置为range(2,p/2) 来进一步改进,因为for i &gt; p/2 p%i==0 永远不会发生。
        • 这就是你要的不是吗?它很相似,但速度更快。我花了半分钟才用你的代码到达质数 201。 (无犯罪)
        • @jackjay 必须是range(2, p//2 + 1)。否则,例如,它说 4 是一个素数。
        • @jackjay 它不包括停止的事实正是您需要使用p//2 + 1 的确切原因。考虑p 是否为 4。range(2, 4//2) 会产生什么?
        猜你喜欢
        • 2013-04-06
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        • 2010-10-31
        • 2016-03-31
        • 2011-09-22
        • 2017-06-26
        • 2015-05-07
        相关资源
        最近更新 更多