当前位置: 首页 > news >正文

河北住房和城乡建设厅网站电话海报设计图片简单

河北住房和城乡建设厅网站电话,海报设计图片简单,端午节网页制作模板,网站建设考评表欧几里得算法(辗转相除法) 欧几里得算法(Euclidean Algorithm)是一种高效计算两个非负整数最大公约数(GCD)的方法。它不仅简单易懂,而且在数学和计算机科学中有着广泛的应用。以下是对该算法的深入讲解,包…

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

欧几里得算法(Euclidean Algorithm)是一种高效计算两个非负整数最大公约数(GCD)的方法。它不仅简单易懂,而且在数学和计算机科学中有着广泛的应用。以下是对该算法的深入讲解,包括其原理、扩展、时间复杂度分析以及实际应用。


1. 算法原理

欧几里得算法的核心思想基于以下数学原理:

  • 辗转相除法:对于两个整数 a 和 b ( a ≥ b ) (a \geq b) ab,它们的最大公约数 gcd ⁡ ( a , b ) \gcd(a, b) gcd(a,b) 等于 gcd ⁡ ( b , a m o d b ) \gcd(b, a \mod b) gcd(b,amodb)
  • 终止条件:当 b = 0 时,a 就是最大公约数。

数学证明
d = gcd ⁡ ( a , b ) d = \gcd(a, b) d=gcd(a,b),则 d 能整除 a 和 b。根据除法的定义:
a = b ⋅ q + r a = b \cdot q + r a=bq+r
其中 q 是商, r = a m o d b r = a \mod b r=amodb 是余数。由于 d 能整除 a 和 b,它也能整除 r。因此, gcd ⁡ ( a , b ) = gcd ⁡ ( b , r ) \gcd(a, b) = \gcd(b, r) gcd(a,b)=gcd(b,r)

其中 q 是商, r = a m o d b r = a \mod b r=amodb 是余数。由于 d 能整除 a 和 b,它也能整除 r。因此, gcd ⁡ ( a , b ) = gcd ⁡ ( b , r ) \gcd(a, b) = \gcd(b, r) gcd(a,b)=gcd(b,r)

通过反复应用这一性质,余数 r 会逐渐减小,最终变为 0,此时算法终止。


2. 算法步骤

  1. 输入:两个非负整数 a 和 b ( a ≥ b ) (a \geq b) ab
  2. 计算余数:计算 a m o d b a \mod b amodb,得到余数 r。
  3. 替换:将 a 替换为 b,b 替换为 r。
  4. 重复:重复上述步骤,直到 b = 0。
  5. 输出:当 b = 0 时,a 即为最大公约数。

示例
计算 gcd ⁡ ( 48 , 18 ) \gcd(48, 18) gcd(48,18)

  • 48 m o d 18 = 12 48 \mod 18 = 12 48mod18=12,替换为 a = 18,b = 12。
  • 18 m o d 12 = 6 18 \mod 12 = 6 18mod12=6,替换为 a = 12,b = 6。
  • 12 m o d 6 = 0 12 \mod 6 = 0 12mod6=0,替换为 a = 6,b = 0。
  • 当 b = 0 时,a = 6 即为最大公约数。

3. 扩展欧几里得算法

扩展欧几里得算法不仅计算 gcd ⁡ ( a , b ) \gcd(a, b) gcd(a,b),还能找到满足以下等式的整数 x 和 y:

a ⋅ x + b ⋅ y = gcd ⁡ ( a , b ) a \cdot x + b \cdot y = \gcd(a, b) ax+by=gcd(a,b)
这在求解线性同余方程和模反元素时非常有用。

这在求解线性同余方程和模反元素时非常有用。

算法步骤

  1. 使用欧几里得算法计算 gcd ⁡ ( a , b ) \gcd(a, b) gcd(a,b),并记录每一步的余数和系数。
  2. 回溯时,利用递推关系计算 x 和 y。

