欧几里得?x
可以去看dalao博客
带余除法定理:a,b∈Z,其中b>0,存在唯一q及r,使a=bq+r,其中0<=r<b;
辗转相除法(欧几里得算法)依据:(a,b)=(b,r)
C++实现:
递推
#include<iostream> using namespace std; int main() { int n,m,r; cin>>m>>n; r=m%n; while(r!=0) { m=n; n=r; r=m%n; } cout<<n; }
递归
int gcd (int x,int y) { return y == 0 ? gcd(y,x%y); }
其中a,b是任意两个不全为0的整数,则存在两个整数x,y,使得ax+by=(a,b);
当(a,b)=1(互素)时,使ax+by=1;
应用:一次不定方程ax+by=c有解的充分条件是(a,b)|c;(|的意思是整除);
c++实现:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 5 using namespace std; 6 7 long long exgcd(long long a,long long b,long long &x,long long &y) 8 { 9 if(b==0) 10 { 11 x=1; 12 y=0; 13 return a; 14 } 15 long long r=exgcd(b,a%b,x,y),t=x; 16 x=y;y=t-y*(a/b); 17 return r; 18 } 19 20 int main() 21 { 22 long long a1,b1,x1,y1; 23 cin>>a1>>b1; 24 exgcd(a1,b1,x1,y1); 25 while(x1<0) x1+=b1; 26 cout<<x1; 27 return 0; 28 }
应用:1、解不定方程ax+by=c
d=exgcd(a,b,x,y);
If(c%d==0)有解,否则无解。
x=c/d*x,y=c/d*y;
则x,y为原方程的一组解,且|x|+|y|的值最小。
其它的解为(x+k*b,y-k*a)
2、解线性同余方程
ax≡b(mod n)
也就是解不定方程ax-ny=b
3、解模的逆元
也就是解线性同余方程ax≡1(mod n).