是否有一个库函数可以枚举Python中的素数(按顺序)?
我发现了这个问题Fastest way to list all primes below N但是我宁愿使用别人可靠的图书馆而不是自己的图书馆。我很乐意import math; for n in math.primes:
答案 0 :(得分:16)
SymPy是另一种选择。它是符号数学的Python库。它为prime提供了几个函数。
isprime(n) # Test if n is a prime number (True) or not (False).
primerange(a, b) # Generate a list of all prime numbers in the range [a, b).
randprime(a, b) # Return a random prime number in the range [a, b).
primepi(n) # Return the number of prime numbers less than or equal to n.
prime(nth) # Return the nth prime, with the primes indexed as prime(1) = 2. The nth prime is approximately n*log(n) and can never be larger than 2**n.
prevprime(n, ith=1) # Return the largest prime smaller than n
nextprime(n) # Return the ith prime greater than n
sieve.primerange(a, b) # Generate all prime numbers in the range [a, b), implemented as a dynamically growing sieve of Eratosthenes.
以下是一些例子。
>>> import sympy
>>>
>>> sympy.isprime(5)
True
>>> list(sympy.primerange(0, 100))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
>>> sympy.randprime(0, 100)
83
>>> sympy.randprime(0, 100)
41
>>> sympy.prime(3)
5
>>> sympy.prevprime(50)
47
>>> sympy.nextprime(50)
53
>>> list(sympy.sieve.primerange(0, 100))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
答案 1 :(得分:12)
gmpy2库有一个next_prime()函数。这个简单的函数将创建一个生成器,它将提供无限的素数:
import gmpy2
def primes():
n = 2
while True:
yield n
n = gmpy2.next_prime(n)
如果您将反复搜索素数,则创建并重新使用低于合理限制(例如1,000,000)的所有素数表将会更快。这是另一个使用gmpy2和Eratosthenes的Sieve来创建素数表的例子。 primes2()首先从表中返回素数,然后使用next_prime()。
import gmpy2
def primes2(table=None):
def sieve(limit):
sieve_limit = gmpy2.isqrt(limit) + 1
limit += 1
bitmap = gmpy2.xmpz(3)
bitmap[4 : limit : 2] = -1
for p in bitmap.iter_clear(3, sieve_limit):
bitmap[p*p : limit : p+p] = -1
return bitmap
table_limit=1000000
if table is None:
table = sieve(table_limit)
for n in table.iter_clear(2, table_limit):
yield n
n = table_limit
while True:
n = gmpy2.next_prime(n)
yield n
您可以调整table_limit以满足您的需求。较大的值将需要更多的内存并增加第一次调用primes()的启动时间,但重复调用的速度会更快。
注意:我是gmpy2的维护者。
答案 2 :(得分:3)
自从提出这个问题以来,我在C ++库primesieve周围编写了一个Python包装器。 https://github.com/hickford/primesieve-python
>>> from primesieve import *
# Generate a list of the primes below 40
>>> generate_primes(40)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
# Generate a list of the primes between 100 and 120
>>> generate_primes(100, 120)
[101, 103, 107, 109, 113]
# Generate a list of the first 10 primes
>>> generate_n_primes(10)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
# Generate a list of the first 10 starting at 1000
>>> generate_n_primes(10, 1000)
[1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061]
# Get the 10th prime
>>> nth_prime(10)
29
# Count the primes below 10**9
>>> count_primes(10**9)
50847534
答案 3 :(得分:0)
没有恒定时间算法来生成下一个素数;这就是大多数图书馆需要上限的原因。这实际上是数字密码学需要解决的一个巨大问题。 RSA通过选择随机数并测试素数来选择足够大的素数,直到找到素数。
给定一个任意整数N
,在N
之后找到下一个素数的唯一方法是迭代N+1
到未知的素数P
测试素数。< / p>
对primality的测试非常便宜,并且有python库这样做:AKS Primes algorithm in Python
给定函数test_prime
,而无限素数迭代器看起来像:
class IterPrimes(object):
def __init__(self,n=1):
self.n=n
def __iter__(self):
return self
def next(self):
n = self.n
while not test_prime(n):
n += 1
self.n = n+1
return n
您可以使用许多启发式方法来加快这一过程。例如,跳过偶数,或可被2,3,5,7,11,13等整除的数字。