是否有任何内置函数可以在C ++ NTL库中生成给定二进制长度的素数作为Genprime?
如果没有,那么是否需要检查所有给定长度的数量,直到素数遇到?
答案 0 :(得分:3)
有一个完整的即用型包。查看https://pypi.python.org/pypi/pyprimes/
它包含流行的有效方法的实现,如Eratosthenes筛选,Croft螺旋,车轮分解等,还包含初始测试功能。
StackOverflow上的素数生成也有一些有趣的线程。检查:
答案 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。