繁体   English   中英

生成大质数列表的有效方法

[英]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的筛网 请看一下链接的文章,它甚至包括示例伪代码。 该算法的基本思想是:

  1. 维护L,一个可能的质数(最初从2到N的所有数字)的列表
  2. 选择下一个质数(p)作为L的第一个元素(通常为2)
  3. 删除所有p的整数,直到N,因为它们不能为质数
  4. 从步骤2重复

最后,剩下的是质数列表。

从这里开始在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM