欧几里得及扩展欧几里算法

欧几里得:

实际上就是辗转相除法求最大公约数。

给定一个a,b,求他们的最大公约数(gcd)

辗转相除法是:(一般a>b)

gcd(a,b)

第一轮:a%b=a2a\%b=a_2a%b=a2

此时gcd(b,a2a_2a2)

第二轮:b%a2=a3b\%a_2=a_3b%a2=a3

直到gcd(x,0),答案为x.

举例:

gcd(48, 18)

48 ÷ 18 = 2 余 12 → gcd(18, 12)

18 ÷ 12 = 1 余 6 → gcd(12, 6)

12 ÷ 6 = 2 余 0 → gcd(6, 0)

b=0 → 结果 = 6

代码:

cpp 复制代码
int gcd(int a,int b)
{
    if(b)
        return gcd(b,a%b);
    else 
        return a;
}

扩展欧几里得:

简单来说就是带记录的欧几里得。

形如:ax+by=gcd(a,b)ax + by = gcd(a ,b)ax+by=gcd(a,b)

计算gcd的同时,会记录出对应的(x ,y);

由欧几里得可知:
gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b ,a\%b)gcd(a,b)=gcd(b,a%b)

由整除法可得:
a%b=a−⌊a/b⌋∗ba\%b=a - \lfloor a/b \rfloor*ba%b=a−⌊a/b⌋∗b

带入上式,整理可得:
ay1+b(x1−⌊a/b⌋∗y1)=gcd(a,b)ay_1 +b(x_1 - \lfloor a/b \rfloor * y_1) = gcd(a,b)ay1+b(x1−⌊a/b⌋∗y1)=gcd(a,b)

联立原式:
x=y1y=x1−⌊a/b⌋∗y1x=y1\quad y=x_1-\lfloor a/b \rfloor*y_1x=y1y=x1−⌊a/b⌋∗y1
当b==0时:
x=1y=0x=1\quad y=0x=1y=0

代码:

cpp 复制代码
int exgcd(int a,int b,int &x,int &y)
{
	if(b==0){
		x=1,y=0;
		return a;
	}
	int x1,y1;
	int d=exgcd(b,a%b,x1,y1);
	x=y1;
	y=x1-(a/b)*y1;
}

exgcd(b,a%b,y,x)exgcd(b, a\%b, y, x)exgcd(b,a%b,y,x)调用时,y 接收了递归的 x1,x 接收了递归的 y1

然后只需要 y−=a/b∗xy -= a/b * xy−=a/b∗x就完成了 y=x1−(a/b)∗y1y = x1 - (a/b)*y1y=x1−(a/b)∗y1

整理简化得:

cpp 复制代码
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;
}
相关推荐
chao1898444 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
沪漂阿龙4 小时前
AI大模型面试题:支持向量机是什么?间隔最大化、软间隔、核函数、LinearSVC 全面拆解
人工智能·算法·支持向量机
難釋懷4 小时前
Redis数据结构-Set结构
数据结构·redis·bootstrap
little~钰4 小时前
倍增算法和ST表
算法
知识领航员5 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
薛定e的猫咪5 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法
如何原谅奋力过但无声6 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
平行侠6 小时前
037插入排序 - 整理扑克牌的算法
数据结构·算法
ECT-OS-JiuHuaShan7 小时前
彻底定理化:从量子纠缠到量子代谢
数据库·人工智能·学习·算法·生活·量子计算