代码之家  ›  专栏  ›  技术社区  ›  asmmo

以下求幂的除法和并发递归算法是否比大数的迭代算法更有效?

  •  0
  • asmmo  · 技术社区  · 5 年前

    我有以下两种算法。我的分析表明,它们都是O(m^2+4^n),即它们对于大数是等价的。这样对吗?。请注意 m n 这些比特数是 x y

    def pow1(x, y):
    
        if y == 0:
            return 1
        temp = x
        while y > 1:
            y -= 1
            temp *= x
        return temp
    
    def pow2(x, y):
    
        if y == 0:
            return 1
        temp = pow2(x, y//2)
        if y & 1:    return temp * temp * x
        return temp * temp
    

    enter image description here

    0 回复  |  直到 5 年前
        1
  •  1
  •   Hans Musgrave    5 年前

    分治算法是否更有效取决于许多因素。在Python中,效率更高。

    你的分析是正确的;假设标准的小学乘法,除法和征服做的乘法更少,更昂贵,并且渐近地使总运行时间变得一团糟(常数因子可能很重要——我仍然认为除法和征服会更快,因为大部分工作都发生在优化的C中,而不是Python的循环开销中,但这只是一种预感,鉴于Python不使用基本的乘法算法,很难进行测试)。

    在进一步讨论之前,请注意Python中的大整数乘法是m^2的小o。特别地,它使用karatsuba,对于m位整数和m<n位整数,kartsuba大约为O(m^0.58n)=n

    使用普通乘法的小项在渐近上并不重要,因此专注于大项,我们可以替换乘法成本,发现你的迭代算法大约在O(4^n m^1.58)左右,你的分治解在O(3^n m^ 1.58)附近。