【发布时间】:2013-09-20 21:19:39
【问题描述】:
我已经制作了一个用于生成素数的筛子。我正在做一个关于 RSA 的学校项目,其中包括一些编程。我将在 RSA 系统中使用素数,但因为这是我的文章,所以安全性并不重要。然而,大素数更具挑战性,我喜欢这样。 我使用的代码:
def Zeef(a):
import math
upperBound = a
upperBoundSquareRoot = int(math.sqrt(upperBound))
isPrime = [1 for m in range (0,upperBound+1)]
for m in range(2,upperBoundSquareRoot+1):
if (isPrime[m]==1):
for k in range(m*m,upperBound+1,m):
isPrime[k] = 0;
print("Priemgetallen : ")
numberofPrimes = 0
for m in range(2,upperBound+1):
if (isPrime[m] ==1):
print(m)
numberofPrimes = numberofPrimes+1
print("Aantal = " , numberofPrimes);
a=input("Alle priemgetallen tot: ")
aa=int(a)
Priemen = Zeef(aa)
我确信有一种更快的方法来生成素数,但我现在对改进我的代码并不感兴趣。
当我运行这个函数时,它可以很好地生成最多 7 位的素数,但是当我想要更多时,它真的很慢。我的电脑(8gb 内存)提示内存不足。我在另一个工具 Processing 中使用了相同的算法。处理速度非常快,但它不能识别超过 10 位数字。 我还注意到,当我生成我的计算机能够计算的素数时,打印速度很慢。
我开始在互联网上搜索,我发现我编译我的程序会加快进度,但我不确定它是否加快了计算和打印部分或只是解释部分。 我还发现了一些关于 numpy 的东西,它是关于数组的,但我不确定这是否会显着加快我的功能。
我怎样才能更快地找到我的素数?
【问题讨论】:
-
谷歌翻译给我荷兰语到英语如下: Zeef = Sieve; Priemgetallen = 素数;安塔尔 = 数字; Alle priemgetallen tot = "全部启动";普里门=“刺。”它做得好吗? :)(它纠正了我最初对语言的猜测,即德语。)
-
@Wooble 这就是筛子的想法:从所有数字作为候选素数开始,标记那些你知道的不是。它是算法不可或缺的一部分。
-
看起来不错,对比stackoverflow.com/questions/1042902/…。尽管对于 RSA,您可能会使用 Miller-Rabin 之类的概率测试,可能是在筛选出几千个候选人之后。小素数。
-
This 是一个很棒的话题,列出了许多计算素数及其速度的方法。它可能值得一读。
标签: python performance numpy primes sieve-of-eratosthenes