更快地求gcd的方法:Stein算法

你肯定会辗转相除法
如果你的瓶颈在 \(gcd\) ,担心时间过不了,不妨试试 stein 算法
Stein 算法的关键就在于除2操作,具体表现如下:
\(a偶b偶:gcd(a, b) = 2 * gcd(a/2, b/2)\)
\(a偶b奇:gcd(a, b) = gcd(a/2, b)\)
\(a奇b偶:gcd(a, b) = gcd(a, b/2)\)
\(a奇b奇:gcd(a, b) = gcd(|a-b|, min\){\(a, b\)}\()\)
我们可以用位运算优化
见代码

long long gcd(long long x,long long y){
    if(!x) return y;
    if(!y) return x;
    long long t=__builtin_ctzll(x|y);
    x>>=__builtin_ctzll(x);
    //__builtin_ctzll是GCC内置函数,计算一个数的二进制表示末尾0的个数,跑得很快
    while(y){
        y>>=__builtin_ctzll(y);
        if(x>y) swap(x,y);
        y-=x;
    }
    return x<<t;
}
posted @ 2025-11-17 21:14  lcy6  阅读(0)  评论(0)    收藏  举报