示例
求解 48 x + 18 y = gcd ⁡ ( 48 , 18 ) 48x + 18y = \gcd(48, 18) 48x+18y=gcd(48,18)

  • 通过扩展欧几里得算法,可以得到 x = -1,y = 3,因为:
    48 ⋅ ( − 1 ) + 18 ⋅ 3 = 6 = gcd ⁡ ( 48 , 18 ) 48 \cdot (-1) + 18 \cdot 3 = 6 = \gcd(48, 18) 48(1)+183=6=gcd(48,18)

4. 时间复杂度分析

欧几里得算法的时间复杂度为 O ( log ⁡ min ⁡ ( a , b ) ) O(\log \min(a, b)) O(logmin(a,b))。这是因为每次迭代中,余数 r 至少减小为原来的一半:

  • 如果 b ≤ a / 2 b \leq a/2 ba/2,则 r < b ≤ a / 2 r < b \leq a/2 r<ba/2
  • 如果 b > a / 2 b > a/2 b>a/2,则 r = a − b < a / 2 r = a - b < a/2 r=ab<a/2

因此,算法的迭代次数最多为 O ( log ⁡ min ⁡ ( a , b ) ) O(\log \min(a, b)) O(logmin(a,b))


5. 实际应用

  1. 数论
    • 计算最大公约数。
    • 求解线性同余方程
      a x ≡ b ( m o d m ) ax \equiv b \pmod{m} axb(modm)
    • 计算模反元素(用于 RSA 加密算法)。
  2. 密码学
  • RSA 算法中,扩展欧几里得算法用于计算私钥。
  1. 计算机科学
    • 用于分数的化简。
    • 在算法设计中,用于优化某些数学计算。

6. 算法实现

1. 欧几里得算法实现

用于计算两个整数的最大公约数(GCD)。

#include <iostream>
using namespace std;// 欧几里得算法
int gcd(int a, int b) {while (b != 0) {int temp = b;b = a % b;a = temp;}return a;
}int main() {int a = 48, b = 18;cout << "GCD of " << a << " and " << b << " is: " << gcd(a, b) << endl;return 0;
}

输出

GCD of 48 and 18 is: 6

2. 扩展欧几里得算法实现

用于计算最大公约数,并找到满足 (ax + by = \gcd(a, b)) 的整数 (x) 和 (y)。

#include <iostream>
using namespace std;// 扩展欧几里得算法
int extended_gcd(int a, int b, int &x, int &y) {if (b == 0) {x = 1;y = 0;return a;}int x1, y1;int gcd = extended_gcd(b, a % b, x1, y1);x = y1;y = x1 - (a / b) * y1;return gcd;
}int main() {int a = 48, b = 18;int x, y;int gcd_value = extended_gcd(a, b, x, y);cout << "GCD of " << a << " and " << b << " is: " << gcd_value << endl;cout << "Coefficients (x, y) are: (" << x << ", " << y << ")" << endl;cout << "Equation: " << a << "*" << x << " + " << b << "*" << y << " = " << gcd_value << endl;return 0;
}

输出

GCD of 48 and 18 is: 6
Coefficients (x, y) are: (-1, 3)
Equation: 48*-1 + 18*3 = 6

3. 求解线性同余方程

扩展欧几里得算法可以用于求解形如 (ax \equiv b \pmod{m}) 的线性同余方程。

#include <iostream>
using namespace std;// 扩展欧几里得算法
int extended_gcd(int a, int b, int &x, int &y) {if (b == 0) {x = 1;y = 0;return a;}int x1, y1;int gcd = extended_gcd(b, a % b, x1, y1);x = y1;y = x1 - (a / b) * y1;return gcd;
}// 求解线性同余方程 ax ≡ b (mod m)
bool solve_linear_congruence(int a, int b, int m, int &x) {int x0, y0;int gcd_value = extended_gcd(a, m, x0, y0);// 如果 b 不能被 gcd(a, m) 整除,则无解if (b % gcd_value != 0) {return false;}// 计算特解x = x0 * (b / gcd_value) % m;if (x < 0) {x += m; // 保证解为非负数}return true;
}int main() {int a = 35, b = 10, m = 50;int x;if (solve_linear_congruence(a, b, m, x)) {cout << "Solution to " << a << "x ≡ " << b << " (mod " << m << ") is: x = " << x << endl;} else {cout << "No solution exists for " << a << "x ≡ " << b << " (mod " << m << ")" << endl;}return 0;
}

