浅谈最大公约数

根据教师课件,写成本文。未经允许,禁止转载。

gcd,即最大公约数,指的是几个整数中公有的约数中最大的一个。

问题#

已知 a,b,求 gcd(a,b)

方法一:枚举法#

min(a,b)1 枚举,找到第一个 x 符合题意,就退出循环。

时间复杂度 O(min(a,b))

方法二:分解质因数#

a=p1x1p2x2pnxnb=p1y1p2y2pnyn,其中xi,yi0 且不同时为 0。

gcd(a,b)=p1min(x1,y1)p2min(x2,y2)p3min(x3,y3)

时间复杂度 O(min(a,b))

void Gcd()
{
	for(int x=2;x*x<=min(a,b);x++)
	{
		while (a % x==0 && b % x==0) {a/=x;b/=x;ans*=x;}
		while (a % x==0)a/=x;
    	while (b % x==0)b/=x;
	} 
	if (a % b==0)ans*=b;
    else if (b % a==0)ans*=a;
    printf("%d",ans);
}

方法三:辗转相除(欧几里得算法)#

定理:gcd(a,b)=gcd(b,a%b)

证明:

gcd(a,b)=p,则有 a=ap,b=bp,gcd(a,b)=1

a%b=aabb=apabbp=p(aabb)

gcd(b,a%b)=gcd(bp,p(aabb))=pgcd(b,aabb)

现证明 gcd(b,aabb)=1,使用反证法。假设 gcd(b,aabb)=t(t>1)

b=btaabb=ct

a=ct+abb=ct+abbt=t(c+abb)

gcd(a,b)p,与 gcd(a,b)=1 矛盾,因此 gcd(b,aabb)=1

gcd(b,a%b)=p=gcd(a,b)


时间复杂度 O(log(max(a,b)))

分析:

  1. a>b

    a>2b,则 ba2,规模减小一半。反之 a<2b,则 a%b<a2

    因此时间复杂度是 log 级别。

  2. 斐波那契分析:传送门


int Gcd(int a,int b)
{
    if (b==0) return a;
    else return Gcd(b,a % b);
}

方法四:二进制法#

a<b 时, gcd(a,b)=gcd(b,a)

a=bgcd(a,b)=a

a,b 同为偶数时,gcd(a,b)=2gcd(a2,b2)

a 为偶数,b 为奇数时,gcd(a,b)=gcd(a2,b)

a 为奇数,b 为偶数时,gcd(a,b)=gcd(a,b2)

a,b 为奇数时,gcd(a,b)=gcd(ab,b)

注:此法适合高精度求最大公约数。

int Gcd(int m,int n)
{
    if (m==n) return m;
    if (m<n) return Gcd(n,m);
    if (m & 1==0) return (n & 1==0)? 2*Gcd(m/2,n/2):Gcd(m/2,n);
    return (n & 1==0)? Gcd(m,n/2): Gcd(n,m-n);
}
posted @   Thunder_S  阅读(201)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