公约数的性质
d|a且d|b,意味着d|(ax+by) 其中x,y为任意整数
最大公约数性质
gcd(an,bn)=n *gcd(a,b)
gcd(a*p,b)=gcd(a,b)// p为质数
合数的性质
任何一个合数可以写成质数幂的唯一形式
欧几里德算法
gcd(a,b)=gcd(b,a%b)
其时间复杂度与fib数有关系,如果b<F(k+1)则递归调用次数少于k次
欧几里德算法的扩展形式
gcd(a,b)=gcd(b,a-b) b>a-b
扩展形式利用了公约数的性质,其问题在于相减的过程中重复的迭代的次数有些多,可以再利用最大公约数的性质进行优化
算法
int gcd(int a,int b)
{
if(a<b)
return gcd(b,a);
if(b==0)
return a;
if(isEven(a))
{
if(isEven(b))
return gcd(a>>1,b>>1)<<1;// a/2,b/2 然后把2提取出来
else
return gcd(a>>1,b);
}
else
{
if(isEven(b))
return gcd(a,b>>1);
else
return gcd(b,a-b);
}
}