同余
模运算
一般地,对于 \(\forall a\in\mathbb{Z},\forall b\in\mathbb{N_+}\),有:
模运算的优先级和乘法、除法的优先级相同。
性质
-
\((a+b)\bmod m=(a\bmod m+b\bmod m)\bmod m\)。
- Proof:
\(a\) 可以表示为 \(k_1m+r_1\),\(b\) 可以表示为 \(k_2m+r_2\)。(\(0\le r_1,r_2<m\))
那么 \(a+b=k_1m+r_1+k_2m+r_2=m(k_1+k_2)+r_1+r_2\)。
因为 \(m\mid m(k_1+k_2)\),所以 \(m(k_1+k_2)\) 对余数没有影响。
所以 \((a+b)\bmod m=(r_1+r_2)\bmod m\)。
对于等号右边的式子:
\(\because a\bmod m=r_1,b\bmod m=r_2\)
\(\therefore(a\bmod m+b\bmod m)\bmod m=(r_1+r_2)\bmod m\)
\(\therefore(r_1+r_2)\bmod m=(a+b)\bmod m=(a\bmod m+b\bmod m)\bmod m\)
证毕。
- Proof:
-
\(a\times b\bmod m=(a\bmod m)\times(b\bmod m)\bmod m\)。
- Proof:
与性质 \(\verb!1!\) 的证明类似。
在此不再证明。
- Proof:
-
若 \(a\perp m,b\perp m\),则有 \((ab\bmod m)\perp m\)。
- Proof:
因为 \(a\perp m,b\perp m\),所以 \(a,b\) 与 \(m\) 没有相同的质因子,自然 \(ab\) 与 \(m\) 也没有相同的质因子。
那么 \(\gcd(ab,m)=1\)。
利用辗转相除法,得 \(1=\gcd(ab,m)=\gcd(m,ab\bmod m)\)。
即 \(\gcd(ab\bmod m,m)=1\)。
证毕。
- Proof:
-
若 \(a\ge m\),则 \(a\bmod m<\frac{a}{2}\)。
- Proof:
\(a\) 可以表示为 \(km+r\)(\(a\bmod m=r\))。
\(\because r<m\)
\(\therefore r<km\Rightarrow r+r<km+r\Rightarrow 2r<a\Rightarrow r<\frac{a}{2}\)
证毕。
- Proof:
-
对于 \(\forall k\in\mathbb{N_+}\),有 \(a\bmod m=(a\bmod km)\bmod m\)。
- Proof:
\(a\bmod km\) 可以表示为 \(a-km\lfloor\frac{a}{km}\rfloor\)。
因为 \(m\mid km\lfloor\frac{a}{km}\rfloor\),所以 \(km\lfloor\frac{a}{km}\rfloor\) 对余数没有影响。
所以 \((a\bmod km)\bmod m=(a-km\lfloor\frac{a}{km}\rfloor)\bmod m=a\bmod m\)。
证毕。
- Proof:
-
若 \(k\mid a\),则有 \(\frac{a}{k}\bmod m=\frac{a\bmod km}{k}\)。
- Proof:
由定义可得:\(\dfrac{a\bmod km}{k}=\dfrac{a-km\lfloor\frac{a}{km}\rfloor}{k}=\dfrac{a}{k}-m\lfloor\dfrac{a}{km}\rfloor=\dfrac{a}{k}\bmod m\)。
证毕。
- Proof:
同余
定义:
若 \(a,b\)(\(a,b\in\mathbb{Z}\))除以 \(m\)(\(m\in\mathbb{N_+}\))的余数相等,则称 \(a,b\) 在模 \(m\) 意义下同余,写作:
性质
-
\(a\equiv b\pmod m\Longleftrightarrow a-b\equiv 0\pmod m\Longleftrightarrow m\mid(a-b)\)。
-
若 \(a\equiv b\pmod m\),那么 \(a+c\equiv b+c\pmod m,a\times c\equiv b\times c\pmod m\)。
-
若 \(a\equiv b\pmod m,c\equiv d\pmod m\),则 \(ac\equiv bd\pmod m\)。
- Proof:
\(\because a\equiv b\pmod m,c\equiv d\pmod m\)
\(\therefore a=b+k_1m,c=d+k_2m\)
\(\therefore ac=(b+k_1m)(d+k_2m)=bd+k_1k_2m^2+dk_1m+bk_2m\)
\(\because m\mid(k_1k_2m^2+dk_1m+bk_2m)\)
\(\therefore k_1k_2m^2+dk_1m+bk_2m\) 对余数没有影响。
\(\therefore ac\equiv bd\pmod m\)
证毕。
- Proof:
-
\(ac\equiv bc\pmod m\Rightarrow a\equiv b\pmod{\frac{m}{\gcd(c,m)}}\)。
- Proof:
\(ac\equiv bc\pmod m\Rightarrow c(a-b)\equiv 0\pmod m\Rightarrow m\mid c(a-b)\)。
设 \(d=\gcd(c,m),c=k_1d,m=k_2d\)(\(k_1,k_2\in\mathbb{Z}\))。
则 \(k_2d\mid k_1d(a-b)\Rightarrow k_2\mid k_1(a-b)\)。
由 \(\gcd\) 的定义可得:\(k_1\perp k_2\)。
所以 \(k_2\mid(a-b)\Rightarrow a-b\equiv 0\pmod{k_2}\Rightarrow a\equiv b\pmod{k_2}\Rightarrow a\equiv b\pmod{\frac{m}{\gcd(c,m)}}\)。
证毕。
- Proof:
-
\(a\equiv b\pmod m\Rightarrow \frac{a}{d}\equiv\frac{b}{d}\pmod{\frac{m}{d}}\)(\(d\mid\gcd(a,b,m)\))。
- Proof:
与性质 \(\verb!4!\) 的证明类似。
\(a\equiv b\pmod m\Rightarrow m\mid(a-b)\Rightarrow\frac{m}{d}\mid(\frac{a}{d}-\frac{b}{d})\Rightarrow\frac{a}{d}\equiv\frac{b}{d}\pmod{\frac{m}{d}}\)。
证毕。
- Proof:
-
若存在一个特解 \(x_0\) 满足 \(\begin{cases}x\equiv a_1\pmod{m_1}\\ x\equiv a_2\pmod{m_2}\end{cases}\),那么通解为 \(x=x_0+k\operatorname{lcm}(m_1,m_2)\),其中 \(k\in\mathbb{Z}\)。
- Proof:
对于特解 \(x_0\) 有 \(x_0\equiv a_1\pmod{m_1},x_0\equiv a_2\pmod{m_2}\),
对于通解 \(x\) 有 \(x\equiv a_1\pmod{m_1},x\equiv a_2\pmod{m_2}\)。
所以 \(x-x_0\equiv 0\pmod{m_1},x-x_0\equiv 0\pmod{m_2}\),即 \(x-x_0\) 是 \(m_1,m_2\) 的公倍数。
于是可得 \(x-x_0\equiv 0\pmod{\operatorname{lcm}(m_1,m_2)}\Rightarrow x\equiv x_0\pmod{\operatorname{lcm}(m_1,m_2)}\Rightarrow x=x_0+k\operatorname{lcm}(m_1,m_2)\)。
为什么是 \(\bmod \operatorname{lcm}(m_1,m_2)\)?因为 \(m_1,m_2\) 的任意公倍数一定是 \(\operatorname{lcm}(m_1,m_2)\) 的倍数。
- Proof:
同余类与剩余系
同余类的定义:
对于 \(\forall a\in[0,m-1]\),集合 \(\{a+km\}\)(\(k\in\mathbb{Z}\))的所有数在模 \(m\) 意义下同余,余数都是 \(a\)。则该集合称为一个模 \(m\) 的同余类,记作 \(\overline{a}\)。
完全剩余系的定义:
模 \(m\) 的同余类一共有 \(m\) 个,分别为 \(\overline{0},\overline{1},\overline{2},\cdots,\overline{m-1}\)。它们构成 \(m\) 的完全剩余系。
简化剩余系的定义:
\([1,m]\) 中与 \(m\) 互质的数代表的同余类共有 \(\varphi(m)\) 个,它们构成 \(m\) 的简化剩余系。
简化剩余系关于模 \(m\) 乘法封闭。
Proof:
设 \(a,b\in[1,m]\) 且 \(a\perp m,b\perp m\)。
根据模运算的性质 \(\verb!3!\),可知 \((ab\bmod m)\perp m\)。
所以 \(ab\) 属于 \(m\) 的简化剩余系。
证毕。
费马小定理
若 \(p\) 是质数,则对于 \(\forall a\in\mathbb{Z}\) 满足 \(a\perp p\),有:
Proof:
设 \(S_1=\{x\mid x\in[1,p-1]\},S_2=\{y\mid y=ax\bmod p,x\in S_1\}\)。
先证明 \(S_2=\{y\mid y\in[1,p-1]\}\)。
考虑使用反证法。
假设 \(\exists y_1,y_2\in S_1\) 且 \(y_1\ne y_2\),能够满足 \(ay_1\equiv ay_2\pmod p\)。
根据同余的性质 \(\verb!4!\),可得:\(y_1\equiv y_2\pmod p\)。
矛盾,假设不成立。那么有没有可能 \(0\in S_2\)?
\(\because a\perp p,x\perp p\)(\(x\in S_1\))
\(\therefore ax\perp p\)
\(\therefore ax\bmod p\ne 0\)
即 \(0\notin S_2\)\(S_2\) 必须有 \(p-1\) 个元素,并且元素取值范围是 \([1,p-1]\),那么 \(S_2\) 只能是 \(\{y\mid y\in[1,p-1]\}\)。
证毕。
因为 \(p\perp x\)(\(x\in[1,p-1]\)),那么把 \(S_1\) 和 \(S_2\) 所有的元素乘起来,可得:
\[\begin{align*} (p-1)! &\equiv a^{p-1}(p-1)! &\pmod p\\ a^{p-1} &\equiv 1 &\pmod p \end{align*}\]证毕。
欧拉定理
若 \(a\in\mathbb{Z},m\in\mathbb{N_+}\) 且 \(a\perp m\),有:
可以发现:费马小定理是欧拉定理的一种特殊请况,即 \(m\) 为质数的情况。因为当 \(m\) 为质数时,\(\varphi(m)=m-1\)。
欧拉定理 \(^\prime s\ \mathcal{Proof}\):
与费马小定理的证明类似。
设 \(S_1=\{r_1,r_2,\cdots,r_{\varphi(m)}\},S_2=\{y\mid y=ax\bmod m,x\in S_1\}\)(\(r_i\perp m\))。
易得:\(S_2=S_1\)。
同样乘起来,得:\[\begin{align*} r_1r_2\cdots r_{\varphi(m)} &\equiv a^{\varphi(m)}r_1r_2\cdots r_{\varphi(m)} &\pmod m\\ a^{\varphi(m)} &\equiv 1 &\pmod m \end{align*}\]证毕。
推论 \(\verb!I!\)
若 \(a\in\mathbb{Z},m\in\mathbb{N_+}\) 且 \(a\perp m\),则对于 \(\forall b\in\mathbb{N_+}\),有:
Proof:
由模运算的定义可得:\(b=k\varphi(m)+r\)(\(r=b\bmod\varphi(m)\)),那么:
\[a^b\equiv a^{k\varphi(m)+r}\equiv a^{k\varphi(m)}\times a^r\equiv(a^{\varphi(m)})^k\times a^r\pmod m \]由欧拉定理,得:
\[(a^{\varphi(m)})^k\times a^r\equiv 1^k\times a^r\equiv a^r\pmod m \]即 \(a^b\equiv a^{b\bmod\varphi(m)}\pmod m\)。
证毕。
推论 \(\verb!II!\)
若 \(a\in\mathbb{Z},m\in\mathbb{N_+}\) 且 \(a\perp m\),则使得 \(a^x\equiv 1\pmod m\) 成立的最小正整数 \(x\) 满足:
Proof:
考虑使用反证法。
假设 \(\exists x\) 满足 \(x\nmid\varphi(m)\)。根据模运算的定义可得:\(\varphi(m)=kx+r\)(\(r=\varphi(m)\bmod x\))。
\(\because a^x\equiv 1\pmod m\)
\(\therefore a^{kx}\equiv 1\pmod m\)
\(\because a^{\varphi(m)}\equiv 1\pmod m\)
\(\therefore a^{\varphi(m)}\equiv a^{kx+r}\equiv a^{kx}\times a^r\equiv a^r\pmod m\)
\(\therefore a^r\equiv 1\pmod m\)显然 \(r<x\)。
与 \(x\) 的定义矛盾。
假设不成立,原命题成立。
扩展欧拉定理
扩展到 \(a,m\) 不互质的情况。
Proof:
咕咕咕
乘法逆元
众所周知,如果 \(a\equiv b\pmod m\) 成立,那么 \(\frac{a}{c}\equiv\frac{b}{c}\pmod m\) 是不一定成立的,所以我们需要找到一种方法来做取模意义下的除法。
于是本章主角出现了——逆元。
定义:
对于 \(\forall a\in\mathbb{Z}\) 和 \(\forall m\in\mathbb{N_+}\),若 \(\exists x\in\mathbb{Z}\) 满足 \(ax\equiv 1\pmod m\),则称 \(x\) 是 \(a\) 在模 \(m\) 意义下的乘法逆元,记作 \(a^{-1}\pmod m\)。
存在条件:
当且仅当 \(a\perp m\) 时,\(a\) 在模 \(m\) 意义下的逆元才会存在。
Proof:
设 \(ax\equiv 1\pmod m\)。
考虑使用反证法。
假设 \(\gcd(a,m)=d>1\),则 \(a=k_1d,m=k_2d\)。
由模运算的定义可得:\(ax\bmod m=k_1dx\bmod >k_2d=k_1dx-k_2d\lfloor\frac{k_1dx}{k_2d}\rfloor=d(k_1x-k_2\lfloor\frac{k_1x}{k_2}\rfloor)\)。
因为 \(d>1\),所以 \(ax\bmod m\) 绝对不可能为 \(1\)。故假设不成立,原命题成立。
费马小定理求逆元
若 \(p\) 为质数,且对于 \(\forall a\in\mathbb{Z}\),满足 \(a\perp p\)。
根据费马小定理,得 \(a^{p-1}\equiv 1\pmod p\)。
众所周知,\(a\) 乘上它的逆元后模 \(p\) 是等于 \(1\) 的,并且上式等号右边也出现了 \(1\),那么把等号左边的式子化成 \(ax\) 的形式不就行了吗?
于是令 \(ax=a^{p-1}\)。
那么 \(x=a^{p-2}\)。
所以 \(a^{p-2}\) 就是 \(a\) 在模 \(p\) 意义下 的逆元。
利用快速幂,可以 \(\mathcal{O}(\log p)\) 的求出一个数的逆元。
欧拉定理求逆元
与费马小定理求逆元类似。
不过欧拉定理求逆元适用于 \(m\) 不一定是质数的情况。
当然,\(a,m\) 仍需满足 \(a\perp m\)。
\(a\) 在模 \(m\) 意义下的逆元是 \(a^{\varphi(m)-1}\)。
由于我们需要求 \(\varphi(m)\),因此我们需要多支出一些时间复杂度(\(\mathcal{O}(\sqrt{m})\) 或 \(\mathcal{O}(m)\))来求欧拉函数。
Although 时间复杂度不太优秀,它可以处理 \(\forall m\in\mathbb{N_+}\) 的情况。
扩展欧几里得算法求逆元
不会扩展欧几里得算法?去这里。
\(ax\equiv 1\pmod m\) 可以转化为 \(ax+my=1\)。
利用扩展欧几里得算法即可求出 \(x\)。
时间复杂度为 \(\mathcal{O}(\log(a+m))\),非常优秀,扩展欧几里得算法是一种非常常用的求逆元的方法。
线性求 \([1,n]\) 的所有逆元
法 \(\verb!I!\)
首先 \(\frac{1}{1}\) must be \(1\)。(这是预处理)
考虑求出 \(i\) 的逆元 \(\frac{1}{i}\)。
\(p\) 可以用 \(i\) 表示为 \(i\lfloor\frac{p}{i}\rfloor+p\bmod i\),那么
由于 \(p\bmod i<i\),所以 \(\frac{1}{p\bmod i}\) 在 \(i\) 之前已经算出了,可以直接用。
但是要注意一下,C++ 中取模运算可能会模出来负数,所以要加上一个 \(p\)。
码儿:
void solve(int n,int P) {
inv[1]=1;
for (int i=2;i<=n;i++) {
inv[i]=1ll*(-P/i+P)*inv[P%i]%P;
}
}
但是,当 \(p\) 为合数或 \(i\) 是 \(p\) 的倍数时,\(p\bmod i\) 可能为 \(0\),\(\frac{1}{0}\) 无意义,因此这东西的适用范围是:\(p\) 是质数且 \(n<p\)(法 \(\verb!II!\) 的适用范围和法 \(\verb!I!\) 一样)。
法 \(\texttt{II}\)
先预处理出来 \([1,n]\) 所有数的阶乘在模 \(p\) 意义下的值。
并且可以发现:\(\frac{1}{i!}=\frac{1}{(i+1)!}\times(i+1)\)。
于是我们可以使用费马小定理先计算出 \(\frac{1}{n!}\),然后倒着循环算出 \([1,n]\) 所有数的阶乘的逆元。
有了上面的预处理,\(\frac{1}{i}\) 自然也不难求了,为:\(\frac{1}{i!}\times(i-1)!\)。
这个方法看上去很麻烦,但实际上处理出来的 \(i!\) 和 \(\frac{1}{i!}\) 可以直接应用到组合计数等方面。
码儿:
int qpower(int a,int k,int P) {
int res=1;
while (k) {
if (k&1) {res=1ll*res*a%P;}
a=1ll*a*a%P;
k>>=1;
}
return res;
}
void solve(int n,int P) {
fac[0]=1;
for (int i=1;i<=n;i++) {fac[i]=1ll*fac[i-1]*i%P;}
ifac[n]=qpower(fac[n],P-2,P);
for (int i=n-1;i;i--) {ifac[i]=1ll*ifac[i+1]*(i+1)%P;}
for (int i=1;i<=n;i++) {inv[i]=1ll*ifac[i]*fac[i-1]%P;}
}
扩展欧几里得算法(Exgcd)
裴蜀定理(Bézout 定理)
\(\forall a,b\in\mathbb{Z}\),\(\exists x,y\in\mathbb{Z}\),满足:
Proof
在欧几里得算法最后一步,也就是 \(b=0\) 的时候,那么对于 \(ax+0y=a\)(\(\gcd(a,0)=a\))这个方程,我们可以轻而易举地解出来:\(x=1,y\in \mathbb{Z}\)。
接下来考虑不是最后一步的该怎么做。
先设 \(\exists x,y\),使得 \(ax+by=\gcd(a,b)\)。
由欧几里得算法可得:\(\gcd(a,b)=\gcd(b,a\bmod b)\)。
所以设 \(\exists x^\prime,y^\prime\),使得 \(bx^\prime+(a\bmod b)y^\prime=\gcd(b,a\bmod b)=\gcd(a,b)\),那么\[\begin{align*} bx^\prime+(a\bmod b)y^\prime &=bx^\prime+(a-b\lfloor\frac{a}{b}\rfloor)y^\prime\\ &=bx^\prime+ay^\prime-b\lfloor\frac{a}{b}\rfloor y^\prime\\ &=ay^\prime+b(x^\prime-\lfloor\frac{a}{b}\rfloor y^\prime) \end{align*}\]可以发现:\(x=y^\prime,y=x^\prime-\lfloor\frac{a}{b}\rfloor y^\prime\)。
于是我们可以通过递归来求出一组特解,并且 \(b=0\) 这个递归下界一定会达到的。证毕。
码儿:
#define long long ll
ll exgcd(ll a,ll b,ll &x,ll &y) {
if (!b) {x=1;y=0;return a;}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
Exgcd
\(\forall a,b,c\in\mathbb{Z},\)求关于 \(x,y\) 的方程 \(ax+by=c\) 的整数解。
设 \(d=\gcd(a,b)\),则方程有整数解的条件是 \(d\mid c\)。
Proof:
设 \(a=k_1d,b=k_2d\),则
\[\begin{align*} ax+by&=c\\ d(k_1x+k_2y)&=c\\ k_1x+k_2y&=\frac{c}{d} \end{align*}\]\(k_1,k_2\) 都是整数,那么原方程要有整数解必须满足 \(\frac{c}{d}\) 也是整数。
即当且仅当 \(d\mid c\) 时,原方程有整数解。
将方程两边除以 \(d\),为了方便,字母不进行替换(也就是说,\(a,b,c\) 分别变成了 \(\frac{a}{d},\frac{b}{d},\frac{c}{d}\))。
于是我们可以先利用裴蜀定理解出 \(a x^\prime+b y^\prime=\gcd(a,b)=1\) 的一组特解 \(x^\prime,y^\prime\)。
在 \(a x^\prime+b y^\prime=1\) 两边乘 \(c\) 可得 \(a\cdot cx^\prime+b\cdot cy^\prime=c\),所以原方程的一组特解就是
考虑怎么求出通解。
如果 \(x\) 加上一个数 \(\Delta_x\),那么 \(y\) 就要减去一个数 \(\Delta_y\)(因为它们的和必须为 \(c\) 这个定值),那么
因为 \(\frac{a}{b}\) 是最简整数比。
所以 \(\frac{\Delta_y}{\Delta_x}=\frac{ka}{kb}=\frac{a}{b}\)(\(k\in\mathbb{Z}\))。
即 \(
\begin{cases}
\Delta_x=kb\\
\Delta_y=ka
\end{cases}(k\in\mathbb{Z})\)。
通解就是:
带回原方程,可得:
\(\begin{aligned}
a(x_0+kb)+b(y_0-ka)&=c\\
ax_0+kab+by_0-kab&=c\\
ax_0+by_0&=c
\end{aligned}\)
可以发现,\(ka,kb\) 可以被消掉,不会对答案造成影响。
接下来考虑怎么求出最小正整数解和正整数解的个数。
令 \(x_1\) 表示 \(x\) 的最小正整数解,则
因为是求最小正整数解。
所以为了避免 \(x_0\bmod b=0\) 的情况我们可以进行这样的处理:
这样做还能顺便完美地解决 \(x_0<0\) 的情况。
\(y\) 的最小正整数解 \(y_1\) 的求法与其类似(\(b\) 改成 \(a\) 即可)。
因为 \(x\) 增大时,\(y\) 减小,所以当 \(x=x_1\) 时,\(y\) 取最大正整数解 \(y_2\)。
同理可得,当 \(y=y_1\) 时,\(x\) 取最大正整数解 \(x_2\)。
\(x\) 的通解形式为 \(x=x_0+kb\),也就是说,\(x\) 每两个相邻的整数解的差为 \(b\)。更形象一点,把 \(x\) 的整数解放在数轴上,\(x\) 每两个相邻的整数解的距离就是 \(b\)。由此可得出正整数解的个数为:
中国剩余定理(CRT)
求以下同余方程组的解:
其中 \(m_1,m_2,m_3,\cdots,m_n\) 两两互质。
设 \(M=\prod\limits_{i=1}^n m_i,M_i=\frac{M}{m_i},t_i\) 为 \(M_i\) 在模 \(m_i\) 意义下的逆元。
那么方程组的一个特解就是
Proof:
\(\because \forall j\ne i,m_i\mid M_j\)
\(\therefore \forall j\ne i,a_jM_jt_j\equiv 0\pmod{m_i}\)
\(\therefore x_0\equiv a_iM_it_i\equiv a_i\pmod{m_i}\)
所以 \(x_0\) 可以使原方程组成立。证毕。
通解:
最小非负整数解为
void exgcd(int a,int b,int &x,int &y) {
if (!b) {x=1;y=0;return ;}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
int CRT() {
int ans=0;
for (int i=1;i<=n;i++) {
int mi=M/m[i];
int ti,x;
exgcd(mi,m[i],ti,x);
ans=((ans+1ll*a[i]*mi%M*ti%M)%M+M)%M;
}
return ans;
}
扩展中国剩余定理(ExCRT)
为什么不把 ExCRT 归到 CRT 下呢,因为 ExCRT 和 CRT 其实没啥关系。
解同余方程组:
扩展到更加一般的情况:不要求 \(m_1,m_2,m_3,\cdots,m_n\) 互质。
首先 CRT 是没法用了,即使对它进行改进也没用了。
怎么办捏?
上面学了什么东西可以解同余方程组?
于是你看了下目录。
扩展欧几里得算法!
我们可以用扩展欧几里得算法对同余方程进行合并。
考虑对 \(\begin{cases}x\equiv a_1\pmod{m_1}\\ x\equiv a_2\pmod{m_2}\end{cases}\) 进行合并。
其中 \(k_1,k_2\in\mathbb{Z}\)。
看到这里,你应该能想到扩展欧几里得算法了吧?\(k_1m_1-k_2m_2=a_2-a_1\) 这个东西就是个二元一次不定方程。
于是上扩展欧几里得算法!
设 \(d=\gcd(m_1,m_2)\)。
若 \(d\nmid(a_2-a_1)\),则原同余方程组无解;否则这两个同余方程能进行合并。
利用扩展欧几里得算法求出一组特解 \(k_1^\prime,k_2^\prime\)。
自然我们也能求出一个 \(x\) 的特解:\(x_0=a_1+k_1^\prime m_1\)(小标是 \(1\) 或 \(2\) 其实都一样)。
利用同余的性质 \(\verb!6!\) 即可求出通解:\(x=x_0+t\operatorname{lcm}(m_1,m_2)\)。
那么这两个同余方程合并后的方程为
以此类推,合并 \(n-1\) 后即可求出原同余方程组的解(因为这时只剩一个同余方程了)。
最小非负整数解也不难求:若 \(n\) 个同余方程合并后为 \(x\equiv y\pmod z\),那么最小非负整数解就是 \(y\bmod z\)。
int ExCRT() {
int ans=a[1];
M=m[1];
for (int i=2;i<=n;i++) {
int c=((a[i]-ans)%m[i]+m[i])%m[i];
int x,y;
int d=exgcd(M,m[i],x,y);
if (c%d!=0) {puts("No solution.");return ;}
c/=d;m[i]/=d;
x=x*c%m[i];
ans+=x*M;
M*=m[i];
ans=(ans%M+M)%M;
}
qwq ans;
}
威尔逊定理
\(\forall p\) 是质数,有
Proof
咕咕咕

浙公网安备 33010602011771号