📜  当大数除以r时求余数的程序(1)

📅  最后修改于: 2023-12-03 15:09:50.969000             🧑  作者: Mango

当大数除以r时求余数的程序

在计算机科学中,当大数除以一个小于它的数时,我们需要求得余数。这时,我们可以使用不同的算法和数据结构。

本文将介绍两个常见的算法:暴力求余和快速幂求余。

算法一:暴力求余

暴力求余是一种最简单的方法,但它并不适用于大数的情况。其实现方法是将大数不断减去r直到得到的结果小于r。此时,剩余的值即为余数。

以下是用Python实现暴力求余的代码:

def mod_divide(x, r):
    while x >= r:
        x -= r
    return x

在上述代码中,我们用while循环不断减去r直到x小于r为止。最终返回的值即为余数。

然而,当大数x远大于r时,暴力求余的效率会变得非常低。因此,我们需要另寻他路。

算法二:快速幂求余

快速幂求余算法不仅效率高,而且适用于大数的情况。其原理是利用了数学定理:

(a * b) % p = ((a % p) * (b % p)) % p

我们可以将大数拆分成若干小数,然后利用上述定理将其求余。为了进一步提高效率,我们可以使用快速幂算法求解幂次。

以下是用Python实现快速幂求余的代码:

def pow_mod(x, y, p):
    res = 1
    x = x % p
    while y > 0:
        if y % 2 == 1:
            res = (res * x) % p
        y = y // 2
        x = (x * x) % p
    return res

def mod_divide(x, r):
    p = 1000000007   # 一般选一个质数作为模数,可以减小错误的概率
    return pow_mod(x, p-2, p) * r % p

在上述代码中,我们首先定义了一个pow_mod函数,用于快速幂求解幂次。然后,在mod_divide函数中,我们定义了一个质数p作为模数,并通过pow_mod函数求解幂次。最终,返回的值即为余数。

总结

以上是两种常见的算法,用于当大数除以小数时求余数。虽然暴力求余非常简单,但效率很低;而快速幂求余虽然稍微复杂一点,但效率很高,而且适用于大数的情况。在实际应用中,我们应该根据具体情况选择合适的算法。