Python 这个算法会运行多少次?

Python 这个算法会运行多少次?,python,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)

我在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
def基本因子(n):
i=2
因子=[]
而i*i 1:
因子。追加(n)
回报率
我的问题是,程序在输入n时会运行多少次以停止? 如果你举一个例子,比如56,我可以很容易地算出它,但抽象地说,我似乎无法写出一个“公式”,在计算所有素数因子之前,程序将运行多少次。

  • 循环执行大约
    max(prime\u factors(n))
  • 如果
    n
    为素数,则最坏情况为
    n

    • 与其说是编程问题,不如说是一个数学问题,但有点有趣

      n
      的素因子分解的形式为:

      其中,
      P1
      是最小的素因子,
      P2
      是第二个最小的etc,
      Pk
      是最大的素因子

      有两组循环迭代需要考虑:

    • 由于
      i
      n
    • 由于
      i
      不是
      n
    • 第一组 这个数字更简单,因为它总是相同的公式。它是素数因子的每个指数减去1的总和,即:

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

      第2组 第二组循环稍微复杂一些,因为公式本身实际上取决于
      az>1
      ,也取决于
      Pk
      p(k-1)
      (n的第二最小素因子)的相对大小

      如果
      ak>1
      ,则通过循环的最后一个
      i
      具有值
      Pk
      。因此,被评估的
      i
      的非素因子值是2到
      Pk
      之间的所有数字,它们不在
      P1
      Pk
      的集合中。其公式是:

      记住
      k
      n
      的不同素数因子的数目。最后减去1是因为它在2和
      Pk
      之间,而不是1和
      Pk
      之间


      另一方面,让我们考虑一下
      ak=1
      (并且
      ak<1
      是不可能的,因为
      ak
      是最大素数因子的指数-它必须是1或更大)。然后
      i
      从不取
      Pk
      的值,因为循环在该点之前结束,因为
      而i*i如果我理解您的问题,并且您没有使用递归调用;您询问“while循环将执行多少次,以生成给定整数
      n
      的所有素数”


      在代码中;你正在运行一个
      while循环,条件是
      i*i这是你的家庭作业吗?你怎么会认为有公式?@PeterWood我想ASm正在寻找某种运行时分析,q.v.这篇文章是针对类似问题的。FWIW,这是Python 3中@barakmanos就地楼层划分的一个实现,所有等式看起来都是相同的答案@你应该看看这个!抱歉,我刚刚发现sciweaver在不断地用mathurl.com图片显示公式方面有点古怪,而mathurl.com图片看起来更稳定。这就是我要找的。我的数学能力还不足以让我自己解决这个问题,但非常有趣!