欧几里得算法、扩展欧几里得算法(特解、应用、通解)

news2024/9/20 1:08:50

文章目录


最近实验中用到了仿射加解密算法,其中的解密操作是通过扩展欧几里得算法实现的,因此在这里对 欧几里得算法、扩展欧几里得算法 做一个完整的记录。

1. 欧几里得算法(也叫辗转相除法)


1.1 直接上模拟

现在求 6 和 16 的最大公约数,根据高中知识(其实我也忘了,现学的芭芭拉迪):
每一次将除式中的除数作为下一次的被除数,将余数作为下一次的除数,直到商为 0,此时的除数就是最大公约数:

  • 16 ➗ 6 = 2 ⋯   ⋯ \cdots\ \cdots   4
  • 6 ➗ 4 = 1 ⋯   ⋯ \cdots \ \cdots   2
  • 4 ➗ 2 = 2 ⋯   ⋯ \cdots\ \cdots   0

因此,最大公约数为 2;


1.2 几何理解

假设现在需要对 a, b (不妨假设 a >b) 求最大公约数,在几何上可以这样进行理解:

  • a , b a, b a,b 为矩形的边长,构造一个矩形 A A A
  • 以矩形的短边(这里为 b b b)构造正方形 B,然后计算这样的正方形 B 在矩形 A 中最多能够放置多少个;

这样就对问题进行了一个抽象:目标就是去寻找能够没有缝隙地铺满矩形 A A A 的正方形 B B B 的最大边长值;
假设上面的正方形 B B B 不能将矩形 A A A 铺满,那么接下来:

  • 用长边剩余的长度够构建正方形,继续去填补未被覆盖的部分;
  • 以此类推,直到找到一个能够刚好无缝隙地填满未覆盖部分的正方形,这个正方形的边长就是最大公约数;

这样会产生一个疑问,怎么保证填满未覆盖部分的正方形能够填满大的矩形呢?
我们通过作图来理解:
在这里插入图片描述
可以看到正方形 B B B 刚好填满了正方形 A A A 未覆盖的部分,并且显然从最右边的 A A A 与两个 B B B 的关系可以看出 A A A 的边长是 B B B 的两倍。
那么,如果用 B B B 来填充 A A A 的话,

  • 纵向可以刚好填满,
  • 而又因为 A A A 是正方形,因此横向也可以刚好填满

这就证明了:能填满未覆盖部分的 B B B 一定可以填满覆盖了的所有 A A A,这就是欧几里得算法的几何解释;
现在用函数 g c d ( b , a ) gcd(b, a) gcd(b,a) 来表示在长边为 a a a,短边为 b b b 的矩形中,刚好能够无缝隙地覆盖的最大正方形边长,那么有

  • 长边剩余部分的长度为 a % b a \% b a%b
  • 短边为 b b b
  • 上述几何解释告诉我们: g c d ( a , b ) = g c d ( b , a % b ) gcd(a, b) = gcd(b, a \% b) gcd(a,b)=gcd(b,a%b)

1.3 用代数方法证明 g c d ( a , b ) = g c d ( b , a % b ) gcd(a, b) = gcd(b, a \% b) gcd(a,b)=gcd(b,a%b)

1.3.1 左推右: g c d ( a , b ) = g c d ( b , a % b ) gcd(a, b) = gcd(b, a \% b) gcd(a,b)=gcd(b,a%b)

现在有一个除式: A ➗ B = C ⋯   ⋯ D A ➗ B = C \cdots\ \cdots D AB=C D,并且 A A A B B B 的最大公约数为 k k k,现在要求 k k k

  • 由题可设: A = a × k , B = b × k A = a × k,B = b × k A=a×kB=b×k
  • 又因为 D = A − B × C D = A - B \times C D=AB×C
  • 所以 D = k ( a − b × C ) D = k(a - b \times C) D=k(ab×C)
  • 由于 a , b , C , k a, b, C, k a,b,C,k 都是整数,因此 D D D 也是整数,且是 k k k 的倍数;
  • 所以,被除数、除数、余数都有相同的公约数 k k k,且一定是最大的(假设不是最大的,则这个数一定也是被除数和除数的公约数,这与假设中的 最大公约数 矛盾)

因此,左推右得证;

1.3.2 右推左: g c d ( b , a % b ) = g c d ( a , b ) gcd(b, a \% b) = gcd(a, b) gcd(b,a%b)=gcd(a,b)

