该算法运行多少次?

时间:2015-03-13 07:00:53

标签: python

我在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这样的例子,我可以很容易地弄清楚,但是抽象地说,在计算所有素数因子之前,我似乎无法写出程序运行多少次的“公式”。

3 个答案:

答案 0 :(得分:2)

更多的是数学问题,而不是编程问题,但有点有趣......

n的素数分解形式为:

equation http://mathurl.com/od3x6ua.png

P1是最小的素因子,P2是第二小等因素,而Pk是最大的素因子。

需要考虑两组循环迭代:

  1. in
  2. 的主要因素而发生的循环次数
  3. 由于i不是n
  4. 的主要因素而发生的循环次数

    第1组

    这个数字更容易,因为它总是相同的公式。它是素数因子的每个指数减1的总和,即:

    equation http://mathurl.com/kqemn49.png

    如果您考虑代码在i是一个主要因素时的行为(即在将n除以i时保持循环),则指数的总和应该相当直观。你减1,因为最后一个追加发生在循环之外。

    第2组

    第二组循环稍微棘手,因为公式本身实际上取决于az > 1,还取决于PkP(k-1)的相对大小(第二小) n)的主要因素。

    如果ak > 1,那么通过循环的最后i的值为Pk。因此,评估的i的非素因子值是2和Pk之间不在集合P1Pk中的所有数字。这个公式的结果是:

    equation http://mathurl.com/k8sbqyo.png

    请记住kn的不同素数因子的数量。你最后减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),它将立即退出循环 - 因此最大iP(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只取整数值。

    一个公式......

    你把它们放在一起,然后产生:

    equation http://mathurl.com/muezys5.png

答案 1 :(得分:0)

  • 循环执行约max(prime_factors(n))次?
  • 如果n为素数,则最差的情况为n次。

答案 2 :(得分:0)

如果我理解你的问题并且因为你没有使用递归调用;你要问&#34; while循环执行多少次才能生成给定整数n&#34;的所有素数。

在你的代码中;您正在使用条件while loop运行i * i <= n。但是由于你在方法中操纵变量i,答案很复杂(请参阅@ dnozay的回答)。

如果您有兴趣阅读this链接,告诉它有多复杂。请继续阅读this链接,以深入了解计数功能。