用欧几里得算法求gcd确实很方便,但是对于求大整数的gcd的情况下却很慢(因为要取模)
stein算法的时间空间复杂度都和欧几里得相同,而且只需要位移和加减求可以实现
原理:gcd(ka,kb)=k*gcd(a,b)
#define D long long
D stein(D a, D b){
if(a==0) return b;
if(b==0) return a;
if(a%2==0&&b%2==0) return 2*stein(a>>1,b>>1);
else if(a%2==0) return stein(a>>1,b);
else if(b%2==0) return stein(a,b>>1);
return stein(abs(a-b),min(a,b));
}