二进制最大公约数算法

求最大公约数的Euclid算法需要用到大量的取模运算,这在大多数计算机上是一项复杂的工作,相比之下减法运算、测试数的奇偶性、折半运算的执行速度都要更快些。

二进制最大公约数算法避免了Euclid算法的取余数过程。

二进制最大公约数基于下述事实:

  1. 若a、b都是偶数,则gcd(a,b)=2*gcd(a/2,b/2)
  2. 若a是奇数、b是偶数,则gcd(a,b)=gcd(a/2,b/2)
  3. 若a、b都是奇数,则gcd(a,b)=gcd((a-b)/2,b)

因此可写出二进制最大公约数算法如下(C语言版):

[cpp] view plaincopy

  1. int gcd(int a,int b){
  2. int c=1;
  3. while(a-b){
  4. if(a&1){
  5. if(b&1){
  6. if(a>b)a=(a-b)>>1;else b=(b-a)>>1;
  7. }
  8. else b>>=1;
  9. }
  10. else{
  11. if(b&1)a>>=1;else c<<=1,a>>=1,b>>=1;
  12. }
  13. }
  14. return c*a;
  15. }

或者

[cpp] view plaincopy

    1. int gcd(int u,int v){
    2. int k=1,t;
    3. while(~u&1 && ~v&1)k<<=1,u>>=1,v>>=1;
    4. t=(u&1)?-v:u>>1;
    5. do{
    6. while(~t&1)t>>=1;
    7. if(t>0)u=t;else v=-t;
    8. }while(t=u-v);
    9. return u*k;
    10. }
时间: 2024-09-29 09:32:45

二进制最大公约数算法的相关文章

最大公约数算法

看到一个比较精炼的最大公约数算法: public static int gcd(int a, int b){ return b==0 ? a : gcd(b, a % b); }

菜鸟学算法--简单的交换和最大公约数算法入门篇

工作之后我们大部分的时间实在研究如何如何学习一门语言 如何如何掌握一门技术,但是作为编程的本质 数据结构和算法 我们慢慢的忽略了 . 工作后的很多程序员真的没有大学生一样的时间 去静下心来去增加自己的底蕴,这是我深有体会的事情当然我这里指的是和我有累死感觉的人. 学习是一个过程,从简入繁 一贯如此,记录下来只为 记录自己的点点滴滴. 算法的本质并不是我们程序员去创造算法 而是我们 按照先人创造的算法思想 用代码来实现算法. 下面开始介绍两个 简单的例子 一个是交换 一个是最大公约数算法. 简单的

二进制指数退避算法

2019/12/18 二进制指数退避算法(来自于百度百科) CSMA/CD采用二进制指数退避算法,又称为二元指数后退算法.退避算法是以冲突窗口大小为基准的,每个节点有一个冲突计数器C.退避的时间与冲突次数具有指数关系,冲突次数越多,退避的时间就可能越长,若达到限定的冲突次数,该节点就停止发送数据. 定义 二进制退避技术(Binary Exponential Back off). 指在遇到重复的冲突时,站点将重复传输,但在每一次冲突之后,随着时延的平均值将加倍.二进制指数退避算法提供了一个处理重负

公约数算法

/* 对于已知的两个自然数m, n,假设m>n 计算m除以n,将得到的余数记做r 如果r=0,则此时的n为求得的最大公约数.否则,将n的值保存在m中,将r的值保存在n中, 重复执行下去. */ //欧几里得->辗转相除法 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <iostream> #include &l

《转》两种最大公约数算法

1.辗转相除法 辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法.例如,求gcd(319,377):∵ 377÷319=1(余58)∴gcd(377,319)=gcd(319,58):∵ 319÷58=5(余29),∴ gcd(319,58)=gcd(58,29):∵ 58÷29=2(余0),∴ gcd(58,29)= 29:∴ gcd(319,377)=29. 2. 更相减损法: 更相减损术,是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需

Summary: gcd最大公约数算法

欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(a,b)的公约数 因此(a,b

二进制转换十进制 算法解析

java里面是有进制间互换现成的方法的: public class 十进制与各进制的相互转换 { public static void main(String[] args){ //java已经实现的机制:十进制转换为二进制 int decimal = 10; System.out.println("十进制数:"+decimal+",转换为二进制:"+Integer.toBinaryString(decimal)); System.out.println("

【170723】一个简洁的求最大公约数算法

1 import java.util.Scanner; 2 3 public class ZuiDaGongYueShuClass { 4 5 public static void main(String[] args) { 6 Scanner in = new Scanner(System.in); 7 int a = in.nextInt(); 8 int b = in.nextInt(); 9 while (b != 0) { 10 int r = a % b; 11 a = b; 12

php取两个整数的最大公约数算法大全

php计算两个整数的最大公约数常用算法 <?php//计时,返回秒function microtime_float (){ list( $usec , $sec ) = explode ( " " , microtime ()); return ((float) $usec + (float) $sec );}////////////////////////////////////////////欧几里得算法function ojld($m, $n) { if($m ==0 &a