首页 > 其他分享 >Binary GCD 学习笔记

Binary GCD 学习笔记

时间:2023-03-01 20:11:48浏览次数:49  
标签:Binary return GCD int 笔记 pmod2 gcd

算是一点杂项吧,感觉没什么机会用上。

0x00 前言

有时你需要大量且快速的求 gcd ,像P5435。但是对值域预处理 gcd 又很麻烦,所以这时候我们可以考虑 Binary GCD 。

0x01 原理

Binary GCD 的时间复杂度是 \(\Theta(\log n)\) 的,和欧几里得算法(即“辗转相除法”)相同。但是在实战中,由于 Binary GCD 的实现大量依靠位运算,因此速度非常快,在极端情况下远优于欧几里得算法。

0x02 方法

假设现在我们需要求 \(\gcd(a,b)\) ,那么可以分成以下 5 种情况:

第一种, \(a=b\) 。显然 \(\gcd(a,b)=a\) ;

第二种, \(a=0\) 或 \(b=0\) 。当 \(b=0\) 时 \(\gcd(a,b)=a\) , \(a=0\) 时 \(\gcd(a,b)=b\) ;

第三种, \(a,b\equiv0\pmod2\) 。对于这种情况,显然 2 是公约数之一,直接得到 \(\gcd(a,b)=\gcd(\frac{a}{2},\frac{b}{2})\) ;

第四种, \(a\equiv0\pmod2\) 或 \(b\equiv0\pmod2\)。不妨设 \(a\equiv0\pmod2\) ,那么显然 2 不是公约数之一,直接得到 \(\gcd(a,b)=\gcd(\frac{a}{2},b)\) ;

第五种, \(a,b\equiv1\pmod2\) 。不妨设 a>b ,根据“更相减损术”有 \(\gcd(a,b)=\gcd(a−b,b)\) ,此时就变成了第四种情况,即 \(\gcd(a,b)=\gcd(\frac{a-b}{2},b)\) 。

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);
}

0x03.5 优化

当然,这样还是需要大量的递归与判断,所以我们有优化版:

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;
} 

其中 \(\text{__builtin_ctz(x)}\) 函数会返回 \(x\) 的二进制下末尾的 0 的个数。

0x04 总结

我也不知道这有啥用。在遇到需要大量且快速的求 gcd 的情况时, Binary GCD 可以帮你略过繁琐的预处理。

标签:Binary,return,GCD,int,笔记,pmod2,gcd
From: https://www.cnblogs.com/xx019/p/17169109.html

相关文章

  • TJA1020应用笔记(AN00093)
    1. itisdissuadedtoconnectNSLPdirectlytoaVCCsupplysource.NSLP最好不要与VCC直接连接。 2.(NLSPpin)Therangeoftheinputthresholdis chosento......
  • 扩展欧几里得学习笔记
    温馨提示:本文推式子比较多,建议跟着文章自己推一推。扩展欧几里得是什么扩展欧几里得(exgcd)是一个可以用来求\(ax+by=c\)(\(c\%\gcd(a,b)=0\),否则无解)的解的算法求解\(ax......
  • 均值不等式学习笔记
    从平均数说起我们都知道\(n\)个数的平均数表示为:\[\frac{a_1+a_2+a_3+\cdotsa_n}{n}\]这种最常见的平均数被称为“算术平均数”(ArithmeticMean)。还有一种常用的平均......
  • 博弈论学习笔记
    挖个巨坑,慢慢填。从Nim游戏入手问题:有\(n\)堆石子,第\(i\)堆石子有\(s_i\)个,两个人轮流取石子,每人每次只能从一堆中取任意数量的石子,可以取完,不能不取。问先手必......
  • C#初步学习2(个人笔记,基于老赵.Net的视频自学,不喜勿喷)
    //此笔记仅针对个人学习而写,会有所缺失的内容,不喜勿喷初步学习C#中的基本变量除了最基本的“byte,short,int,long,float,double,char,string(C#中“String”和“string”......
  • 韦东山2440-学习笔记-platform
    1.简介platform是设备驱动总线模型2.示例#include<linux/platform_device.h>#include<linux/module.h>staticstructplatform_device*led_dev;staticstru......
  • 极光笔记 | 极光PUSH服务助力企业提升抢单速度
    随着硬件、软件、网络等不断发展、完善,互联网已经渗透到了日常生活中的方方面面,在直接赋能原有行业服务的同时也带来了很多新的服务模式,给人们日常生活带来了极大便利。例......
  • 《金阁寺》——读书笔记
    2023.2.25①我的少年时期混浊着微明的曙色。虽然暗影漆黑的世界极其可怕,但白昼般清晰透明的生也不属于我②母亲很快给我来了一封电报,说父亲大量咳血,已经去世了2023.2.......
  • 数据库笔记
    第二讲数据库系统的结构抽象与演变1.数据库系统的标准结构(1)数据库系统的分层抽象?DBMS管理数据的三个层次外部层次(ExternalLevel)=用户层次(UserLevel)某一用户能够......
  • 【读书笔记&个人心得】第8章:Map
    Map一种元素对(pair)的无序集合,给定key,对应的value可以迅速定位,这个结构也称为关联数组或字典(如需要有序请使用结构体)给定key,对应的value可以迅速定位声明、初......