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的倍数时无整数解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值