【发布时间】:2015-10-28 16:01:25
【问题描述】:
我想弄清楚的是,当我为较小的数字运行此代码时,它会返回列表就好了,但对于较大的数字(在我正在处理的上下文中,我会称之为小。)喜欢29996299,它会运行很长时间,我已经等了45分钟没有结果,最终不得不杀死程序。我想知道是否有更有效的方法来处理规模大于 4 或 5 位的数字。我已经测试了 range 函数的一些排列,看看是否有更好的方法来处理我想要生成的列表的限制,但似乎对计算所需的时间没有任何影响。我是 python 新手,作为程序员没有那么有经验。感谢您的宝贵时间。
在提交这篇文章之前再次运行程序,花了一个半小时左右。
该程序的功能是取用户选择的数字,用它来生成一个下界,找到边界和输入之间的所有素数并追加到列表,然后生成第二个上限并找到所有素数然后追加到list,创建一个从初始编号向前和向后扩展的列表。 该程序按我的预期运行,但没有我需要的那么快,因为我要处理的数字会很快变大,每个阶段几乎翻倍。
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
【问题讨论】:
-
如果数字太大而您无法有效筛选从 2 到素数上限的所有数字,请使用 Miller-Rabin 测试素数 (en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test)。您尝试实施的那种试验部门效率极低。
-
即使使用像这样的蛮力方法,您也可以通过意识到如果您在测试数字的平方根时还没有找到质因数来节省大量计算量,你永远不会。此外,除 2 和 3 外,所有素数都是 6 +/- 1 的倍数。
-
谢谢你,John,我熟悉 Miller-Rabin 测试,但我不知道如何在 python 中实现它,我是编码新手,仍在尝试弄清楚如何使我的工作适应编程。我可以手动进行计算,但到目前为止我还没有触及到我需要收集的数据的表面。
-
谢谢马克,关于具体方法的任何指针?作为一名业余编码员,我不知道我不知道多少,更不用说我应该寻找什么,不怕做这项工作,只是寻找一个小方向。我一直在关注的教程只让我找到了我发现的低效方法,我知道这不是最好的方法,并且处理创建类和字典来存储和调用我的研究所需的数据的方法是我还没有掌握。
标签: python performance math primes largenumber