[英]Efficient method for generating lists of large prime numbers
我想弄清楚的是,当我为较小的数字运行此代码时,它会返回列表,但对于较大的数字(在我正在研究的内容中我将其称为较小)。例如29996299,它将运行很长时间,我已经等待了45分钟,但没有结果,最终不得不终止该程序。 我想知道的是,是否存在一种更有效的方法来处理规模大于4或5位数字的数字。 我已经测试了range函数的一些排列,以查看是否有更好的方法来处理要生成的列表的限制,但似乎对执行计算的时间没有影响。 我是python的新手,并且没有作为程序员的经验。 感谢您的时间。
在提交此帖子之前再次运行了程序,花了一个半小时左右。
该程序的功能是获取用户选择的数字,使用它生成一个下限,找到边界和输入之间的所有素数,然后追加到列表中,然后生成一个secound上限并找到所有素数,然后追加到列表中,以创建一个从初始编号向前和向后扩展的列表。 该程序的工作方式与我预期的一样,但并没有达到我所需的速度,因为我要处理的数字将迅速增加,每个阶段几乎翻倍。
initial_num = input("Please enter a number. ")
lower_1 = int(initial_num) - 1000
upper_1 = int(initial_num)
list_1 = []
for num in range(lower_1,upper_1):
if num > 1:
for i in range(2,num):
if (num % i) == 0:
break
else:
list_1.append(num)
lower_2 = list_1[-1]
upper_2 = list_1[-1] + 2000
list_2 = []
for num in range(lower_2,upper_2 +1):
if num > 1:
for i in range(2,num):
if (num % i) == 0:
break
else:
list_2.append(num)
list_3 = list_1 + list_2[1:]
print list_3
您可以使用更高效的算法来生成不超过N的素数的整个列表。这就是Erathostenes的筛网 。 请看一下链接的文章,它甚至包括示例伪代码。 该算法的基本思想是:
最后,剩下的是质数列表。
从这里开始在Pyhton中实现
def eratosthenes2(n):
multiples = set()
for i in range(2, n+1):
if i not in multiples:
yield i
multiples.update(range(i*i, n+1, i))
print(list(eratosthenes2(100)))
为了减少内存消耗,您可以考虑使用一个位集,为每个数字存储一位。 这样可以减少32-64倍的内存使用量。 此处可用于python的位集实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.