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


本文是参考新浪博客而写。
欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式
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>b1, 构造数列{un}:

u0=a,u1=b,...,uk=uk2moduk1(k2),

显然, 若算法需要n次模运算, 则有 un=gcd(a,b),un+1=0. 我们比较数列 {un}和菲波那契数列 {Fn},
un1=F0un11=F1
又因为由 ukmoduk+1=uk+2,可得 uk=uk+1×β+uk+2uk+1+uk+2,故可得
un2un1+unF0+F1=F2
,以此类推,由数学归纳法容易得到
unkFk,
也就是
ukFnk
于是得到 a=u0Fn,b=u1Fn1. 也就是说如果欧几里得算法需要做n次模运算, 则b必定不小于 Fn1. 根据斐波那契数列的性质, 有
Fn1>(1.618)n5
, 即 b>(1.618)n5, 所以模运算的次数为 O(lgb).

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

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

相关文章

UIImageJPEGRepresentation和UIImagePNGRepresentation

在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用过程中,比较发现: UIImagePNGRepresenta…

C++ 0x

转载于:https://www.cnblogs.com/iiiDragon/p/3230006.html

系列文章----.Net程序员学用Oracle系列

.Net程序员学用Oracle系列(18)&#xff1a;PLSQL Developer 攻略.Net程序员学用Oracle系列(17)&#xff1a;数据库管理工具(SQL Plus).Net程序员学用Oracle系列(16)&#xff1a;访问数据库(ODP.NET).Net程序员学用Oracle系列(15)&#xff1a;DUAL、ROWID、NULL.Net程序员学用Or…

Github for Windows使用介绍

Git已经变得非常流行&#xff0c;连Codeplex现在也已经主推Git。Github上更是充斥着各种高质量的开源项目&#xff0c;比如ruby on rails&#xff0c;cocos2d等等。对于习惯Windows图形界面的程序员来讲&#xff0c;Github的使用是需要点时间和耐心的&#xff0c;然而最近Githu…

matlab中udt函数,《MATLAB信号处理超级学习手册》——2.5 离散时间信号中的运算...

本节书摘来自异步社区《MATLAB信号处理超级学习手册》一书中的第2章&#xff0c;第2.5节&#xff0c;作者&#xff1a;MATLAB技术联盟 , 史洁玉著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看2.5 离散时间信号中的运算MATLAB信号处理超级学习手册2.5.1 离散…

iOS 将16进制颜色转换成UIColor

很多地方我们都使用16进制颜色&#xff0c;但iPhone使用的是UIColor对象&#xff0c;不直接支持16进制颜色&#xff0c;为此&#xff0c;需要我们手动将16进制颜色转换为UIColor - (UIColor *) hexStringToColor: (NSString *) stringToConvert {NSString *cString [[stringTo…

OBJ 文件格式

OBJ文件是一种标准的3D模型文件格式&#xff0c;很适合用于3D软件模型之间的互导。比如在3dsMax或LightWave中建了一个模型&#xff0c;想把它调到Maya里面渲染或动画&#xff0c;导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写&#xff0c;不过…

构建Docker镜像(三)

作者:李晓辉联系方式:Xiaohui_lifoxmail.comQQ:939958092一、建立Dockerfile1、准备文件新建一个目录和一个 Dockerfilemkdir /steventouch /steven/Dockerfile2、更新Dockerfile这个步骤是在设计镜像&#xff0c;如果你需要在镜像内包含什么软件&#xff0c;将来开放哪些端口&…

centos 配置php开发环境变量配置,CentOS中配置PHP和Nginx环境变量

搜索热词一、摘要在Linux CentOS系统上 安装完PHP和Nginx后&#xff0c;一般需要执行查看版本命令’PHP -v’和’Nginx -v’,确认是否安装成功,如果在没有添加到环境变量之前&#xff0c;执行“PHP -v”命令查看当前PHP版本信息时&#xff0c;则会提示命令不存在的错误&#xf…

