扩展欧几里得求解的个数

知识储备

扩展欧几里得定理
欧几里得定理
(未掌握的话请移步扩展欧几里得

正题

设存在 ax+by=gcd(a,b) a x + b y = g c d ( a , b ) ,求x,y。
我们已经知道了用扩欧求解的方法是递归,终止条件是x==1,y==0;

int exgcd( int a, int b, int &x, int &y ) {
    if( b == 0 ) {
        x = 1;
        y = 0;
        return a;
    }
    int tmp = a % b;
    if( tmp > b ) swap( tmp, b );
    int ans=exgcd(b,a%b,x,y);
    tmp = x;
    x = y;
    y = tmp - a / b * y;
    return ans;
}

到b==0时,我们可以得到一组解:(1,0)。
接下来再逐步回带,求出所有可能的解。具体是为什么呢?

证明

已知:

  • ax1+by1=gcd(a,b) a x 1 + b y 1 = g c d ( a , b )
  • bx2+(amodb)y2=gcd(a,b) b x 2 + ( a m o d b ) y 2 = g c d ( a , b )
  • amodb=aa/bb a m o d b = a − a / b ∗ b

可求得:
ax1+by1=bx2+(amodb)y2=gcd(a,b) a x 1 + b y 1 = b x 2 + ( a m o d b ) y 2 = g c d ( a , b )

ax1+by1=bx2+(aa/bb)y2=gcd(a,b) a x 1 + b y 1 = b x 2 + ( a − a / b ∗ b ) y 2 = g c d ( a , b )
化简得
ax1+by1=bx2+ay2a/bby2=gcd(a,b) a x 1 + b y 1 = b x 2 + a y 2 − a / b ∗ b ∗ y 2 = g c d ( a , b )
所以可证出:
对于每一次递归中的x1y1,与上一次递归中的x2y2存在如下关系:
x1=y2 x 1 = y 2 y1=x2a/by2 y 1 = x 2 − a / b ∗ y 2

证明毕,
每次的x和y均存在递归关系,所以我们可以在求得一组解后回溯时回带求出其他解,此时计数即可。

P.S.

对于求方程正整数解的个数的题,需要注意特判
设ax+by=c,给定a,b,c,求x,y的正整数解个数

  • x=0,y=0,z=0时,方程无数解
  • x=0,y=0,z!=0时,方程无解
  • x,y<0,z>0时方程无解,反之亦然
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值