在python中生成给定长度的素数

时间:2015-06-11 06:16:48

标签: python primes

是否有任何内置函数可以在C ++ NTL库中生成给定二进制长度的素数作为Genprime?

如果没有,那么是否需要检查所有给定长度的数量,直到素数遇到?

2 个答案:

答案 0 :(得分:3)

有一个完整的即用型包。查看https://pypi.python.org/pypi/pyprimes/

它包含流行的有效方法的实现,如Eratosthenes筛选,Croft螺旋,车轮分解等,还包含初始测试功能。

StackOverflow上的素数生成也有一些有趣的线程。检查:

Fastest way to list all primes below N

Simple Prime Generator in Python

答案 1 :(得分:3)

如果数字很小,小于约10 ^ 9,则可以使用分段的Eratosthenes筛来生成一定范围内的素数。如果数字较大,则需要测试奇数的素数。写一个素数检查器并不难:

def isPrime(n, k=5): # miller-rabin
    from random import randint
    if n < 2: return False
    for p in [2,3,5,7,11,13,17,19,23,29]:
        if n % p == 0: return n == p
    s, d = 0, n-1
    while d % 2 == 0:
        s, d = s+1, d/2
    for i in range(k):
        x = pow(randint(2, n-1), d, n)
        if x == 1 or x == n-1: continue
        for r in range(1, s):
            x = (x * x) % n
            if x == 1: return False
            if x == n-1: break
        else: return False
    return True

通过将每个连续的奇数作为候选并使用isPrime函数进行测试,可以轻松搜索下一个素数。但数论告诉我们,所有大于5的素数必​​须是30 k ±1,30 k ±7,30 k ±的形式对于某些非负整数 k ,11或30 k ±13,因此您可以通过消除一半奇数候选者来加倍nextPrime函数的速度素性测试:

def nextPrime(n):
    if n < 2: return 2
    if n < 3: return 3
    if n < 5: return 5
    n = n + 1 if n % 2 == 0 else n + 2
    while not isPrime(n):
        n += [1,6,5,4,3,2,1,4,3,2,1,2,1,4,3,2,1, \
              2,1,4,3,2,1,6,5,4,3,2,1,2][n % 30]
    return n

作为一个简单的检查,我们注意到有78498个素数少于一百万(尽管如果你想按顺序生成所有质数,你应该知道这将是很多慢,两个或者比使用筛子三个数量级:

>>> len, p = 0, 2
>>> while p < 1000000:
...     len += 1
...     p = nextPrime(p)
...
>>> len
78498

nextPrime函数可以很好地处理大数字,这就是它的设计目的:

>>> nextPrime(12345678901234567890123456789012345678901234567890123)
12345678901234567890123456789012345678901234567890223L

如果您对使用素数编程感兴趣,我会在我的博客上谦虚地推荐this essay