标签:
一、欧几里得算法
int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); }
二、扩展欧几里得算法
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。
可见,扩展欧几里德要求a,b,不能为负,所以当出现负数时我们通常采用
|a|(-x)+by=gcd(|a|,b) x‘=(-x);
int exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1;y=0;return a; } int r=exgcd(b,a%b,x,y); int t=y; y=x-(a/b)*y; x=t; return r; }
三、最小公倍数
int lcm(int a,int b) { return a*b/gcd(a,b); }
四、扩展欧几里德算法的应用
(1)求解不定方程组 ax+by=c
第一步 : 求出gcd(a,b),如果 c%gcd(a,b) 为零 则说明方程组有解;否则方程无解
第二步 : 用exgcd(a,b,x,y) 求出x,y,再用公式x=x*c/gcd(a,b) y=y*c/gcd(a,b) 解出 x,y 的值;
int r=exgcd(a,b,x,y); if(c%r) cout<<"no answer"<<endl; else { x=x*c/r; y=y*c/r; cout<<x<<" "<<y<<endl; }
变形题 求出x最小正值
把 x 转化成最小正值公式 r=gcd(a,b) ; x=(x%(b/r)+(b/r)%(b/r);
y 同理
(2)求解线性同余方程组
同余方程 ax≡b (mod n) (也就是 ax % n = b) 对于未知数 x 有解,当且仅当 b % (gcd(a,n))==0时 且方程有解时,方程有 gcd(a,n) 个解。
求解方程 ax≡b (mod n) 相当于求解方程 ax+ ny= b, (x, y为整数)
如何求解集之间间隔
设 间隔为 dx 则有公式 dx=n/r (其中 r=gcd(a,n))
(3)求解模的逆元
同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。
在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。
这时称求出的 x 为 a 的对模 n 乘法的逆元。
对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程
标签:
原文地址:http://www.cnblogs.com/nefu929831238/p/5723266.html