浅谈同余问题

同余问题学习笔记

1.同余符号

若任意两个整数 \(a,b\)\(m\) 的值是相同的,那么我们可以表示成以下形式

\[a\equiv b \pmod m \]

读作: \(a\) 同余于 \(b\)\(m\) ,或读作 \(a\)\(b\) 对模 \(m\) 同余

2.同余符号的性质

1.反身性:\(a \equiv a \pmod m\)

证明:\(a\)\(m\) 一定等于 \(a\)\(m\)

2.对称性:若\(a \equiv b \pmod m\),则\(b \equiv a \pmod m\)

证明:\(a\)\(b\) 同余,\(b\) 一定和 \(a\) 同余。

3.传递性:若\(a \equiv b \pmod m\)\(b \equiv c \pmod m\),则\(a \equiv c \pmod m\)

证明:设 \(a,b,c\)\(m\) 取余分别为 \(x,y,z\) ,那么 \(x=y,y=z,x=z\)

4.同余式相加:若\(a \equiv b \pmod m\)\(c \equiv d \pmod m\),则 ,\(a \pm c \equiv b \pm d \pmod m\)

5.同余式相乘:若\(a \equiv b \pmod m\)\(c \equiv d \pmod m\),则\(ac \equiv bd \pmod m\)

然后当 \(a,b\)\(m\) 同余的时候,那么 \(m|(a-b)\)

那么我们 \(a\) 看成 \(km+r\) ,这里 \(k\)\(a/m\) 的商,\(r\)\(a \mod m\) ,同理,我们将 \(b\) 看成 \(lm+r\)

那么我们将 \(m\) 提出来,两数相减即为 \((k-l)m\) 所以 \(a-b\) 即为 \(m\) 的倍数。

3.相关定理

1.裴蜀定理

\(a,b\) 是整数,且 \(\gcd(a,b)=d\),那么对于任意的整数 \(x,y,ax+by\) 都一定是 \(d\) 的倍数
特别地,一定存在整数 \(x,y\),使 \(ax+by=d\) 成立

证明:

既然是求 \(\gcd\) ,我们就可以模拟一下欧几里得算法(可以先看后面)

我们设 \(a \leq b\) ,由辗转相除法的过程 \(\gcd(x,y)=\gcd(y,x \bmod y)\),可以得到

\(b=ax_1+r_1\),那么 \(b \bmod a\)\(b=r_1\)

重复过程,得到以下式子:

\[b=ax_1+r_1\\ \]

\[a=ax_2+r_2\\ \]

\[r_1=r_2x_3+r_3\\ \]

\[......\\ \]

\[r_{k-3}=r_{k-2}x_{k-1}+r_{k-1}(1)\\ \]

\[r_{k-2}=r_{k-1}x_k+r_{k}(2)\\ \]

\[r_{k-1}=r_{k}x_{k+1}+r_{k+1} \]

因为辗转相除法最后得到的余数为 \(0\),在这里,我们不妨设 \(r_{k+1}=0\) ,那么,\(r_k\) 就是 \(a,b\) 的最大公约数,即 \(r_k=d\) ,将这个东西带入 \((2)\) 式子,那么这个时候我们得到以下式子

\[r_{k-2}=r_{k-1}x_k+d \]

移项得到

\[d=r_{k-2}-r_{k-1}x_k(3) \]

\((1)\) 式子移项

\[r_{k-1}=r_{k-3}-r_{k-2}x_{k}(4) \]

\((4)\) 式带入 \((3)\)

\(d=r_{k-2}-(r_{k-3}-r_{k-2}x_{k})x_{k}\)

把式子展开

\(d=m_1r_{k-2}+n_1r_{k-3}\)

很明显,我们上面用的都是整数,所以 \(m_1,n_1\) 肯定也都是整数,那如果我们把原来的 \((3)\) 式子转化成这种形式 \(d=mr_{k-1}+nr_{k-2}\)

我们将这个式子跟上面的一对比,是不是发现了什么规律?

\(d = m_ka+n_kb\)

我们知道,\(m_k\)\(n_k\) 都是整数,故 \(ax+by=d\) 一定有整数解。


