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

欧几里得:

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

给定一个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;
}
相关推荐
偷吃的耗子29 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
dazzle1 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵1 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
wWYy.2 小时前
数组快排 链表归并
数据结构·链表
张登杰踩2 小时前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao2 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波0072 小时前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零2 小时前
变点检测算法PELT
算法