数论——最大公因数

最大公因数#

如果u|a,u|b,而且ua,b的共同因数中最大的那个,则称u是ab的最大公因数,记作(a,b)=u

  • (a,b)=1a,b互素。
  • 对于a1,a2...an,若(ai,aj)=1 (1i<jn)则它们两两互素。

辗转相除法#

辗转相除法应该都学过,我们主要说它的数学原理。在这之前先看看算法。

a=bq1+r1b=r1q2+r2r1=r2q3+r3...rn2=rn1qn+rn

这个rn就是最大公因数。

辗转相除的意思就是,如果a,b能被n整除,那么amodb同样也能被n整除。所以(a,b)=(b,r)。所以只要不断地递归求余,最后一个余数就是最大公因数。

下面给出C++实现。

// a must > b
int gcd(int a,int b){
	int r;
	while(r!=0){
		r=a%b;
		a=b;
		b=r;
	}
	return a;
}

int main(){
	cout << gcd(20,15) << endl;
}

辗转相除的意思就是,如果a,b能被n整除,那么amodb同样也能被n整除。所以只要不断地递归求余,最后一个余数必是最大公因数。

证明

(a,b)=uu|a,u|ba=su,b=tusu=tuq+rr=u(stq)u|r

素因式分解#

对于每个数,都能分解成若干个素因数的乘积。在找(a,b)的时候,如果我们把a,b分解成若干素因数的乘积,那么对寻找最大公因数有些帮助。

a=18,b=24a=2×3×3=21×32b=2×2×2×3=22×31

然后我们分别取每个素因数里指数最小的那个(必要时可以出现零指数),并乘起来,结果就是最大公因数。

(a,b)=21×31=6

给出一般公式

a=p1a1×p1a2×...×pnanb=p1b1×p1b2×...×pnbn(a,b)=p1min(a1,b1)×p2min(a2,b2)×...×pnmin(an,bn)

使用素因式分解还能寻找最小公倍数。

最小公倍数#

如果a|cb|c,并且c是所有满足的整数中最小的那个,c就称为a,b的最小公倍数,记作[a,b]=c

[4,6]=12

素因式分解找最小公倍数#

对于最小公倍数,我们只需要选择素因子列表中指数比较大的那个就好了。

a=p1a1×p1a2×...×pnanb=p1b1×p1b2×...×pnbn[a,b]=p1max(a1,b1)×p2max(a2,b2)×...×pnmax(an,bn)

举个例子

a=4,b=6a=22,b=21×31[a,b]=2max(2,1)×3max(1,0)=22×31=12

最大公因数和最小公倍数之间的线性关系#

ab=(a,b)×[a,b]

使用素因数分解法不太适合计算机,辗转相除比较适合计算机,所以求解最小公倍数可以利用这个线性关系。

//lcm是最小公倍数 gcd是使用辗转相除法实现的最大公因数
function lcm(a,b)
	tmp = gcd(a,b)
	return a*b/tmp

最大公因数线性组合表示#

最大公因数总可以以线性组合的方式表示

(a,b)=sa+tb

posted @   yudoge  阅读(1028)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