二元一次不定方程的一般形式为ax+by=c。其中 a,b,c 是整数,ab ≠ 0。此方程有整数解的充分必要条件是a、b的最大公约数整除c
欧几里得算法的证明:
a可以表示成a=kb+r(a,b,k,r皆为正整数;且a>b)
则r=amodb
假设d是a,b的一个公约数,为了方便,我们记d=(a,b)
则d|a,d|b,即a和b都可以被d整除。
而r=a−kb
两边同时除以d得到
r/d=a/d−kb/d
因为d|a,d|b,显然可以得到d|r
所以d是r的一个约数,因此d是(a,b,r)的公约数,即d=(a,b,r)
设A是(a,b)的公约数集,B是(b,r)的公约数集,R是(a,r)的公约数集
那么可以得到A⊆B,A⊆R
可见现在并不能得到(a,b)和(b,r)的公约数相同
只能说(a,b)的公约数是(b,r)公约数的一部分,同时也是(a,r)公约数的一部分
假设d′是(b,r)的公约数,则d′|b,d′|r; a=kb+r,等式两边都除以d′,可得
a/d′=(kb+r)/d′=kb/d′+r/d′ 因为d′|b,d′|r; 显然d′|a
所以如果d′=(b,r),那么在a=kb+r的情况下,d′也是a的约数,d′=(a,b,r)
因此(b,r)的约数集是(a,b)的约数集的一部分,也是(a,r)约数集的一部分 所以B⊆A,B⊆R综上,A=B
由此得证,(a,b)的公约数与(b,r)的公约数相同,当然它们的最大公约数也必定相同。 即
gcd(a,b)=gcd(b,r)
可见必须要满足两个条件才能得到(a,b)的公约数与(b,r)的公约数是相同的结论。
条件一:
假设d=(a,b),那么在a=qb+r的情况下,有 d=(b,r)
即证明A⊆B
条件二:
扩展欧几里得算法的说明:假设d=(b,r),那么在a=qb+r的情况下,有 d=(a,b)
即证明B⊆A
扩展欧几里德算法是用来求解a*x+b*y==gcd(a,b)这样的方程的。同样利用gcd(a,b)==gcd(b,a%b)把a*x+b*y==gcd( a, b )转化为b*x'+(a%b)*y'==gcd( b, a%b );
根据递归的思想,假设现在我们已经求出了x' y',剩下的关键就是如何用x' y'求出x y.我们观察gcd(b,a%b) = b*x'+(a%b)*y',只要把右边重新写成 a*x+b*y 的形式就行了,所以需要对b*x'+(a%b)*y'进行变形,因为a%b == a-a/b*b,故b*x'+(a%b)y' = b*x'+(a-a/b*b)y' == a*y' + b*(x'-a/b*y') .
这样便可得出 x = y' y = x'-a/b*y'。
这样我们就得到了方程的解 :
x==x0+b*t; // 特解+通解
y==y0+a*t;
然后再看一般形式 a*x+b*y==c;
当且仅当 c%gcd( a,b )==0时方程才有解。
a*x+b*y==c的求解可以先求出a*x+b*y=gcd(a,b),然后将x y扩大c/gcd(a,b)倍就可以了。