欧几里得算法
定理1:gcd(a,b) = gcd(b,a-b)(a>b)
证明:
令c = gcd(a,b) , a = mc , b = nc
有:a-b = (m-n)c , gcd(b,a-b) = gcd(nc,(m-n)c)
假设: n与m-n 存在除1之外的公因数 L ,则有n = k1L, (m-n) = k2L
n/k1 = (m-n)/k2 整理得到 k1*m = (k1+k2)*n 但是由gcd(a,b) = gcd(mc,nc) = c可知,n与m互质,所以假设不成立,则n与(m-n)也互为质数
所以 gcd(b,a-b) = gcd(nc,(m-n)c) = c = gcd(a,b)
定理2:gcd(a,b)=gcd(b,a%b)(a>b)
由定理1 容易证明
应用
- 辗转相除法求最大公约数
int gcd(int a,int b)//a>b
{
if(b==0)
return a;
return gcd(b,a%b);
}
- 对于任何a 和 b,求ax + by = gcd(a,b)
由定理gcd(a,b) = gcd(b,a%b) 可知
b * x1+(a%b) * y1= gcd(a,b)
b * x1+(a-a/b * b) * y1 = gcd(a,b)
b * x1+a * y1 -(a/b) * b * y1 = gcd(a,b)
a * y1 + b(x1 - (a/b) * y1) = gcd(a,b)
因为ax+by = gcd(a,b)
x = y1,y = x1 - (a/b) * y1
然后对gcd(b,a%b) 再进行 定理二的转换直到 (a%b)==0
即a(n) * xn + b(n)yn = gcd(a,b)
即 a(n) * xn = gcd(a,b)
得:xn = 1 yn = 0
然后通过逆推,我们就可以得到ax + by = gcd(a,b) 的特解。
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 z = x;
x =y,y = z-(a/b)*y;
return r;
}
通解:
X = x+b/gcd(a,b) * t
Y = y+a/gcd(a,b) * t
(x和y是特解)