快速幂运算/连续平方算法在处理大位数时速度过慢

1 投票
1 回答
2232 浏览
提问于 2025-04-18 05:46

我正在尝试在Python中实现一个模运算的快速幂算法,但似乎遇到了很大的瓶颈。 根据我的理解,你需要找到指数的二进制表示,然后计算基数的平方(base^2^i),其中i是二进制位数。 我的Python代码是网上和教科书上常见的算法定义的实现:

    def fastPower(base, exp, mod):
        base %= mod
        workingExp = exp
        product = 1
        upperBound = range(int(math.ceil(math.log(exp,2))))
        for i in upperBound:
            print upperBound
            binDigit = workingExp % 2
            workingExp /= 2
            binExp = (binDigit << i)
            product *= base ** binExp
            product %= mod
        return product

瓶颈出现在 product *= base ** binExp 这一行,因为当你处理20位数字时,2的幂会变得非常大,这会导致幂运算的速度变得很慢,远远达不到快速幂的效果。 在这个实现中,我是不是遗漏了什么与模运算相关的独特之处?或者说,我是否把某些操作放在了不太合适的位置,影响了优化效果?

1 个回答

2

嗯……我对这样的东西更熟悉:

def fastPower(base, exp, mod):
    if exp == 0:
        x = 1
    else:
        half = fastPower(base, exp // 2, mod)  # just / in Python 2
        x = half * half
        if exp % 2 == 1:
            x *= base
    return x % mod

虽然因为使用了递归,这种方法会有一点额外的开销,但它的逻辑非常清晰,而且速度也还算快。

或者,如果我想让它更快的话:

def fastPower(base, exp, mod):
    return pow(base, exp, mod)

撰写回答