除Sieve之外的快速Prime生成器

时间:2017-01-14 21:56:58

标签: python primes sieve

我最近编写了这段代码,但想知道是否有更快的方法来查找素数(不是Sieve;我还在尝试制作它)。有什么建议?我正在使用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]

3 个答案:

答案 0 :(得分:2)

这是一个检测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

和打印素数的另一个实现&lt; Ñ

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)
希望它有所帮助!

答案 1 :(得分:1)

如果你不使用筛子,那么下一个最好的可能是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。

答案 2 :(得分:0)

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'