欧几里德可以小推一下;
设 a=kb+r; 有 r=a%b; 设d=gcd(a,b),有 d|a,d|b ; 又知 r=a-kb,得r/d=a/d+k*b/d;可得r/d为整数,因此 d|r, 因此b,r有共同约数有 d|b ==> d|c已经证了一半,因为只能证出当d|b ==> d|c ,还需要证明d|c ==> d|c; 才能证明 他们的约数相同,设d'为b,r,的公约数,证明同上;
扩展欧几里德可以根据公式小推一下:
ax+by=c;
由欧几里德算法知:gcd(a,b)=gcd(b,a%b);
==>bx'+(a%b)y'=c;==> ax+by=bx'+(a%b)y' 为什莫让他们相等,是为了求出递推式,让某次系数为0为结束条件,以求得x,y系数
化简得 ax+by=ay'+(x'-[a/b]*y')b; [ ]为对里面的数向上取整==》x=y',y=x'-[a/b]*y',直接根据公式理解代码即可
欧几里德算法:
#include <iostream>
#include <stdio.h>
using namespace std;
int gcd (int m,int n)
{
if (!n)
return m;
else
return gcd(n,m%n);
}
int main()
{
int m,n;
while(cin>>m>>n)
{
cout<<gcd(m,n)<<endl;
}
return 0;
}
扩展欧几里德算法:
#include <iostream>
#include <stdio.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{
if (!b)
{
x=1;
y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int temp=x;
x=y;
y=temp-a/b*y;
return d;
}
int main()
{
int a,b,c,x,y;
while (scanf("%d%d%d",&a,&b,&c)!=EOF)
{
int d=exgcd(a,b,x,y); //求gcd(a,b),求x,y;
if (c%d!=0)
printf("don't exist\n");
else
{
a/=d;
b/=d;
c/=d;
x*=c;
y*=c;
printf("special answer: %d %d\n",x,y); //求特解
printf("usual answer: %d %d\n",x+b,y-a); //求通解
}
}
return 0;
}