Binary GCD 学习笔记
算是一点杂项吧,感觉没什么机会用上。
0x00 前言
有时你需要大量且快速的求
0x01 原理
Binary GCD 复杂度为
0x02 方法
假设现在我们需要求
-
:显然 ; -
:当 时 , 时 ; -
: ; -
:不妨设 ,显然 2 不是公约数之一,有 ; -
:不妨设 。因为 ,此时转化为上一种情况,有 。
0x03 优化
根据上文,有原始实现:
点击查看代码
int gcd(int a,int b){
if(a==b)return a;
if(!a)return b;
if(!b)return a;
if(~a&1){
if(b&1)return gcd(a>>1,b);
else return gcd(a>>1,b>>1)<<1;
}
if(~b&1)return gcd(a,b>>1);
if(a>b)return gcd((a-b)>>1,b);
return gcd((b-a)>>1,a);
}
但是包含大量的递归与判断的代码还是太慢了,所以我们有优化版:
点击查看代码
int gcd(int a,int b){
int az=__builtin_ctz(a);
int bz=__builtin_ctz(b);
int z=min(az,bz);b>>=bz;
while(a){
a>>=az;int diff=a-b;
az=__builtin_ctz(diff),b=min(a,b),a=abs(diff);
}
return b<<z;
}
0x04 应用
正解应该是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下