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

时间:2015-10-28 16:01:25

标签: python performance math primes largenumber

我想弄清楚的是,当我为较小的数字运行此代码时,它返回列表就好了,但对于较大的数字(我会在我正在工作的情况下称之为小) 。)如29996299,它会运行很长一段时间,我等了45分钟没有结果,不得不最终杀死程序。我想知道的是,是否有一种更有效的方法来处理规模大于4或5位的数字。我已经测试了范围函数的一些排列,看看是否有更好的方法来处理我想要生成的列表的限制,但似乎没有任何影响对计算所需的时间量。我是python的新手,并不是一个经验丰富的程序员。谢谢你的时间。

在提交这篇文章之前再次运行程序,花了一个半小时左右。

程序的功能是取用户选择的数字,用它来生成下界,查找绑定和输入之间的所有素数并附加到列表,然后生成一个上限并查找所有素数然后追加到列表,用于创建从初始编号向前和向后延伸的列表。 该计划的工作方式与我预期的一样,但并不像我需要的那样快,因为我要处理的数字会很快变大,在每个阶段几乎翻倍。

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

1 个答案:

答案 0 :(得分:3)

您可以使用更有效的算法生成最多N的素数列表。这是Sieve of Erathostenes。请查看链接的文章,它甚至包括一个示例伪代码。该算法的基本思想是:

  1. 维护L,潜在素数列表(最初所有数字从2到N)
  2. 选择下一个素数(p)作为L的第一个元素(最初为2)
  3. 删除所有p的倍数,最多为N,因为它们不能为素数
  4. 从第2步开始重复
  5. 最后,你会得到一个素数列表。

    Pyhton from here

    中的实现
    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)))
    

    为了减少内存消耗,您可以考虑使用一个bitset,为每个数字存储一位。这应该会减少32到64倍的内存使用量。 python here可以使用bitset实现。