扩展欧几里德算法详解

1、问题引入:

有一个经典的问题:直线上的点,求直线ax+by+c = 0上有多少个整数点(x, y) 满足x->(x1, x2), y -> (y1, y2);

怎么来找整数解,这时就可以利用扩展欧几里德算法.

2、扩展欧几里德算法:

先附上代码:

void exgcd(int a, int b, int &d, int &x, int &y)
{
    if(!b) d = a, x = 1, y = 0;
    else { exgcd(b, a % b, d, x, y); y -= x * (a / b); }

}

解释参数: a, b 是系数,d 为a与b的最大公约数,x与y是解。

3、扩展欧几里德算法详解:

第一步:先说明什么时候 ax + by = c 方程有整数解。

举个例子大家就明白了,对于以下两个方程:
4x + 12y = 8 ······ ①
4x + 12y = 7 ······ ②
对于①式化简为:x + 3y = 2
对于②式化简为:x + 3y = 7 / 4
显然②式是无整数解的。

所以当 ax + by = gcd(a, b) 时有整数解,那么如果 c 可以 整除以 gcd(a, b) 那么 ax + by = c 肯定有整数解。

综上:当c是gcd(a, b) 的整数倍时,ax + by = c 有整数解。

第二部:求解算法原理解释:

扩展欧几里德算法详解_第1张图片

4、回到最初问题:直线上的点

到这里应该基本理解了扩展欧几里德算法, 那么可以由ax + by = gcd(a, b) 求出一组解:(x1 , y1) ,因为c时gcd(a, b)的倍数,所以真正的解直接再乘以c/gcd(a, b)即可。所以这里以ax + by = gcd(a, b)为例,求解其余线上的解。

另取一组解(x2, y2)
那么ax1 + by1 == ax2 + by2 
变形得:a(x1 - x2) = b(y2 - y1) 
假设 gcd(a, b) = g
方程两边同除以g 得: a`(x1 - x2) = b`(y2 - y1)  (a` = a / g  && b` = b / g)
这时a` b`互素,因此x1 - x2一定时b`的整数倍,设为 kb` 
x1 - x2 = kb`   =>  (  x1 = x2 + kb`  )
=> a`kb` = b`(y2 - y1)
=>(y2 - y1) = ka` => ( y1 = y2 - ka` )
以上的整体推导过程没有关心等式的右边是gcd(a, b) 还是 c ,所以当等式右边为c时也成立。
综上:若方程ax + by = c的一组整数解为(x0, y0)
则它的任意整数解可以表示为(x0 + kb`, y0 - ka`) 其中 a` = a / gcd(a, b)  b` = b / gcd(a, b)

x=(x%b+b)%b;(求出的就是最小正整数解)
 

 

 

 

 

 

 

 

你可能感兴趣的:(ACM,数学)