exgcd 通解(新)

可能不全,老文章在这
什么是通解,我们知道二元一次方程,是如果只有一个式子,那么解会有无数个,而通解就是指让我们只找到一个解就可以推出其他所有解的式子。
注意以下变量都为整数

知道了定义下面就是推式子了,首先设 x,yax+by=gcd(a,b) 的一个解,那么有

(1)y=[gcd(a,b)ax]÷b

再设一个解 x0,y0

(2)x0=x+k

那么有

ax0+by0=gcd(a,b)

所以

(3)y0=[gcd(a,b)ax0]÷b

(3)(2)

(4)y0=[gcd(a,b)axak]÷b=[gcd(a,b)ax]÷bab×k

(4)(1)

(5)y0=yab×k

我们要保证 y0 是整数,且 y 又是整数, 那么 ab×k 就是整数,设 d=gcd(a,b)
a=a×d,b=b×d,这里 a,b 互质(如果他们不互质,d 就可以通过 a,b 的公约数变大, 这就和我们d是最大公约数就矛盾了, 所以a'和b'互质)
此时有

ab×k=ab×k

因为 ab 互质,那么 ab×k 要是想是整数的话,k 只能是 b 的倍数(k=0 时整个就是
0 也是整数,,依旧满足要求)不然就消不掉 ab的分母 b ,就会产生小数, 就不是整数了,因此

k=n×b,nZ

又因为

bd=b

所以

b=b÷d

所以

k=nbd

所以

(6)x0=x+nb/d

通过 (5)(6) 可得

(7)y0=ynad

至此通解就出来了

x0=x+bd×ny0=yad×n

更常见的是这样的

x0=x+k×bd,kZy0=yk×ad

附带最小正整数解就是

xmodbdymodad

对于代码中,因为 C++ 强大的取负模的特性,所以更准确代码形式的应该是

(x % (b/d) + b/d) % (b/d)

就相当于把所有的 kbd 给删掉, 剩下的就是最小的正整数解。

posted @   blind5883  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示