最大公约数与最小公倍数
基本知识:
定义1 设a和b是两个整数,如果d|a且d|b,则称d是a与b的公因子。
定义2 设a和b是两个不全为0的整数,称a与b的公因子中最大的为最大公约数,记为gcd(a,b)。
定义3 设a与b是另个非零整数,称a与b的最小的正公倍数为最小公倍数,记为lcm(a,b)。
最大公约数与最小公倍数具有如下一些性质:
(1)
(2)设m,a,b是正整数,则
(3)用素数因子分解法求a与b的最大公约数与最小公倍数:
首先将a,b进行因子分解成:
则有:
基本应用:
欧几里得算法:
定义4 设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r)。
代码如下:
1 long long gcd(long long a,long long b) 2 { 3 if(b==0)return a; 4 else return gcd(b,a%b); 5 }
扩展欧几里得算法:
定义5 设a和b不全为0,则存在整数x和y,使得gcd(a,b)=xa+yb。
拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需除法次数不会超过两个整数中较小的那个十进制数的倍数的5倍。
推论:求两个正整数a,b,a>b的最大公因子需要O(log2a)^3次的位运算。
代码如下:
1 int extend_gcd(int a,int b,int &x,int &y) 2 { 3 if(b==0) 4 { 5 x=1;y=0; 6 return a; 7 } 8 else 9 { 10 int r=extend_gcd(b,a%b,y,x); 11 y-=x*(a/b); 12 return r; 13 } 14 }
复杂度:O(logN),其中N和a,b同阶。
说明:
2014-02-27