推论1:对于方程 \(ax + by = 1\) , 只有当整数 \(a,b\) 互质时,方程才有整数解.

反证法:

\(a,b\) 不是互质的,那么 \(a,b\) 可以表示成 \(a=q*\gcd(a,b)\)\(b=p*\gcd(a,b)\), 带入上面的式子,易得

\[q*\gcd(a,b)*x+p*\gcd(a,b)*y=1 \]

如果两边同时除以一个 \(\gcd(a,b)\),得到:

\[qx+py=\frac{1}{\gcd(a,b)} \]

显然,如果 \(a,b\) 不是互质的话,那么等式右边就是一个小数,所以该方程不存在整数解,得证。

另外,可以得到 \(a,b\) 互质的充要条件就是 \(ax+by=1\) 要有整数解


推论2:对于方程 \(ax+by=z\) , 只有满足 \(\gcd(a,b)|z\) ,方程才有整数解

证明:

\(d=\gcd(a,b)\)\(z=d*q\)

对于方程 \(ax+by=d\) ,我们有一组解 \(x_1,y_1\),那么就有:

\[ax_1+by_1=d \]

两边同时乘上 \(q\) ,易得:

\[ax_1*q+by_1*q=d*q \]

因为 \(z=d*q\)

所以方程 \(ax+by=z\) ,一定存在一组整数解 \(x=x_1*q,y=y_1*q\),得证。

2.欧几里得算法

欧几里得算法的目的是简单的求出两个正整数的最大公因数。

那么我们证明一下这个算法:

\(c=\gcd(a,b)\),设\(a=mc,b=nc\)
\(a÷b=k......r\)可得 \(r=a-kb=mc-knc=(m-kn)\)
第二步不难看出,\(c\) 也是 \(r\) 的因数;
列出 \(b=nc\)\(r=(m-kn)c\) ,如果 \(n\)\(m-kn\) 互质,即两者公约数只有 \(1\) ,则表明 \(c\)\(b\)\(r\) 的最大公约数,后续证明 \(n\)\(m-kn\) 互质;
假设 \(m-kn\)\(n\) 不是互质,两者有一非零的最大公约数 \(d\) ,且 \(d>1\)
则有 \(m-kn=xd\)\(n=yd\),得 \(m=kn+xd=kyd+xd=(ky+x)d\) ,则 \(a=mc=(ky+x)dc\)\(b=nc=ycd\),则 \(a\)\(b\) 的一个公约数 \(cd>c\),故 \(c\) 不是 \(a\)\(b\) 的最大公约数,这与前面提到的 \(c\)\(a\)\(b\) 的最大公约数假设矛盾;
\(m-kn\)\(n\) 为互质,即 \(c\)\(b\)\(r\) 的最大公约数,且是 \(a\)\(b\) 的最大公约数,得证。

此算法实现流程图:

3.扩展欧几里得算法

对于求解方程 \(ax+by=\gcd(a,b)\)

先考虑特殊情况,如果 \(b=0\) ,那么 \(\gcd(a,b)=a\),显然存在一组解 \(x=1,y=0\)

设之前的方程为 \(ax_1+by_1=\gcd(a,b)\) ,肯定存在式子 \(bx_2 +(a\bmod b)y_2=\gcd(b,a \bmod b)\)

根据刚刚讲的欧几里得算法,\(\gcd(a,b)=\gcd(b,a \bmod b)\)

所以 \(ax_1+by_1=bx_2+(a \mod b)\)

因为 \(a \mod b=a-a/b*b\)

所以 \(ax_1+by_1=bx_2+(a-a/b*b)*y_2\)

\(ax_1+by_1=bx_2+a-a/b*b*y_2\)

\(ax_1+by_1=ay_2+b(x_2-a/b*y_2)\)

所以 \(x_1=y_2,y_1=x_2-a/b*y_2\)

code:

void exgcd(ll a, ll b)
{
    if(b == 0)
    {
        x = 1, y = 0;
        return;
    }
    exgcd(b, a % b);
    ll t = x;
    x = y;
    y = t - a / b * y;
}

然后我们这个东西还能求逆元,怎么求呢?