输出

Solution to 35x ≡ 10 (mod 50) is: x = 14

4. 计算模反元素

扩展欧几里得算法可以用于计算模反元素,即找到满足 a ⋅ x ≡ 1 ( m o d m ) a \cdot x \equiv 1 \pmod{m} ax1(modm) 的 x。

#include <iostream>
using namespace std;// 扩展欧几里得算法
int extended_gcd(int a, int b, int &x, int &y) {if (b == 0) {x = 1;y = 0;return a;}int x1, y1;int gcd = extended_gcd(b, a % b, x1, y1);x = y1;y = x1 - (a / b) * y1;return gcd;
}// 计算模反元素
int mod_inverse(int a, int m) {int x, y;int gcd_value = extended_gcd(a, m, x, y);// 如果 a 和 m 不互质,则模反元素不存在if (gcd_value != 1) {return -1; // 表示无解}// 保证结果为非负数x = (x % m + m) % m;return x;
}int main() {int a = 3, m = 11;int inverse = mod_inverse(a, m);if (inverse == -1) {cout << "Modular inverse of " << a << " mod " << m << " does not exist." << endl;} else {cout << "Modular inverse of " << a << " mod " << m << " is: " << inverse << endl;}return 0;
}

输出

Modular inverse of 3 mod 11 is: 4

7. 总结

欧几里得算法是一种高效、经典的算法,其核心思想是通过辗转相除法逐步减小问题规模。它不仅用于计算最大公约数,还可以扩展到求解线性同余方程和模反元素,在数论、密码学和计算机科学中有着广泛的应用。其时间复杂度为 O ( log ⁡ min ⁡ ( a , b ) ) O(\log \min(a, b)) O(logmin(a,b)),是一种非常高效的算法。

http://www.dtcms.com/a/600791.html

相关文章:

  • 好的俄文网站设计大学学风建设专题网站
  • 领域驱动设计系列文章汇总
  • C++11拓展语法
  • 智慧医疗:FHIR R5、联邦学习与MLOps三位一体的AI产品化实战指南(下)
  • 创建一个达梦库需要多大空间
  • Redis_11_类型补充+命令补充+RESP
  • 网站设计哪家便宜seo网站做推广公司
  • 用于感知图像超分辨率的自编码监督(易于理解版本)
  • 地图可视化实践录:空间分析库Turf.js的学习
  • 长沙制作网站公司哪家好广州seo推广营销
  • 11、prometheus-PromQL-5-聚合计算函数
  • (114页PPT)上海x友集团管理咨询及IT规划项目第一期报告管理诊断分析咨询报告(附下载方式)
  • C语言编译器 Visual Studio:实现高效编程与调试环境优化
  • 王树森深度强化学习 DRL(六)连续控制 DDPG + 随机策略
  • 【SatWetCH4 第一期】全球湿地甲烷排放通量估算过程模型 SatWetCH4 介绍
  • Opencv(十一) : 图像缩放
  • 开源 Objective-C IOS 应用开发(四)Xcode工程文件结构
  • 儿童网站 源码html5网站开发教学
  • 编译类语言的特点与应用
  • Python 数组使用方法总结
  • 网站风格变化免费logo在线制作头像
  • 第三章深度解析:智能体“大脑”的底层逻辑——大语言模型技术基石全拆解
  • 100个云计算基础知识
  • 对比 DeepSeek(MLA)、Qwen 和 Llama 系列大模型在 Attention 架构/算法层面的核心设计及理解它们的本质区别。
  • 【C++】List容器模拟实现(超详细)
  • 湖南火电建设有限公司网站龙采哈尔滨建站公司
  • 【PHP反序列化】css夺旗赛
  • ServletLess架构简介
  • 安卓C语言编译器的选择与使用技巧 | 优化C语言编程体验,提升开发效率
  • (三)自然语言处理笔记——Transformer