基本算法-欧几里德算法(辗转相除法)

简介: 基本算法-欧几里德算法(辗转相除法)

前言

      近期购买了一本《图解算法C++》,回顾复习下算法知识。正好借此机会,将我在复习过程中觉得不错或者容易忘记的算法整理下来,可能会帮助到其他想要学习的人。


      本文介绍一种求解最大公约数常用的算法——欧几里德算法,以下是本篇文章正文内容,包括算法简介、原理及证明、算法流程和C++代码实现。


一、欧几里德算法简介

      欧几里德算法又称辗转相除法,是求解最大公约数常用的一种算法。过程:假设有A和B两个值,A大于B,用其中较大的数A除以较小的数B,再将较小的数B除以得到的余数C(第一次除法所得),又得到一个余数D(第二次除法所得),如此类推,直到最后余数为0时终止该过程,最后的余数就是A和B的最大公约数。

二、基本原理及证明

1.基本原理

      两个数的最大公约数是可以同时整除这两个数的最大正整数。

      设两个数为a、b(a≥b),求a和b最大公约数(Greatest common divisor)gcd(a,b)的步骤如下:

  1. a除以b,得a÷b=q........r1(r1≥0),r1为第一次的余数;
  2. 若r1=0,则gcd(a,b)=b;
  3. 若r1≠0,再用b除以r1,得余数r2;
  4. 如此反复,直到某余数等于0,则该余数就是我们所找的最大公约数gcd(a,b)。

2.证明

      同样设两个数a和b(a≥b),gcd(a,b)表示两数的最大公约数,r=a mod b,r为a除以b的余数,k为a除以b的商,即a÷b=k......r。


      欧几里德算法能求解最大公约数的原理其实就是证明gcd(a,b)=gcd(b,r),即a和b的最大公约数和b和r的最大公约数是一个。


      证明过程如下:


  1. 令c=gcd(a,b),设a=mc,b=nc;
  2. 由a÷b=k......r可得r=a-kb=mc-knc=(m-kn)c;
  3. 第二步不难看出,c也是r的因数;
  4. 列出b=nc和r=(m-kn)c,如果n和m-kn互质,即两者公约数只有1,则表明c是b和r的最大公约数,后续证明n和m-kn互质;
  5. 假设m-kn和n不是互质,两者有一非零的最大公约数d,且d>1;
  6. 则有m-kn=xd,n=yd,得m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,则a与b的一个公约数cd>c,故c不是a与b的最大公约数,这与前面提到的c是a与b的最大公约数假设矛盾;
  7. 故m-kn和n为互质,即c是b和r的最大公约数,且是a和b的最大公约数,得证。


三、算法描述及流程图

      欧几里德算法求解正整数a和b的最大公因数gcd(a,b),假设a≥b:

      a除以b,若a mod b=0,则gcd(a,b)=b;否则gcd(a,b)=gcd(b,a mod b),递归或循环运算得结果。

      算法流程图如下:

四、C++代码实现

// 欧几里德C++实现伪代码
if ( num1 < num2 )
{
    temp = num1;
    num1 = num2;
    num2 = temp;
}
// 确保num2是较小值,num1是较大值
while ( num2 != 0 )       // 欧几里德算法过程,直到num2(余数)为0时结束循环过程
{  
    temp = num1 % num2;   // 计算余数
    num1 = num2;
    num2 = temp;          // 将余数作为下一轮的除数
}
std::cout<<"最大公约数为:"<<num1<<std::endl;


总结

      以上就是本文所讲的内容,简单介绍了欧几里德算法的原理和实现。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
11月前
|
算法 Python
转:最大公约数算法很无聊吗?一个轻松方法(辗转相除法)3行代码搞定
最大公约数算法不是很无聊,计算最大公约数是数学中一个重要的概念,可以用于判断两个数是否互质、求分数的约分等,在很多领域都有广泛的应用。辗转相除法3行代码搞定。
49 0
算法--递归辗转相除法求最大公约数
算法--递归辗转相除法求最大公约数
|
算法
漫画算法:辗转相除法是什么鬼?
辗转相除法, 又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。它是已知最古老的算法, 其可追溯至公元前300年前。
103 0
漫画算法:辗转相除法是什么鬼?
|
算法 C语言
算法之【辗转相除法】
辗转相除法用于求两个或以上的正整数的最大公约数。 The Euclidean Algorithm is used to get the greatest common divisor. 语言描述:求两个整数的最大公约数时,先让一个整数整除另一个整数,求得余数,再分别将刚才的除数和余数作为新的被除数和除数进行运算,依次循环直到余数为0时停止,此时的除数就是刚开始两个数的最大公因子。
1246 0
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
22小时前
|
算法
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
MATLAB 2022a仿真实现了LDPC码的性能分析,展示了不同码长对纠错能力的影响。短码长LDPC码收敛快但纠错能力有限,长码长则提供更强纠错能力但易陷入局部最优。核心代码通过循环进行误码率仿真,根据EsN0计算误比特率,并保存不同码长(12-768)的结果数据。
19 9
m基于BP译码算法的LDPC编译码matlab误码率仿真,对比不同的码长
|
2天前
|
算法
MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型
这段内容介绍了一个使用改进的麻雀搜索算法优化CNN-BiLSTM模型进行多输入单输出预测的程序。程序通过融合正余弦和柯西变异提升算法性能,主要优化学习率、正则化参数及BiLSTM的隐层神经元数量。它利用一段简单的风速数据进行演示,对比了改进算法与粒子群、灰狼算法的优化效果。代码包括数据导入、预处理和模型构建部分,并展示了优化前后的效果。建议使用高版本MATLAB运行。
|
4天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。
|
4天前
|
资源调度 算法 块存储
m基于遗传优化的LDPC码OMS译码算法最优偏移参数计算和误码率matlab仿真
MATLAB2022a仿真实现了遗传优化的LDPC码OSD译码算法,通过自动搜索最佳偏移参数ΔΔ以提升纠错性能。该算法结合了低密度奇偶校验码和有序统计译码理论,利用遗传算法进行全局优化,避免手动调整,提高译码效率。核心程序包括编码、调制、AWGN信道模拟及软输入软输出译码等步骤,通过仿真曲线展示了不同SNR下的误码率性能。
9 1