\(x\)\(a\)\(p\) 意义下的逆元,那么满足式子:

\(ax \equiv 1 \pmod m\)

那么有 \(ax + my=1\), 接着用扩展欧几里得定理来做即可。

4.中国剩余定理

假设正整数 \(m_1,m_2,·····,m_n\)两两互素,则同余方程组:

\[\begin{cases}x \equiv a_1 \pmod {m_1} \\x \equiv a_2 \pmod {m_2} \\······ \\x \equiv a_n \pmod {m_n} \end{cases} \]

有整数解,并且在模 \(M=\prod_{i=1}^nm_i\)的解是唯一的,解为:

\[x \equiv (a_1M_1M_1^{-1}+a_2M_2M_2^{-1}+···a_nM_nM_n^{-1}) \bmod M \]

其中 \(M_i\) 表示 \(M/m_i\)\(M_i^{-1}\)\(M_i\)\(m_i\) 的逆元。

证明:

我们要证明是上述同余方程的解,则需要对每个方程考察通解 \(x\) 中的每一项

对于 \(\forall i ∈ {1,2,···,n}\),证明

\[a \equiv a_i (\bmod m_i) \]

下面考察通解 \(x\) 中的每一项

\(\forall j ∈ {1,2,···,n}\),令 \(x_j=a_jM_jM_j^{-1}\),则 \(i,j\) 可以分成两种情况。

  1. \(i ≠ j\) ,由于 \(M_j=M/m_j\) ,所以 \(M_j \bmod m_i=0\) ,所以 \(x_j \bmod m_i=0\)
  2. \(i=j\),由于 \(M_j=M/m_j\),且 \(m_1,m_2,···,m_n\) 两两互素,所以 \(M_jM_j^{-1} \equiv 1 (\bmod m_i)\),故 \(x_j \equiv a_j(\bmod m_i)\)

则:

\(x \equiv (a_1M_1M_1^{-1}+a_2M_2M_2^{-1}+···a_nM_nM_n^{-1}) \bmod M \bmod m_i\)

$ \equiv(x_1+x_2+···+x_n) \bmod m_i$

\(\equiv(a_i\sum_{j≠i}0)\bmod m_i\)

\(\equiv a_i \bmod m_i\)

\(∀i∈{1,2,⋯,n}\)\(x \equiv (a_1M_1M_1^{-1}+a_2M_2M_2^{-1}+···a_nM_nM_n^{-1}) \bmod M\),满足\(x \equiv a_i(\bmod m_i)\) ,可得 \(x\) 是方程通解,证毕。

5.线性求逆元

\(ax \equiv 1(\bmod b)\) ,且 \(a,b\) 互质,则称 \(x\)\(a\) 的逆元,记作 \(a^{-1}\) ,在计算 \((t/a) \bmod b\) 时等价于 \(t*a^{-1} \bmod b\) ,那么显然可以转化为 \(ax+by=1\) ,用我们刚刚讲的扩展欧几里得算法来求解,但相对来说,这种算法太慢了,这里还有线性的做法:

首先 \(1^{-1} \equiv 1(\bmod p)\)

\(p=k*i+r\) ,那么可以推导出来 \(k*i+r \equiv 0 \pmod p\),将两边同乘 \(i^{-1},r^{-1}\),在 \(\bmod p\) 意义下

\[k*r^{-1}+i^{-1} \equiv 0 \]

移项:

\[i^{-1}=-k*r^{-1} \]

然后我们 \(p\) 的定义,易得 \(k=p/i\) , \(r=p \bmod i\)

所以易得:

\[i^{-1}=-{p/i}*({p \bmod i}) ^ {-1} \]

所以求第 \(i\) 个数的逆元的递推式子就出来了

\[x_i=-p/i*x_{p \bmod i} \]

for(int i=2;i<=n;i++)
{
    inv[i]=(long long)(-p/i)*inv[p%i]%p;
    cout << inv[i] << "\n";
}

推荐博文

  1. 扩展欧几里得

  2. 裴蜀定理

3.中国剩余定理

posted @ 2022-08-08 16:25  ljfyyds  阅读(504)  评论(0)    收藏  举报