你必须很努力,才能看上去毫不费力

世上没有一件工作不辛苦&#xff0c;没有一处人事不复杂。 从今天起&#xff0c;每天微笑吧&#xff0c; 世上除了生死&#xff0c;都是小事。 不管遇到了什么烦心事&#xff0c;都不要自己为难自己&#xff1b; 无论今天发生多么糟糕的事&#xff0c;都不应该感到悲伤。 今天是…

HDU 4631 Sad Love Story 平面内最近点对

http://acm.hdu.edu.cn/showproblem.php?pid4631 题意: 在平面内依次加点,求每次加点后最近点对距离平方的和 因为是找平面最近点对...所以加点以后这个最短距离一定是递减的...所以最后会形成这样一个函数图像 所以我们只要从后往前依次删点即可... 15秒惊险水过...不过我最小…

c++三/五法则

如果这个类需要一个析构函数&#xff0c;我们几乎可以肯定它也需要一个拷贝构造函数和一个拷贝赋值运算符。 如果一个类需要拷贝构造函数&#xff0c;几乎可以肯定它也需要一个拷贝赋值运算符&#xff0c;反之亦然。 然而&#xff0c;无论是需要拷贝构造函数还是需要拷贝赋值运…

itoa的用法

功能&#xff1a;将任意类型的整数转换为字符串。在<stdlib.h>中与之有相反功能的函数是atoi。 用法&#xff1a;char*itoa(int value,char*string,int radix); int value 被转换的整数&#xff0c;char *string 转换后储存的字符数组&#xff0c;int radix 转换进制数…

Tomcat与Gzip与缓存

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…

java竖向菜单,垂直滑动菜单

www.lanrentuku.comtd {font-size: 12px;}width"200" />height9 src"images/bit05.gif" width8alignabsMiddle> href"javascript:void(null)">文管产品 src"images/bit06.gif" width8 alignabsMiddle> href"http://w…

作为IT从业者,你是如何做好个人职业规划?

前言 写这篇文章的原因是因为你前端时间看到朋友在公众号&#xff08;Marno&#xff09;发的一篇文章《27岁程序员职业生涯的“中年危机”》有感而发&#xff0c;谈谈自己对IT从业人员的一些职业规划上的想法。本篇文章是我在坐地铁的时候在手机上码出来的&#xff0c;写的不好…

将一句话的单词进行倒置,标点符号不倒换。比如一句话:“i love you.”倒换后变为you. love i

#include <string.h> #include <stdio.h> #include <stdlib.h>//将一句话的单词进行倒置&#xff0c;标点符号不倒换。比如一句话:“i love you.”倒换后变为"you. love i" void reverse(char *str) {int i0,jstrlen(str)-1;int begin,end;char te…

JS一些实用的方法

1、首次为变量赋值时务必使用var关键字变量没有声明而直接赋值得话&#xff0c;默认会作为一个新的全局变量&#xff0c;要尽量避免使用全局变量。2、使用取代和!操作符会在需要的情况下自动转换数据类型。但和!不会&#xff0c;它们会同时比较值和数据类型&#xff0c;这也使得…

[转]第一章 Windows Shell是什么 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987862】...

一个操作系统外壳的不错的定义是它是一个系统提供的用户界面&#xff0c;它允许用户执行公共的任务&#xff0c;如访问文件系统&#xff0c;导出执行程序&#xff0c;改变系统设置等。MS-DOS有一个Command.COM扮演着这个角色。然而Windows已经有了图形界面环境&#xff0c;他的…

20155222卢梓杰 《Java程序设计》第1周学习总结

20155222 《Java程序设计》第1周学习总结 教材学习内容总结 JDK是一个工具程序&#xff0c;包括了JAVA程序语言&#xff0c;工具程序与JRE&#xff0c;JRE包括了部署技术&#xff0c;JAVA SE API 与 JVM。 教材学习中的问题和解决过程 第一章&#xff1a;JDK的变量和选项如何设…