欧几里得算法

欧几里得算法

用于求解两个数 a,b 的最大公约数,gcd(a,b)=gcd(b,amodb),为了方便证明,我们约定 a>b,证明:

r=amodb=akbdadb,显然 a=kb+r,那么 rd=adkbd,因为 adkbd 显然为整数,所以 rd 也为整数,所以可证 gcd(a,b)=gcd(b,amodb)

所以我们就可以写出如下代码:

Link
il int gcd(int a,int b) {
	return b ? gcd(b,a % b) : a;
}

因为每次进行取模再递归,所以时间复杂度为 O(loga)

扩展欧几里得算法

用于求 ax+by=gcd(a,b) 的一组可行解。

前置知识:裴蜀定理:对于任意整数 a,b,存在一对整数 x,y,满足 ax+by=gcd(a,b)

推导:

由欧几里得算法,可得 ax1+by1=gcd(a,b) 等同于 bx2+(amodb)y2=gcd(b,amodb)

所以 ax1+by1=bx2+(amodb)y2,将 amodb 转换,得到 ax1+by1=bx2+(aabb)y2

把式子拆开 ax1+by1=bx2+ay2abby2

合并 ax1+by1=ay2+b(x2aby2)

得到 x1=y2,y1=(x2aby2),那么我们就可以根据这个,不断递归求解,当递归到 b=0 时,返回 a 的值即可,为了方便操作,可以将 x,y 取地址。

可以写出如下代码:

Link
il int exgcd(int a,int b,int &x,int &y) {
	if (!b) {
		x = 1; y = 0;
		return a;
	}
	int d = exgcd(b,a % b,y,x);
	y -= a / b * x;
	return d;
}

一般的,对于 ax+by=c,我们可以知道,该方程有整数解当且仅当 gcd(a,b)c

此时我们可以优先求解 ax+by=gcd(a,b),令 d=gcd(a,b),我们可以得到方程的通解为

{x=x×cd+bdky=y×cdadk

posted @   songszh  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示