Exgcd 和 Excrt 的一些推导

Exgcd 和 Excrt 的一些推导

Exgcd

Exgcd 是用来求解二元一次不定方程的算法,即

ax+by=c

根据贝祖定理,该方程有解当且仅当 gcd(a,b)c,所以只用求解

ax+by=gcd(a,b)

又因为

gcd(a,b)=gcd(b,amodb)

可以先求解

bx+(amodb)y=gcd(a,b)

变形得

bx+(abab)y=gcd(a,b)

ay+b(xaby)=gcd(a,b)

对比方程 ax+by=gcd(a,b),得

{x=yy=xaby

在递归求 gcd(a,b) 时顺便求出 x,y 即可。

对于方程 ax+by=c 的一组特解 x0,y0,其通解可表示为

{x=x0+kby=y0ka  (kZ)

而 Exgcd 求出的是 ax+by=gcd(a,b) 的一组特解 x0,y0

d=gcd(a,b),方程 ax+by=c 的通解可表示为

{x=cdx0+bdky=cdy0adk  (kZ)

也可表示为

{xcdx0(modbd)ycdy0(modad)

这样我们可以求出 x,y 的最小正整数值。

Exgcd 还可以用来求解线性同余方程,即

axb(modm)

可转化为二元一次不定方程

ax+my=b

使用 Exgcd 求解即可。

Excrt

Excrt 是用来求解线性同余方程组的算法,即

{xa1(modm1)xa2(modm2)xan(modmn)

考虑已经求解出前 k1 个方程组,如何与第 k 个方程合并。

x0 为前 k1 个方程组的解,M=lcmi=1k1mix 为前 k 个方程组的解,有

x=x0+tM (tZ)

代入原方程,有

x0+tMak(modmk)

移项得

Mtakx0(modmk)

变为线性同余方程,可以使用 Exgcd 求解出 t 的最小正整数解。

若该线性同余方程无解,则整个方程组无解。

t 代入原式求出 x,将 x0xMlcm(M,mk)

这样就完成了一次合并。

依次将 n 个方程合并,就求出了整个方程组的解。

posted @   maniubi  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示