第一次写博客,欢迎指正我的错误。
问题:对于最大公因子,以及不定方程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;
}