我在python中有一个函数来计算数字的素因子:
def prime_factors(n):
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
我的问题是,程序在输入n上停止运行多少次? 如果你举一个像56这样的例子,我可以很容易地弄清楚,但是抽象地说,在计算所有素数因子之前,我似乎无法写出程序运行多少次的“公式”。
答案 0 :(得分:2)
更多的是数学问题,而不是编程问题,但有点有趣......
让n
的素数分解形式为:
equation http://mathurl.com/od3x6ua.png
P1
是最小的素因子,P2
是第二小等因素,而Pk
是最大的素因子。
需要考虑两组循环迭代:
i
是n
i
不是n
这个数字更容易,因为它总是相同的公式。它是素数因子的每个指数减1的总和,即:
equation http://mathurl.com/kqemn49.png
如果您考虑代码在i
是一个主要因素时的行为(即在将n
除以i
时保持循环),则指数的总和应该相当直观。你减1,因为最后一个追加发生在循环之外。
第二组循环稍微棘手,因为公式本身实际上取决于az > 1
,还取决于Pk
和P(k-1)
的相对大小(第二小) n
)的主要因素。
如果ak > 1
,那么通过循环的最后i
的值为Pk
。因此,评估的i
的非素因子值是2和Pk
之间不在集合P1
到Pk
中的所有数字。这个公式的结果是:
equation http://mathurl.com/k8sbqyo.png
请记住k
是n
的不同素数因子的数量。你最后减1,因为它介于2和Pk
之间,而不是1和Pk
。
另一方面,让我们考虑ak = 1
(和ak < 1
是不可能的情况,因为ak
是最大素因子的指数 - 它必须是1或大)。然后i
从未获取Pk
的值,因为循环在该点之前结束,因为while i * i <= n:
条件。
那么在这种情况下,i
将采取的最大值是多少?这得看情况。
请注意,如果ak = 1
,那么n
所采用的最后一个值为Pk
。如果第二大素因子P(k-1)
大于Pk
的平方根,那么一旦循环结束i = P(k-1)
,它将立即退出循环 - 因此最大i
是P(k-1)
。另一方面,如果Pk
的平方根较大,则循环将在退出之前继续到该级别。因此,当i
等于ak = 1
时,max(P(k-1), Pk**0.5)
最大。这里循环次数的公式如下:
equation http://mathurl.com/q8q6x9b.png
简化为:
equation http://mathurl.com/osmgca6.png
请注意,我们取Pk的平方根,因为i
只取整数值。
你把它们放在一起,然后产生:
答案 1 :(得分:0)
max(prime_factors(n))
次?n
为素数,则最差的情况为n
次。答案 2 :(得分:0)