📜  商余数定理(1)

📅  最后修改于: 2023-12-03 14:50:44.582000             🧑  作者: Mango

商余数定理

商余数定理又叫做带余除法定理,是数学中最基本的除法定理之一。它可以将一个整数除以另一个不为零的整数,并保留商和余数的信息。

在程序中,商余数定理被广泛用于处理整数除法的问题,特别是在模运算中,例如求模运算、快速幂、质因数分解等。

定理表述

商余数定理的定义如下:

设$a$和$b$是整数,且$b \neq 0$。则必存在唯一一对整数$q$和$r$,使得$$a = bq + r \quad \text{且} \quad 0 \leq r < |b|$$其中$q$称为商,$r$称为余数。

另外,当$b<0$时,商余数定理的定义有所不同。此时,必须满足$$a = bq + r \quad \text{且} \quad b < r \leq 0$$其中$q$和$r$的含义与上述相同。

应用

商余数定理在程序中的应用非常广泛,尤其是对于整数除法和模运算问题的处理。下面是几个例子。

求模运算

对于一个正整数$a$,我们可以通过商余数定理将它除以另一个正整数$b$,得到一个余数$r$。如果$b$是比$a$小的数,那么$r$就是$a$对$b$取模的结果。

def mod(a, b):
    if b == 0:
        raise ValueError("division by zero")
    q, r = divmod(a, b)
    if r < 0:
        r += abs(b)
    return r
static int mod(int a, int b) {
    if (b == 0)
        throw new ArithmeticException("division by zero");
    int q = a / b;
    int r = a % b;
    if (r < 0)
        r += Math.abs(b);
    return r;
}
快速幂

通过商余数定理,我们可以将整数$a$表示成$b$的幂和余数的和的形式,从而实现快速幂运算。

def pow(x, n, m):
    res = 1
    while n:
        if n & 1:
            res = (res * x) % m
        x = (x * x) % m
        n >>= 1
    return res
static int pow(int x, int n, int m) {
    int res = 1;
    while (n > 0) {
        if ((n & 1) == 1) {
            res = (res * x) % m;
        }
        x = (x * x) % m;
        n >>= 1;
    }
    return res;
}
质因数分解

通过不断地应用商余数定理,我们可以将一个大整数分解成若干个质数的乘积的形式。

def factors(n):
    res = []
    i = 2
    while i * i <= n:
        if n % i == 0:
            res.append(i)
            n //= i
        else:
            i += 1
    if n > 1:
        res.append(n)
    return res
static List<Integer> factors(int n) {
    List<Integer> res = new ArrayList<>();
    int i = 2;
    while (i * i <= n) {
        if (n % i == 0) {
            res.add(i);
            n /= i;
        } else {
            i += 1;
        }
    }
    if (n > 1) {
        res.add(n);
    }
    return res;
}
总结

商余数定理是一条非常基础而又实用的数学定理,在程序中有广泛的应用。通过商余数定理,我们可以将整数除法和模运算等问题转化成更容易处理的形式,从而简化代码,提高效率。