4 扩展欧几里德算法

 问题引入:直线上的点,求直线ax+by+c=0上有多少整点(x, y)满足x∈[x1, x2],y∈[y1, y2]。

 首先学习扩展欧几里德算法。找出一对整数(x, y),使得ax+by=gcd(a, b)。

算法程序:

void extend_Eulid(LL a, LL b, LL &x, LL &y, LL &d) {
    if (!b) {d = a, x = 1, y = 0;}
    else {
        extend_Eulid(b, a % b, y, x, d);//x和y位置变化
        y -= x * (a / b);//x,y为一组解
    }
}

上面可求出一组解(x1, y1),求其他解(x2,y2):

则:ax1+by1=ax2+by2       变形: a(x1-x2)=b(y2-y1)

然后左右同除以gcd(a,b) 则a' b'互素所以 x1-x2一定是b'的整数倍 设为kb' 则  y2-y1 = ka'

所以可得以下结论:

设a, b, c为任意整数。若方程ax+by=c的一组整数解为(x0, y0),则它的任意整数解都可以写成(x0+kb', y0-ka')

其中 a' = a / gcd(a, b),b' = b / gcd(a, b), k取任意整数。

此时开头的问题:移项得ax+by=-c,求出一组解即可。

最终结论:

设a,b,c为任意整数,g = gcd(a, b),方程ax+by=g的一组解是(x0,y0),则

1.当c是g的倍数时ax+by=c的一组解是(x0c/g,y0c/g);

2.当c不是g的倍数时无整数解。

猜你喜欢

转载自blog.csdn.net/c_cqq/article/details/81179622