📜  商余数定理(1)

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

商余数定理

商余数定理是模运算中重要的定理之一,常用于密码学、编码、计算机图形学等领域。它可以用来求解多项式除法、线性同余方程以及计算逆元等问题。

定理表述

设$a$和$n$是两个正整数,$a$与$n$不一定互质。任何整数$x$与$a$在模$n$意义下同余的充分必要条件是它们在$Z_{n}$中的商与余数均相等。

具体地,$x$与$a$在模$n$意义下同余的充分必要条件是:存在唯一的一对整数$q$和$r$,$0 \leq r < n$,使得$x = qn + r$,并且$a$与$r$在模$n$意义下同余。

应用实例
多项式除法

考虑多项式$f(x)$和$g(x)$,其中$g(x)$是非零的多项式。商余数定理告诉我们,一定存在唯一的多项式$q(x)$和$r(x)$,满足$f(x) = q(x)g(x) + r(x)$,且$r(x)$的次数小于$g(x)$的次数。

证明如下:首先,如果$f(x)$的次数小于$g(x)$的次数,则令$q(x) = 0$,$r(x) = f(x)$即可。

如果$f(x)$的次数不小于$g(x)$的次数,我们令$x = g^{-1}(0)$,即$x$是$g(x)$的任何一个根。

那么根据定义,我们可以写出$f(x) = q(x)g(x) + r(x)$,其中$r(x)$的次数严格小于$g(x)$的次数,即$r(x)$可以被写成$r(x) = r_{0} + r_{1}x + \cdots + r_{k-1}x^{k-1}$,且$k = \deg(g(x))$。

由于$x$是$g(x)$的一个根,所以$g(x)$与$x$在模$x$意义下同余,即$g(x)$可以被表示为$g(x) = (x - x_{0})h(x)$,其中$h(x)$是一个多项式。

于是$f(x)$又可以被表示为$f(x) = q(x)g(x) + r(x) = q(x)(x - x_{0})h(x) + r(x)$,而根据模运算的性质,$f(x)$与$x - x_{0}$在模$x$意义下同余。因此,$r(x)$也与$x - x_{0}$在模$x$意义下同余。

我们对多项式$r(x)$做如下操作:将它代入上面的式子,并令$x = x_{0}$。那么,我们得到$f(x_{0}) = r(x_{0})$,$g(x_{0}) = 0$,因此$r(x_{0})$是$f(x_{0})$在模$g(x)$意义下的余数。

又因为$r(x)$的次数小于$g(x)$的次数,而$x$是$g(x)$的根,所以$r(x) = d(x)(x - x_{0})$,其中$d(x)$是一个多项式。由于$r(x_{0})$和$g(x_{0})$都为0,我们可以得到$r(x_{0}) = 0$,因此$d(x_{0}) = 0$。

这意味着,$d(x)$可以被表示为$d(x) = (x - x_{0})e(x)$,其中$e(x)$是一个多项式。于是,$r(x)$可以被表示为$r(x) = (x - x_{0})e(x)(x - x_{0}) = (x - x_{0})e(x)g(x)$。

这样,我们就得到了$q(x)$和$r(x)$的表示式$q(x) = (f(x) - r(x))/g(x)$,$r(x) = (f(x) - q(x)g(x))$,证明了多项式除法实际上就是商余数定理的一个应用。

线性同余方程

我们考虑如下形式的线性同余方程:$ax \equiv b (\mod n)$,其中$a$,$b$和$n$都是整数,且$n > 1$。我们的任务是求$x$的值。

首先,如果$a$与$n$不互质,那么方程可能无解。否则,根据微小定理,我们可以在$Z_{n}$中找到一个整数$c$,使得$ac \equiv 1 (\mod n)$。

那么我们将方程两边同时乘以$c$,得到$axc \equiv bc (\mod n)$,因此$x \equiv bc (\mod n)$。这样,我们就能够求出模$n$意义下的解了。关于如何找到$c$,可以使用扩展欧几里得算法或者直接暴力枚举的方法。

计算乘法逆元

在模运算中,如果存在一个元素$x$,它关于模$n$意义下的乘法逆元$x^{-1}$满足$x \cdot x^{-1} \equiv 1 (\mod n)$,那么我们称$x$在模$n$意义下是可逆元。如果$x$在模$n$意义下是可逆元,那么它的乘法逆元$x^{-1}$是唯一的。

为了求解乘法逆元,我们可以使用线性同余方程。设$x$关于模$n$的乘法逆元是$x^{-1}$,那么我们有$xx^{-1} \equiv 1 (\mod n)$。也就是说,$xx^{-1} - 1$能够被$n$整除。

我们将这个式子重写为$ax \equiv 1 (\mod n)$的形式,其中$a = x^{-1}$。由于$a$是整数,我们可以使用扩展欧几里得算法来求解模$n$下的$a^{-1}$,那么$a^{-1}$就是$x$在模$n$意义下的乘法逆元了。

代码实现

以下是使用Python实现乘法逆元的代码:

def extended_euclidean_algorithm(a, b):
    """
    使用扩展欧几里得算法求解a 和 b 的最大公约数以及它们的系数x和y,使得ax + by = gcd(a, b)。
    """
    if b == 0:
        return a, 1, 0
    else:
        gcd, x, y = extended_euclidean_algorithm(b, a % b)
        return gcd, y, x - (a // b) * y


def multiplicative_inverse(x, n):
    """
    使用扩展欧几里得算法计算x在模n意义下的乘法逆元。
    """
    gcd, a, _ = extended_euclidean_algorithm(x, n)
    if gcd != 1:
        raise ValueError("x is not invertible modulo n")
    else:
        return a % n
总结

商余数定理是模运算中重要的定理之一,常用于密码学、编码、计算机图形学等领域。它可以用来求解多项式除法、线性同余方程以及计算逆元等问题。在实际的编程中,在使用商余数定理的时候,需要注意一些细节,如处理负数的情况、约束条件的限制等。