这个跟左推右的证明思路一样,关于除式 A ➗ B = C ⋯   ⋯ D A ➗ B = C \cdots\ \cdots D AB=C D,假设 B B B D D D 的最大公约数为 m m m,现在要求 m m m

  • 由题可设: B = b × m , D = d × m B = b \times m, D = d \times m B=b×m,D=d×m
  • 又因为 A = B × C + D A = B \times C + D A=B×C+D
  • 所以 A = m ( b C + d ) A = m(bC + d) A=m(bC+d)
  • 由于 b , C , d , m b, C, d, m b,C,d,m 都是整数,因此 A A A 也是整数,且是 m m m 的倍数;

因此,右推左得证;


1.4 欧几里得算法(辗转相除法)代码

展开版:

int gcd(int a, int b) {
	if (!b) {
		return a;
	}
	
	return gcd(b, a % b);
}

简化版:

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

2. 扩展欧几里得算法

扩展欧几里得算法是在欧几里得算法的运行过程中,求出方程 a x + b y = c ax + by = c ax+by=c 的一组解的算法;

2.1 直接上模拟

对于上面我们对欧几里得算法进行的模拟过程:

  • 16 ➗ 6 = 2 ⋯   ⋯ \cdots\ \cdots   4
  • 6 ➗ 4 = 1 ⋯   ⋯ \cdots \ \cdots   2
  • 4 ➗ 2 = 2 ⋯   ⋯ \cdots\ \cdots   0

可以从下到上对这些式子进行变形:

  • 2 = 4 × 0 + 2 × 1 2 = 4 \times 0 + 2 \times 1 2=4×0+2×1
  • 2 = 6 × 1 + 4 × ( − 1 ) 2 = 6 \times 1 + 4 \times (-1) 2=6×1+4×(1)
  • 2 = 16 × ( − 1 ) + 6 × 3 2 = 16 \times (-1) + 6 \times 3 2=16×(1)+6×3

意思就是说,一定可以找到方程 g c d ( a , b ) = a x + b y gcd(a, b) = ax + by gcd(a,b)=ax+by 的一组解;


2.2 裴蜀定理

由上面的分析可以得到一个定理:
裴蜀定理:设 a, b 为正整数,则关于 x, y 的方程 ax + by = c 有整数解 当且仅当 c 是 gcd(a, b) 的倍数;
下面给出一个简要的证明:
∵ a x + b y = c ∴ a g c d ( a , b ) x + b g c d ( a , b ) y = c g c d ( a , b ) ∵ g c d ( a , b ) 肯定是 a , b 的因子 ∴ 等式左边肯定是一个整数 ∴ 等式右边也是整数 ∴ 不妨设 k = c g c d ( a , b ) ∴ c = k ⋅ g c d ( a , b ) ∴ c 是 g c d ( a , b ) 的倍数 \begin{aligned} & \because ax + by = c \\ & \therefore \frac{a}{gcd(a, b)}x + \frac{b}{gcd(a, b)}y = \frac{c}{gcd(a, b)} \\ & \because gcd(a, b) 肯定是 a, b 的因子 \\ & \therefore 等式左边肯定是一个整数 \\ & \therefore 等式右边也是整数 \\ & \therefore 不妨设 k = \frac{c}{gcd(a, b)} \\ & \therefore c = k \cdot gcd(a, b) \\ & \therefore c 是 gcd(a, b) 的倍数 \\ \end{aligned} ax+by=cgcd(a,b)ax+gcd(a,b)by=gcd(a,b)cgcd(a,b)肯定是a,b的因子等式左边肯定是一个整数等式右边也是整数不妨设k=gcd(a,b)cc=kgcd(a,b)cgcd(a,b)的倍数
充分性按照上面的思路反推即可;
因此,假设现在要求 a x + b y = c = k ⋅ g c d ( a , b ) ax + by = c = k \cdot gcd(a, b) ax+by=c=kgcd(a,b) 的一组解,只需求出 a x + b y = g c d ( a , b ) ax + by = gcd(a, b) ax+by=gcd(a,b) 的一组解 ( x ′ , y ′ ) (x', y') (x,y),然后令系数 x = k x ′ , y = k y ′ x = kx', y = ky' x=kx,y=ky 即可;


2.3 算法公式推导

