本文是参考新浪博客而写。
欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式
gcd(a, b) = gcd(b, a mod b)
其中gcd(a, b)表示a和b的最大公约数, mod是模运算, 即求a除以b的余数. 代码如下:

#include <iostream>
#include <math.h>
using namespace std;int gcd1(int a,int b)//递归版本
{if (a<b){int temp=a;a=b;b=temp;}if (b==0){return a;}else{return gcd1(b,a%b);}
}
int gcd2(int a,int b)//循环版本
{if (a<b){int temp=a;a=b;b=temp;}while ( b!=0){int c=a%b;a=b;b=c;}return a;
}
int main()
{int a,b;cout<<"请输入两个正数:"<<endl;cin>>a>>b;cout<<a<<"与"<<b<<"的最大公约数是:"<<gcd2(a,b)<<endl;//cout<<a<<"与"<<b<<"的最大公约数是:"<<gcd1(a,b)<<endl;}

欧几里得算法是最古老而经典的算法, 理解和掌握这一算法并不难, 但要分析它的时间复杂度却并不容易. 我们先不考虑模运算本身的时间复杂度(算术运算的时间复杂度在Knuth的TAOCP中有详细的讨论), 我们只考虑这样的问题: 欧几里得算法在最坏情况下所需的模运算次数和输入的a和b的大小有怎样的关系?
我们不妨设a>b≥1a>b\ge1, 构造数列{un}:\{u_n\}:

u0=a,u1=b,...,uk=uk−2moduk−1(k≥2),

u_0=a, u_1=b, ...,u_k=u_{k-2}mod u_{k-1}(k\ge2),
显然, 若算法需要n次模运算, 则有 un=gcd(a,b),un+1=0u_n=gcd(a, b), u_{n+1}=0. 我们比较数列 {un}\{u_n\}和菲波那契数列 {Fn},\{Fn\},

un≥1=F0un−1≥1=F1

u_n\ge 1=F_0\\ u_{n-1}\ge 1=F_1\\ 又因为由 ukmoduk+1=uk+2,u_k mod u_{k+1}=u_{k+2}, 可得 uk=uk+1×β+uk+2≥uk+1+uk+2u_k=u_{k+1}\times \beta+u_{k+2} \ge u_{k+1}+u_{k+2},故可得

un−2≥un−1+un≥F0+F1=F2

u_{n-2}\ge u_{n-1}+u_{n}\ge F_0+F_1=F_2 ,以此类推,由数学归纳法容易得到

un−k≥Fk,

u_{n-k}\ge F_k, 也就是

uk≥Fn−k

u_k\ge F_{n-k}于是得到 a=u0≥Fn,b=u1≥Fn−1a=u_0\ge F_n, b=u_1\ge F_{n-1}. 也就是说如果欧几里得算法需要做n次模运算, 则b必定不小于 Fn−1F_{n-1}. 根据斐波那契数列的性质, 有

Fn−1>(1.618)n5√

F_{n-1}\gt {(1.618)^n\over \sqrt{5}}, 即 b>(1.618)n5√b\gt {(1.618)^n\over \sqrt{5}}, 所以模运算的次数为 O(lgb)O(lgb).

欧几里得算法(即辗转相除法)的时间复杂度相关推荐

  1. php 辗转相除法,手撸golang 基本数据结构与算法 最大公约数 欧几里得算法/辗转相除法...

    手撸golang 基本数据结构与算法 最大公约数 欧几里得算法/辗转相除法 缘起 最近阅读<>([日]石田保辉:宫崎修一) 本系列笔记拟采用golang练习之 欧几里得算法欧几里得算法(又 ...

  2. 既约分数 欧几里得算法/辗转相除法

    欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数.计算公式gcd(a,b) = gcd(b,a % b). public class count {     public sta ...

  3. GCD LCM 欧几里得算法 扩展欧几里得算法

    欧几里得算法: 辗转相除法的关键恒等式:gcd(a,b)=gcd(b,a mod b); 边界条件:gcd(a,0)=a; //最大公约数 int gcd(int a,int b) {return b ...

  4. 【离散数学中的数据结构与算法】二 欧几里得算法与裴蜀等式

    欧几里得算法是计算两个数最大公因子算法.又称辗转相除法.本文将学习为什么辗转相除法可以求得两个数的最大公因子.同时也可以根据最大公因子计算两个数的最小公倍数. 文章目录 1 欧几里得算法的理论基础 1 ...

  5. 欧几里得算法以及推论

    欧几里得算法euclids algorithm 欧几里得算法又称辗转相除法,用于计算两个正整数a.b的最大公约数(greatest common divisor).计算公式gcd(a,b) = gcd ...

  6. java实现rsa欧几里得算法求d_RSA算法中利用欧几里得算法求d详细过程

    文章转自新浪博客@任家 正文: RSA是第一个也是使用的最广泛的公钥加密算法,在1978年由R.Rivest.AdiShamir和Adleman三人发明, 并以他们的名字命名.RSA算法的安全性基于大 ...

  7. 51Nod-1011 最大公约数GCD【欧几里得算法】

    1011 最大公约数GCD 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1& ...

  8. 【数论】欧几里得算法

    百度百科定义: 欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数.应用领域有数学和计算机两个方面.计算公式gcd(a,b) = gcd(b,a mod b). 假如需要求 199 ...

  9. C++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法

    前言 在关于数论的学习中,求解二元一次不定方程是很重要的,在学习求解二元一次不定方程之前,要先了解欧几里得算法和扩展欧几里得算法. 关于数论的学习 欧几里得算法 欧几里得算法就是辗转相除法,欧几里得算 ...

最新文章

  1. SE81 - Application hierarchy CSS component tree
  2. IOS之UIToolBar约束报错
  3. python在线作业_南开大学20春学期《Python编程基础》在线作业参考答案
  4. 2021衢二中高考成绩查询入口,2021衢州市地区高考成绩排名查询,衢州市高考各高中成绩喜报榜单...
  5. 一个java 验证码的实现提供多种的实现
  6. ansible+ssh自动化运维
  7. ArrayList源码剖析
  8. 一篇文章学懂ADB命令和Monkey命令
  9. 如何对接GN EDI系统?
  10. 2021年软考程序员考试大纲
  11. 《TensorFlow技术解析与实战》——3.3 可视化的例子
  12. iOS开发直播app-美颜滤镜GPUImageBeautifyFilter
  13. RTI_DDS使用参与者QoS属性编辑传输TCP
  14. 来料加工企业使用ERP系统作用有哪些
  15. 造移动厕所的,转做核酸采样亭。火了
  16. coffe-script
  17. .NET 中的 GAC
  18. mac 装java ecli_Eclipse下Maven安装和配置
  19. 【翻译】MED 3D: TRANSFER LEARNING FOR 3D MEDICAL I MAGE ANALYSIS
  20. python中元组拆包_Python 元组拆包示例(Tuple Unpacking)

热门文章

  1. Table城市代码翻译
  2. Python爬虫学习笔记1:request、selenium、ChromeDrive、GeckoDriver等相关依赖安装
  3. bzoj [Usaco2009 Hol]Cattle Bruisers 杀手游戏
  4. Java 运算符及优先级
  5. WD硬盘 C1门 解决办法
  6. 怎样和客户一起搞定需求
  7. 今天拿到了同事给我买的《java与模式》
  8. MySQL 之group_concat_max_length Mac 版
  9. 记了老是忘记那就写下来吧宏任务微任务
  10. vue --- 过滤器、计算、方法、观察属性