扩展中国剩余定理(EXCRT)

中国剩余定理(CRT)能解决模数互质情况的模线性同余方程组。这是中国剩余定理的原理所决定的。

但当我们的模数不互质时,这个方式显然就寄掉了,因此我们要打破原有的思路,去找一个新的方式解不定方程组,这时我们的扩展中国剩余定理(EXCRT)就出现了

假设我们现在有如下不定方程组

{xr1(mod m1)xr2(mod m2)xr3(mod m3)

我们用扩展中国剩余定理(EXCRT)最重要的任务就是合并方程 (究竟是什么神在出这种鬼畜的解题方式啊!!!正常人能想到合并方程???也许是我太弱了了叭QAQ)

显然我们可以得到 x=m1k1+r1=m2k2+r2 ---------- (1)

则我们移项可得 m1k1+m2k2=r2r1 ---------- (2)

这里我们 m2k2 的系数变为正,是因为 k2 是任意整数,所以前面的系数不会影响整个式子)

我们已知式子 m1p1+m2p2=gcd(m1,m2)d 设为 gcd(m1,m2)

根据裴蜀定理,此时我们要进行判断,判断 r2r1 是否为 gcd(m1,m2) 的倍数,若是,那么有解,若不是,那么无解。

判断完是否有解后我们可以的到一个显然的式子 m1p1+m2p2+km1m2km1m2=m1p1+m2p2=d=gcd(m1,m2)(因为此时 k 没有任何限制,所以 k=pr2r1pZ

此时最左边的式子我们可以化简为 m1(p1+km2)+m2(p2km1)=d

由于我们要找到原式子的通解,所以此时我们将等式两边同乘 r2r1gcd(m1,m2)

则可以得到式子 m1(p1(r2r1)gcd(m1,m2)+km2(r2r1)gcd(m1,m2))+m2(p2(r2r1)gcd(m1,m2)km1(r2r1)gcd(m1,m2))=r2r1 ---------- (3)

由上面的等式 (2) 得可将 (3) 式右面 r2r1 的式子代换成 m1k1+m2k2

从而得到的等式 m1(p1(r2r1)gcd(m1,m2)+km2(r2r1)gcd(m1,m2))+m2(p2(r2r1)gcd(m1,m2)km1(r2r1)gcd(m1,m2))=m1k1+m2k2

由此我们显然可以得到

m1k1=m1(p1(r2r1)gcd(m1,m2)+km2(r2r1)gcd(m1,m2))

m2k2=m2(p2(r2r1)gcd(m1,m2)km1(r2r1)gcd(m1,m2))

消掉第一个式子中的 m1 。则我们求得 k1=p1(r2r1)gcd(m1,m2)+km2(r2r1)gcd(m1,m2) ---------- (4)

由于 k=pr2r1pZ ,因此我们可以使 k(r2r1)=pr2r1(r2r1)=p 由此系数化成 m21gcd(m1,m2) ,本项变成 pm21gcd(m1,m2)

则得到了k1=p1(r2r1)gcd(m1,m2)+pm21gcd(m1,m2)

此时我们就求得了原式的一个通解 k1 。因为如果直接将式子带入代码中很可能会溢出,所以我们要先将 k1 的最小整数解求出。

而求最小正整数解的方法是先将 pm21gcd(m1,m2) 用模数 m2gcd(m1,m2) 先模去成为 0 ,并且同时将 p1(r2r1)gcd(m1,m2)m2gcd(m1,m2) 模。然后将式子加上模数 m2gcd(m1,m2) 防止出现负数,最后再模上 m2gcd(m1,m2)p1(r2r1)gcd(m1,m2) 不是负数但是加上了模数 m2gcd(m1,m2) 的情况模去。

k1 = k1 * (r2 - r1) / gcd;//求出式子里的前半部分
k1= (k1 % (m2 / gcd) + (m2 / gcd)) % (m2 / gcd);
//这里的k1要先模式为了防止出现负数的情况

然后我们将现在得到的等式 (4) 带入等式 (1) 则显然可以得到

x=m1(p1(r2r1)gcd(m1,m2)+pm21gcd(m1,m2))+r1

从而得到最终的式子

x=p1m1(r2r1)gcd(m1,m2)+pm1m21gcd(m1,m2)+r1

我们此时显然是知道 m1,m2,r1,r2,p1,gcd(m1,m2) 的值,但我们不知道 p 的值,那么这时我们只要模上 p 的系数即可消掉 p 。即把模数变为 m1m2(r2r1)gcd(m1,m2)

此时我们就将两个不定方程组合并完成了

xp1m1(r2r1)gcd(m1,m2)+r1(mod m1m2gcd(m1,m2))

则此时新的不定方程的 rp1m1(r2r1)gcd(m1,m2)+r1 , mm1m2gcd(m1,m2)

所以此时的 p1(r2r1)gcd(m1,m2) 显然可以等价为 p1(r2r1)gcd(m1,m2)+pm1m21gcd(m1,m2)(pZ) ---------- (5)(此时有模 m1m2gcd(m1,m2) 的条件在,因此我们加不加上 pm1m21gcd(m1,m2) 都不会对原式子的值产生影响) 。

因为我们先前求最优整数解的模数是 m2gcd(m1,m2), 依然可以把这个式子 (5) 模成我们先前求得最小正整数解 x ,可以直接乘上去

所以可表示为 r=m1x+r1, m=m1m2gcd(m1,m2)

再继续往下合并

最后我们可以合并成唯一一个式子 xr(mod m)

x 的最小整数解为 x=(r mod m+m) mod m

r mod m+m 中加 m 是为了防止出现 r 为负数的情况)

posted @   觉清风  阅读(63)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示