现在看下面的方程:
b x 0 + ( a % b ) y 0 = g c d ( b , a % b ) bx_0 + (a \% b)y_0 = gcd(b, a \% b) bx0+(a%b)y0=gcd(b,a%b)
由于 g c d ( a , b ) = g c d ( b , a % b ) gcd(a, b) = gcd(b, a \% b) gcd(a,b)=gcd(b,a%b),因此有
b x 0 + ( a % b ) y 0 = g c d ( a , b ) bx_0 + (a \% b)y_0 = gcd(a, b) bx0+(a%b)y0=gcd(a,b)
因此有
b x 0 + ( a − ⌊ a b ⌋ × b ) y 0 = g c d ( a , b ) bx_0 + (a - \lfloor \frac{a}{b} \rfloor \times b)y_0 = gcd(a, b) bx0+(aba×b)y0=gcd(a,b)
整理得到
a y 0 + b ( x 0 − ⌊ a b ⌋ y 0 ) = g c d ( a , b ) ay_0 + b(x_0 - \lfloor \frac{a}{b} \rfloor y_0) = gcd(a, b) ay0+b(x0bay0)=gcd(a,b)
由于 a x + b y = g c d ( a , b ) ax + by = gcd(a, b) ax+by=gcd(a,b),对比两个方程,令对应系数相等可以得到:
{ x = y 0 y = x 0 − ⌊ a b ⌋ y 0 \left\{ \begin{aligned} & x = y_0 \\ & y = x_0 - \lfloor \frac{a}{b} \rfloor y_0 \end{aligned} \right. x=y0y=x0bay0
所以递归更新参数 x , y x, y x,y,即可得到答案;


下面看看递归终止条件是什么:
b = 0 b = 0 b=0 时有:
g c d ( a , b ) = a gcd(a, b) = a gcd(a,b)=a
此时对于方程 a x + b y = g c d ( a , b ) ax + by = gcd(a, b) ax+by=gcd(a,b),有
x = 1 , y = 0 x = 1, y = 0 x=1,y=0
此为递归终止条件;

2.4 上代码

// d 为最大公约数
int extgcd(int a, int b, int& x, int& y) {
    if (!b) {
        x = 1;
        y = 0;
        return a;
    }

    int d = extgcd(b, a % b, x, y);
    int x0 = x, y0 = y;

    x = y0;
    y = x0 - (a / b) * y0;

    return d;
}

简化版还可以在递归的时候交换一下 y y y x x x

int extgcd(int a, int b, int& x, int& y) {
    if (!b) {
        x = 1;
        y = 0;
        return a;
    }

    int d = extgcd(b, a % b, y, x);
    y -= (a / b) * x;

    return d;
}

2.5 扩展欧几里得算法的应用

2.5.1 应用一:求解不定方程

这个过程就是求 a x + b y = c ax + by = c ax+by=c 的一组整数解,上面已经进行了模拟;

2.5.2 应用二:求乘法逆元

首先给出乘法逆元的定义:

a a a p p p 互质,则满足 ( a × x )   m o d   p = 1 (a \times x)\ mod\ p = 1 (a×x) mod p=1 x x x a a a 在该条件下的逆元;

举个例子:求 7 模 11 的逆元,由于 7 × 8 = 5 × 11 + 1 7 \times 8 = 5 \times 11 + 1 7×8=5×11+1,因此有 ( 7 × 8 )   m o d   11 = 1 (7 \times 8)\ mod\ 11 = 1 (7×8) mod 11=1,因此 7 在该条件下的逆元为 8;

因此,现在给出 a a a p p p,求出的方程 a x + k p = 1 ax + kp = 1 ax+kp=1 的一组解 ( x 1 , k 1 ) (x_1, k_1) (x1,k1) 其中的 x 1 x_1 x1 就是 a a a 在该条件下的逆元;

要使用扩展欧几里得算法进行求解,需要满足 g c d ( a , p ) = 1 gcd(a, p) = 1 gcd(a,p)=1,即 a a a p p p 互质,一定注意这个条件!!!


2.6 拓展:扩展欧几里得算法的通解

上面的过程我们只是求出了方程 a x + b y = c ax + by = c ax+by=c 的一组特解,现在要求的是其通解,可参考下面的过程:

2.6.1 a g c d ( a , b ) \frac{a}{gcd(a, b)} gcd(a,b)a b g c d ( a , b ) \frac{b}{gcd(a, b)} gcd(a,b)b 互质

首先证明 a g c d ( a , b ) \frac{a}{gcd(a, b)} gcd(a,b)a b g c d ( a , b ) \frac{b}{gcd(a, b)} gcd(a,b)b 互质:

采用反证法
假设 a g c d ( a , b ) \frac{a}{gcd(a, b)} gcd(a,b)a b g c d ( a , b ) \frac{b}{gcd(a, b)} gcd(a,b)b 不互质,说明它们之间还有不等于 1 的公约数
假设这个公约数为 k ( k > 0 且 k ≠ 1 ) k(k > 0 且 k \neq 1) k(k>0k=1)
因此有 a g c d ( a , b ) = k ⇒ a = k ⋅ g c d ( a , b ) > g c d ( a , b ) \frac{a}{gcd(a, b)} = k \Rightarrow a = k \cdot gcd(a, b) > gcd(a, b) gcd(a,b)a=ka=kgcd(a,b)>gcd(a,b)
这就违反了 gcd(a, b) 求取的是最大公约数的约定;
因此 a g c d ( a , b ) \frac{a}{gcd(a, b)} gcd(a,b)a b g c d ( a , b ) \frac{b}{gcd(a, b)} gcd(a,b)b 互质;

2.6.2 求通解

假设 ( x , y ) 与 ( x 0 , y 0 ) 都是方程 a x + b y = c 的解,因此有: a x + b y = c ⋯ ⋯ ① a x 0 + b y 0 = c ⋯ ⋯ ② ① − ②,有: a ( x − x 0 ) = b ( y 0 − y ) 两边同时除以 g c d ( a , b ) a g c d ( a , b ) ( x − x 0 ) = b g c d ( a , b ) ( y 0 − y ) ∵ a g c d ( a , b ) 与 b g c d ( a , b ) 互质 ∴ x − x 0 = t ⋅ b g c d ( a , b ) → x = x 0 + t ⋅ b g c d ( a , b ) ∴ y 0 − y = t ⋅ a g c d ( a , b ) → y = y 0 − t ⋅ a g c d ( a , b ) \begin{aligned} 假设 (x, y) 与 &(x_0, y_0) 都是方程 ax + by = c 的解,因此有:\\ & ax + by = c \cdots \cdots ①\\ & ax_0 + by_0 = c \cdots \cdots ②\\ & ① - ②,有:a(x - x_0) = b(y_0 - y) \\ & 两边同时除以 gcd(a, b) \\ & \frac{a}{gcd(a, b)} (x - x_0) = \frac{b}{gcd(a, b)} (y_0 - y) \\ & \because \frac{a}{gcd(a, b)} 与 \frac{b}{gcd(a, b)} 互质 \\ & \therefore x - x_0 = t \cdot \frac{b}{gcd(a, b)} \rightarrow x = x_0 + t \cdot \frac{b}{gcd(a, b)} \\ & \therefore y_0 - y = t \cdot \frac{a}{gcd(a, b)} \rightarrow y = y_0 - t \cdot \frac{a}{gcd(a, b)} \\ \end{aligned} 假设(x,y)(x0,y0)都是方程ax+by=c的解,因此有:ax+by=c⋯⋯ax0+by0=c⋯⋯,有:a(xx0)=b(y0y)两边同时除以gcd(a,b)gcd(a,b)a(xx0)=gcd(a,b)b(y0y)gcd(a,b)agcd(a,b)b互质xx0=tgcd(a,b)bx=x0+tgcd(a,b)by0y=tgcd(a,b)ay=y0tgcd(a,b)a

欢迎补充~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 3 第十五章:组件五(内置组件-keep-alive)

文章目录 1. keep-alive1.1. 基本用法1.2. 包含/排除1.3. 最大缓存实例数1.4. <keepAlive> 组件的生命周期 1. keep-alive <keep-alive>组件用于缓存动态组件的实例&#xff0c;以便在它们被切换时保持状态。例如&#xff0c;当我们在一个选项卡中切换不同的视图…

Unity Camera -- (2)相机投影设置

在Editor中调整相机 和场景视图中的其他游戏物体一样&#xff0c;相机本身也可以通过使用移动和旋转工具来进行调整。但这种方式比较难用&#xff0c;调整起来又慢又不精确。我们可以使用Move To View功能来快速调整相机所拍摄的画面。 1. 打开Camera_Projection_Scene&#xf…

Java 版企业工程项目管理系统平台(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

7、如何使用接口?

1、基本用法 我们需要定义这样一个函数&#xff0c;参数是一个对象&#xff0c;里面包含两个字段&#xff1a;firstName 和 lastName&#xff0c;也就是英文的名和姓&#xff0c;然后返回一个拼接后的完整名字。来看下函数的定义&#xff1a; // 注&#xff1a;这段代码为纯Ja…

【致敬未来的攻城狮计划】— 连续打卡第十二天:FSP固件库开发按键输入检测控制LED灯闪烁。

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

关于 OpenShift(OKD) 网络 Service、Routes的一些笔记

写在前面 参加考试&#xff0c;分享一些学习 OpenShift 的笔记博文内容为 OpenShift 网络相关组件 Service、Routes 很浅的一些认识学习环境为 openshift v3 的版本&#xff0c;有些旧这里如果专门学习 openshift &#xff0c;建议学习 v4 版本理解不足小伙伴帮忙指正 傍晚时分…

轻量级服务器nginx:反向代理的具体配置

系列文章目录 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 反向代理和负载均衡 系列文章目录一 反向代理1.正向代理2.反向代理 二 反向代理的实际部署1.配置tomcat2.配置host&#xff0c;nginx反向代理的配置三 结果展示四 总结 一 反向代理 1.正向代理 我们…

通过docker发布项目

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言例如&#xff1a;docker项目的发布方式 [docker发布的参考链接](https://www.cnblogs.com/emperorking/articles/11244253.html) 一、docker是什么&#xff1f;…

Django框架之自定义管理页面

Django框架Admin站点管理一些默认的显示和功能包括语言都可以自定义设置处理&#xff0c;以贴近我们的实际业务。 属性说明 列表页属性 配置文件myapp/admin.py from django.contrib import admin from .models import Grades, Students# Register your models here.# 注册班…

收废品小程序开发中的常见问题及解决方法

常见问题 1. 用户界面设计 小程序的用户界面设计至关重要。设计师需要在用户界面中提供清晰的指示&#xff0c;以便用户可以轻松地找到他们需要的功能。同时&#xff0c;设计师还需要确保用户界面的整体风格与公司的品牌形象相符。 2. 功能开发 开发小程序的功能需要考虑到…

深入学习RabbitMQ五种模式(一)

1.安装erlang 下载otp_win64_25.3.exe https://www.erlang.org/downloads erlang安装完成&#xff0c;需要配置erlang环境变量 ERLANG_HOMEE:\software\Erlang OTPPATH%PATH%;%ERLANG_HOME%\bin; 2.安装RabbitMQ 下载rabbitmq-server-3.11.13.exe https://www.rabbitmq.com/dow…

交叉验证之KFold和StratifiedKFold的使用(附案例实战)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

力扣---LeetCode88. 合并两个有序数组

文章目录 前言88. 合并两个有序数组链接&#xff1a;方法一&#xff1a;三指针(后插)1.2 代码&#xff1a;1.2 流程图&#xff1a;方法二&#xff1a;开辟新空间2.1 代码&#xff1a;2.2 流程图&#xff1a;2.3 注意&#xff1a; 总结 前言 “或许你并不熠熠生辉甚至有点木讷但…

POSTGRESQL COPY 命令原理与加速数据 导入提高速度200%以上

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

vue2+vue3——107+

vue2vue3——107 vue2 Vuex工作原理图【23:54】vue2 搭建Vuex环境【26:40】插入 话题npm i vue3 store / index.js修改 vue2 求和案例_vuex版【22:39】vue2 vuex开发者工具的使用【23:21】vue2 getters配置项【07:55】vue2 mapState与mapGetters【25:20】vue2 mapActions与mapM…

egg3.0连接egg-mongoose操作数据库,删除一条数据、批量删除数据

删除一条数据 定义service app\service\role.js async delItem() {const { ctx } this;let results;await ctx.model.Role.deleteOne({ name: test-S3 }).then(res > {console.log(results-del-success, res);results res?.deletedCount > 0;}).catch(err > {con…

系统分析师之软件工程(十二)

目录 一、 软件开发生命周期 1.1 开发阶段工作细分 二、软件开发模型 2.1 瀑布模型 2.2 原型模型 2.3 增量模型与螺旋模型 2.4 V模型 2.5 喷泉模型 2.6 快速应用开发模型RAD 2.7 构件主装模型 2.8 统一过程 2.9 敏捷方法 三、逆向工程 四、净室软件工程 一、 软件…

为何C语言的函数调用要用到堆栈,而汇编却不需要自定义栈

一 ≠ 汇编不需要堆栈 汇编中一般不初始化&#xff0c;也就是直接使用系统的堆栈而已&#xff0c;自己定义堆栈还是要初始化的。 之前看了很多关于uboot的分析&#xff0c;其中就有说要为C语言的运行&#xff0c;准备好堆栈。 而自己在Uboot的start.S汇编代码中&#xff0c…

crm-day04 分页查询市场活动,刷新市场活动列表

分页插件 分页这个组件前端要写也很麻烦&#xff0c;而且与业务逻辑代码无关&#xff0c;因此我们引入一个分页查询的插件。 进行jsp测试 三大步骤&#xff1a; 1、引入相关的包 2、创建容器来保存插件的运行结果 容器是<input typetext/>或者div。 3、容器加载完成后&a…

猫猫与主人

时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 对猫猫按照友善值进行排序 对主人按照期望友善值进行排序 就可以找到能收养猫猫的主人 对主人的友善值取一个max最后跟猫猫的期望友…