博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最大公约数与欧几里德算法
阅读量:6186 次
发布时间:2019-06-21

本文共 654 字,大约阅读时间需要 2 分钟。

记a、b的最大公约数为gcd(a,b)。

这里对于最大公约数的讨论仅限于非负整数,因为显然有gcd(a,b)=gcd(|a|,|b|)。

计算最大公约数的Euclid算法基于下面定理:

【GCD递归定理】对于任意非负整数a和任意正整数b,gcd(a,b)=gcd(b,a%b)。

Euclid算法最简单的递归版本(C语言版)如下:

1 int Euclid(int a,int b) 2 {
3 if(b)return Euclid(b,b%a);else return a; 4 }

迭代版本(C语言版)如下:

1 int Euclid(int a,int b) 2 {
3 while(a=a%b)a^=b^=a^=b; 4 return b; 5 }

Euclid算法运行时间分析

【引理】如果a>b≥1且Euclid(a,b)执行了k≥1次递归调用,则a≥Fk+2,b≥Fk+1。(其中Fk为Fabonacci的第k项)

【Lamé定理】对于任意k≥1,若a>b≥1且b<Fk+1则Euclid(a,b)的递归调用次数少于k次。

O(log b)是该算法一个粗略的界,事实上当b确定后,Euclid(a,b)的平均迭代次数近似为(12ln2/π2)×lnb。

 

除了上述的Euclid算法外还有一种不用求余数运算的的。

转载于:https://www.cnblogs.com/kingwolfofsky/archive/2012/01/17/2324825.html

你可能感兴趣的文章
针对开发项目的NABCD的分析
查看>>
pe结构讲解
查看>>
ndk build 的时候报错,少了libncurses.so.5
查看>>
Promise的基本用法
查看>>
波特率计算
查看>>
c程序设计语言第一章5
查看>>
四种简单的排序算法
查看>>
RestTemplate常用的get和post带参数请求
查看>>
Scala学习笔记 - 特质
查看>>
总结常见疑问
查看>>
db2 reorg table failed处理
查看>>
1009 Product of Polynomials
查看>>
对拍BAT
查看>>
[20171031]rman xxx Failure.txt
查看>>
hdu 1003 Max Sum (动态规划)
查看>>
获取当前系统日期的前一天日期
查看>>
WEB 容器、WEB服务和应用服务器的区别与联系
查看>>
可变参函数的定义和使用
查看>>
显式类型转换
查看>>
欧拉函数
查看>>