Files
python/TangDou/AcWing/NumberTheory/合并同余方程.md
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

72 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

https://blog.csdn.net/sleepiest/article/details/81865741
这个不看懂,没法看
https://www.luogu.com.cn/blog/blue/kuo-zhan-zhong-guo-sheng-yu-ding-li
### 1 导语
同余方程组,是形如
$$\large x \equiv x_1 (mod \ \ p_1 ) \\
\large x \equiv x_2 (mod \ \ p_2 ) \\
\large ... \\
\large x \equiv x_n (mod \ \ p_n )$$
的方程组。
当$\large p_1,p_2,...,p_n$两两互质的时候,我们可以使用中国剩余定理。但如果他们不互质呢?
### 2 裴蜀定理与扩展欧几里得算法
这里先介绍一下**裴蜀定理与扩展欧几里得算法**作为**铺垫**。
裴蜀定理:对于不完全为 的非负整数 , 表示 的最大公约数。则必然存在整数对 ,使得
$$\large (a,b)=ax+by$$
具体证明略。
扩展欧几里得算法则是对这个方程求解的算法。
### 3 合并同余方程组
比如我们先合并前两个方程。
$$\large x \equiv x_1 (mod \ \ p_1 ) \\ \large x \equiv x_2 (mod \ \ p_2 )$$
根据余数的定义,我们可以将方程改写为
$$\large x=x_1 \times k_1 +p_1 \ \ (1) \\
x=x_2 \times k_2 +p_2 \ \ (2)
$$
合并$(1),(2)$得:
$$\large x_1*k_1-x_2*k_2=p_2-p_1 \ \ (3) $$
这是一个关于$k_1,k_2$的不定方程,当$\large (p_2—p_1)\% gcd(x_1,x_2)=0$时有解。
当有解时,用扩展欧几里得可求得 $k_{1}$ 的一个特解,设为 $k^{'}$ ,
那么 $k_{1}$ 的通解为:$\large k_{1} = k^{'}+ t * (x_{2} / gcd(x_{1},x_{2}))$
将 $k_{1}$ 代回到式$1$中可得:
$$\large x_1*(k^{'}+t*(x_2/gcd(x_1,x_2)))+p_1=x \\
\Rightarrow \\
\large x_1*x_2 /gcd(x_1,x_2)*t+x_1*k^{'}+p_1= x $$
可以发现:$\large x_{1} *x_{2} / gcd(x_{1},x_{2})$是$x_{1} ,x_{2}$ 的最小公倍数,可以转换表示为 $[x_{1},x_{2}]$
$$\large [x_1,x_2]*t+x_1*k^{'}+p_1=x $$
所以合并式$(1),(2)$两个同余组,变为:
$$\large x ≡ x_{1} * k^{'} + p_{1} (mod [x_{1},x_{2}])$$
$\large x_{1}, p_{1}$ 都是已知的,只需求某个特解 $\large k^{'}$ 和 $\large [x_{1},x_{2}]$ 即可。
### 4 举个栗子
$$ \large
\left\{\begin{matrix}
x \equiv 2(mod \ 4) \\
x \equiv 4(mod \ 6) \\
\end{matrix}\right. \Rightarrow x \equiv 10 (mod \ 12)
$$
由$(1)$式,手动模拟一些$x$,得:$6,$**10**$,14,18,$**22**$,26,30,$**34**$,38,42,$**46**$...$
由$(2)$式,手动模拟一些$x$,得:**10**$,16,$**22**$,28,$**34**$,40,$**46**$,...$
可以发现,这两个式子要想得到的公共解,其实是一组解,它们是:$\large 10,22,34,46,...$
找一下规律,就是从$\large 10$开始,循环节为$\large 12$,也就是原来两个模数$\large p_1,p_2$的$\large [p_1,p_2]$。