我在python中编写了这个简单的代码来计算给定数量的素数。
我想问的问题是,我是否可以编写一个脚本来计算在处理器周期方面需要多长时间执行此操作?如果是,那么如何?
primes = [2]
pstep = 3
count = 1
def ifprime (a):
""" Checking if the passed number is prime or not"""
global primes
for check in primes:
if (a%check) == 0:
return False
return True
while 1000000000>= count:
if ifprime(pstep):
primes.append (pstep)
print pstep
count += 1
pstep += 1
关于这个问题的有趣之处在于,在x个增量循环之后是否找到素数几乎是不可能预测的。此外,在这种情况下会发生递归,因为较大的“素数”列表会增加执行此函数所需的时间。
任何提示?
答案 0 :(得分:2)
我认为你必须使用素数分布的近似值,la PNT(我认为)指出在1和x之间你会有大约x/ln(x)
素数(即自然日志)。因此,如果对单次迭代所花费的时间进行粗略估计,您应该能够创建估计值。
您的列表中有大约x / ln(x)个素数。你的主代码块(在while循环中)有恒定的时间(有效)......所以:
t(x)~x / ln(x)* a + b + t(x-1)
其中t(x)
是迭代x所需的时间,a
是检查列表中每个素数所需的时间(模态操作),b
是'主循环的恒定时间。我依旧记得有一种方法可以将这种递归函数转换为线性函数;)
答案 1 :(得分:2)
如果你想预测任意过程在完成之前所需的时间,你就不能这样做,因为这基本上是Halting Problem背后的问题。在特殊情况下,您可以估计脚本将花费的时间,例如,如果您知道它是以不允许循环的方式生成的。
在你查找素数的特殊情况下,更难以猜测在运行过程之前需要的时间,因为在一个intervall中只有一个素数的下限,但这无助于查找它们。
答案 2 :(得分:0)
好吧,如果你在Linux上,你可以使用'time'命令,然后解析它的结果。
对于你的问题,我会为不同大小的1000个大质数进行计时并绘制图表,因此很容易进行分析。
答案 3 :(得分:0)
嗯,理论计算机科学有很大的分支 - 复杂性理论 - 致力于解决这类问题。你在这里遇到的一般问题(决定代码是否会完成任意输入)就是所谓的“NP-complete”,因此很难。
但在这种情况下,您可能有两种选择。
首先是使用蛮力。为a=1, 2, 3, 4, ...
运行isprime(a)的timeit,绘制时间图,并尝试查看它是否显而易见:a^2
,a log a
,无论如何。
正确但更难的答案是分析您的算法,看看您是否可以计算出“典型案例”所需的操作次数。
答案 4 :(得分:0)
当你调用isprime(pstep)时,你正在循环pstep * ln(pstep)次,如果你有一个素数,其概率是1 / ln(pstep)。因此,测试素数的成本与步长成正比。未知是测试复合材料的成本,因为我们不知道复合材料在2和N之间的平均最低因子。如果我们忽略它,假设它由素数的成本占主导地位,我们得到SUM的总成本(pstep)对于pstep = 3到N + 3,这与N ** 2成比例。
当你选中>时,你可以通过切断isprime()中的循环来将其减少到N ** 1.5。 SQRT(a)所示。