你能用这个筛子帮助我产生更大的质数吗?

时间:2015-03-18 07:25:34

标签: python performance python-3.x primes sieve-of-eratosthenes

所以我创建了一个程序来生成一个数字,并检查它是否是素数,但是我希望得到一个更大的素数。目前的计划很快适用于高达2百万的素数。

def is_Prime(num):
if(num < 2):
    return False
elif (num == 2):
    return True

if(num%2 == 0):
    return False

for i in range(3, int(num**0.5)+1, 2):
    if(num%i == 0):
        return False
return True

bigPrime = 0;
for i in range(1000000):
    possiblePrime = (2*i) +1
    if(is_Prime(possiblePrime)):
        bigPrime = possiblePrime

print(bigPrime) 

我写的bigPrime部分

possiblePrime = (2*i) + 1

是我的计算机科学老师告诉我的关于擅长生成素数的算法。

非常感谢我对is_Prime函数或生成算法的任何帮助。

1 个答案:

答案 0 :(得分:1)

这是一段代码,可以在很短的时间内给出素数87178291199。

首先,我改变了最快的素性测试。首先,我建立一个低于某个极限的素数列表(在学校你学习Eratosthenes筛子来做这个,这里是更有效的算法)。然后,为了检查数字是否是素数,我检查它是否可以被列表的任何素数整除。

其次,我改变了你的可能性。你的候选人都是奇怪的整数:如果你只想要一个“大素数”,那就太多了。 好的候选人是梅森数字(形式为2**n - 1)和阶乘(n! -1n! +1)。见Wikipedia。您可以在方便时添加其他方式来生成重要候选人。

def rwh_primes2(n):
    # http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python/3035188#3035188
    """ Input n>=6, Returns a list of primes, 2 <= p < n """
    correction = (n%6>1)
    n = {0:n,1:n-1,2:n+4,3:n+3,4:n+2,5:n+1}[n%6]
    sieve = [True] * (n//3)
    sieve[0] = False
    for i in range(int(n**0.5)//3+1):
      if sieve[i]:
        k=3*i+1|1
        sieve[      ((k*k)//3)      ::2*k]=[False]*((n//6-(k*k)//6-1)//k+1)
        sieve[(k*k+4*k-2*k*(i&1))//3::2*k]=[False]*((n//6-(k*k+4*k-2*k*(i&1))//6-1)//k+1)
    return [2,3] + [3*i+1|1 for i in range(1,n//3-correction) if sieve[i]]


LIMIT = 1000000
PRIME_LIST = rwh_primes2(LIMIT)

# A number is prime if and only if it is not divisible by any prime lower than its square root.
def is_Prime(num):
    for i in PRIME_LIST:
        if i*i> num:
            return True
        elif num%i == 0:
            return False
    return True

# Return a sorted list of possible primes lower than limit.
def possiblePrimes(limit):
    l = []
    # 2**i -1 (Mersenne primes)
    i = 2
    while(i < limit):
        l.append(i-1)
        i *= 2
    # n! + 1 or n! -1 (Factorial primes)
    i = 2
    n = 2
    while(i < limit):
        l.append(i-1)
        l.append(i+1)
        n += 1
        i *= n
    return sorted(list(l))

bigPrime = 0
candidates = possiblePrimes(LIMIT*LIMIT)
for c in candidates:
    if(is_Prime(c)):
        bigPrime = c

print(bigPrime)