扩展欧几里得 学习笔记(扩欧 || exgcd 入门)

什么是欧几里得算法?
简单点说, ( a , b ) = ( b , a (a,b)=(b,a m o d mod b ) b)

  • 什么是扩展欧几里得算法?

扩展欧几里得算法是欧几里得算法(又叫辗转相除法)的扩展。除了计算 a a b b 两个整数的最大公约数,此算法还能找到整数 x x y y (其中一个很可能是负数)。通常谈到最大公因子时, 我们都会提到一个非常基本的事实: 给予二整数 a a b b , 必存在有整数 x x y y 使得 a x + b y = ( a , b ) ax + by = (a,b) 。有两个数 a , b a,b ,对它们进行辗转相除法,可得它们的最大公约数——这是众所周知的。然后,收集辗转相除法中产生的式子,倒回去,可以得到 a x + b y = ( a , b ) ax+by=(a,b) 的整数解。

——————————————————————摘自百度百科

  • 如何正确使用欧几里得算法(exgcd)
    好的, 进入正题了。
    题意:求方程 a x + b y = ( a , b ) ax+by=(a,b) x , y x,y 的整数解。
    不妨设 a = b q + r a=bq+r ,根据小学的说法, q q 是商 , r r 是余数,所以对于确定的 a a b b q q r r 的值是唯一的。
    我们把问题通过欧几里得算法转化,即从 ( a , b ) (a,b) 转化到了 ( b , r ) (b,r) r r a a m o d mod b b ),设求出方程 b x + r y = ( a , b ) bx+ry=(a,b) 的解为 x = x 0 , y = y 0 x=x_0,y=y_0 ,考虑将它变形到原式。
    怎么变形呢?
    将刚才的 a = b q + r a=bq+r 代入 a x + b y = ( a , b ) ax+by=(a,b) ,即为
    x ( b q + r ) + b y = ( a , b ) x(bq+r)+by=(a,b)
    去括号,得 x b q + x r + b y = ( a , b ) xbq+xr+by=(a,b)
    b b 提出来,得 b ( x q + y ) + x r = ( a , b ) b(xq+y)+xr=(a,b)
    你发现了什么?
    还没发现?拿上面的式子对比一下:
    因为
    b x 0 + r y 0 = ( a , b ) , bx_0+ry_0=(a,b),
    b ( x q + y ) + x r = ( a , b ) b(xq+y)+xr=(a,b)
    所以
    b x 0 + r y 0 = b ( x q + y ) + x r bx_0+ry_0=b(xq+y)+xr
    x = y 0 , y = x 0 y 0 q x=y_0,y=x_0-y_0q
    递归即珂,边界条件 ( b , 0 ) (b,0) 的解为 x = 1 , y = 0 x=1,y=0 .

额,上面只是基础做法,下面还有

题意:给出 a , b , c a,b,c ,求方程 a x + b y = c ax+by=c 的所有整数解。
我们知道,只有在 ( a , b ) c (a,b)|c 时,这个方程才会有整数解。

因为 ( a , b ) c (a,b)|c ,所以不妨设 k = c ( a , b ) k=\frac{c}{(a,b)} ,根据等式性质,得
a x k + b y k = ( a , b ) × k ax'k+by'k=(a,b)\times k
得出一组解为 x 1 = x k , y 1 = y k x_1=x'k,y_1=y'k
那么解集就出来拉!
{ ( x , y ) x = x 1 + l × b ( a , b ) , y = y 1 l × a ( a , b ) , l Z (x, y) | x=x_1+ l \times \frac{b}{(a,b)},y=y_1-l\times \frac{a}{(a,b)},l \in{\mathbb{Z}} }

参照了几篇blog,在此感谢QwQ

好像一点也不易懂

发布了18 篇原创文章 · 获赞 2 · 访问量 3438

猜你喜欢

转载自blog.csdn.net/woshidalaocxy/article/details/104202701