扩展欧几里得算法(对于d=gcd(a,b)的求解,以及ax+by=d方程的解的问题。

第一次写博客,欢迎指正我的错误。

问题:对于最大公因子,以及不定方程ax+by=gcd(a,b)的求解?

对于最大公因子的求取是老生常谈的问题,这次主要研究对象是对方程的求解。关于两个未知量(x和y)的解显然是不唯一的。而我们只要找出一组解,其余的解可通过齐次线性方的求解获得即ax+by=0。

        a=k*y/gcd(x,y)   b=k*x/gcd(x,y);

现研讨如何求出ax+by=d的一组解

        由辗转相除法,我们看到了解决这个问题的曙光

        a=b*q0+r0;

        b=r0*q1+r1;

        ……

        rn=rn+1*qn+rn+2(rn+2=0);

对式子进行整理(为了归纳将a设为r0,b设为r1)

        r2=r0-r1*q0;

        r3=r1-r2*q1;

        ……

        rn+1=rn-1-rn*qn-1;

而我们可以用两个数字分别存储(递推是关于a,b的系数)

不妨开设一个二维数组

r0=[1 0] r1=[1 0] r2=r0-q0*r1……

设rk=[mk nk]

则rt=[mt-1 -qt-1 *mt   nt-1-qt-1*nt]

由上述即可得gcd如何由a,b线性表出。

下列是代码 因为没有系统学过编程下面的代码有些冗长。如果有朋友帮忙修改探讨,感激不尽。

#include<stdio.h>
void swap(int *a,int *b){
	int temp;
	if(*a<*b){
		temp=*a;
		*a=*b;
		*b=temp;
	}
}

int main()
{
    int a,b,r,m1=1,n1=0,m2=0,n2=1,m,n;
    scanf("%d%d",&a,&b);
    swap(&a,&b);
    int a0=a,b0=b;
    r=a%b;
    if(r==0){m=1;n=-(a/b-1);}
    while(r){
    	m=m1-(a/b)*m2;
    	n=n1-(a/b)*n2;
    	m2=m;m1=m2;n2=n;n1=n2;
    	a=b;b=r;r=a%b;
	}
	printf("(%d*%d)+(%d*%d)=%d",m,a0,n,b0,b);
    return 0;
    
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值