用的最多的, 就是__gcd(a,b) 求最大公约数了
但是欧几里得算法的作用不单单只有这些
例如 对 ax+by=c; 这个不定方程来说 当 c%gcd(a,b)==0 时候方程有解
对于 贝祖等式: ax+by =gcd(a, b) 这个时候就要考虑 欧几里得算法的拓展形式了。
我们在求 a,b的最大公约数时候 用的辗转相除法 就和欧几里得算法密不可分
其实gcd(a,b)=====gcd(b,a%b); 拿gcd(16,24)来说 最大公约数为8 dcd(16,24)=gcd(24,16)=gcd(16,8)=gcd(8,0)==8 了
对于 ax+by=gcd(b,a%b) 来说 这个等式 就是 b *x1+(a%b)==gcd(b,a%b); 无线循环下去 就的到了 b==0 时候的解 x=1; y=0;
a*x+b*y=gcd(a,b)
#include<bits/stdc++.h> using namespace std; void exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1,y=0; return; } exgcd(b,a%b,x,y); int xx=x; x=y; y=xx-a/b*y; } int32_t main() { int a=5; int b=3; int x=0; int y=0; exgcd(a,b,x,y); cout<<x<<" "<<y<<endl; for(int k=-5;k<=5;k++) { cout<<x+k*b<<"=="<<y-k*a<<endl; } }
a*x+b*y=c (c%gcd(a,b)==0)
#include<bits/stdc++.h> using namespace std; void exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1,y=0; return; } exgcd(b,a%b,x,y); int xx=x; x=y; y=xx-a/b*y; } int32_t main() { int a=5; int b=3; int x=0; int y=0; int d=__gcd(a,b); int c=2; exgcd(a,b,x,y); cout<<x*c/d<<" "<<y*c/d<<endl; for(int k=-5;k<=5;k++) { cout<<x*c/d+k*b<<"=="<<y*c/d-k*a<<endl; } }