一,更相减损术是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,适用于任何需要求最大公约数的场合。

证明:
设gcd(x,y)=d,则满足x=k1*d,y=k2*d,易得k1与k2互质。
情况1:x=y。显然,gcd(x,y)=x=gcd(x,0)=gcd(x,y-x)。
情况2:不妨令x>y
用反证法。
假设k1,(k2 - k1)不互质,
令gcb(k1.k2-k1) = m(m为正整数且m>1);
k1 = m*a,k2 - k1 = m*b
k2 = (a+b)m
即k1,k2有公约数m,与k1,k2互质矛盾
所以假设不成立
即k1,(k2 - k1)互质
所以gcb(x,x-y) = d = gcb(x,y)
综上,gcd(x,y)=gcd(x,y-x)。
命题得证

相关代码

public static int getGreatestCommonDivisor(int max, int min) {
  if (max == min) {
    return max;
  }
  if (max < min) {  //位运算交换两数大小
    max = max ^ min;
    min = max ^ min;
    max = max ^ min;
  }
  return getGreatestCommonDivisor(max - min, min);
}

Stein算法
更相减损法有点类似于求最大公约数的Stein算法。在更相减损法中,若两个是偶数则同除以2,结果乘以2。如果增加一个判断,若为一奇一偶则偶数除以2,结果不变,若为两个奇数才相减,这样就变成了计算大整数最大公约数的非常好的一个算法,Stein算法。

Stein算法代码:

public static int getGreatestCommonDivisor(int max, int min) {
        if (max == min) {
            return max;
        }
        if ((max & 1) == 0 && (min & 1) == 0) {
            return getGreatestCommonDivisor(max >> 1, min >> 1);
        } else if ((max & 1) == 0 && (min & 1) != 0) {
            return getGreatestCommonDivisor(max >> 1, min);
        } else if ((max & 1) != 0 && (min & 1) == 0) {
            return getGreatestCommonDivisor(max, min >> 1);
        } else {
            if (max < min) {
                max = max ^ min;
                min = max ^ min;
                max = max ^ min;
            }
            return getGreatestCommonDivisor(max - min, min);
        }
    }

二,欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。

证明:

定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。

gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)

证法一
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r不为0)
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d,由等式右边可知m=r/d为整数,因此d|r
因此d也是b,a mod b的公约数。
因(a,b)和(b,a mod b)的公约数相等,则其最大公约数也相等,得证。

证法二
假设c = gcd(a,b),则存在m,n,使a = mc, b = nc;
令r = a mod b,即存在k,使r = a-kb = mc - knc = (m-kn)c;
故gcd(b,a mod b) = gcd(b,r) = gcd(nc,(m-kn)c) = gcd(n,m-kn)c;
则c为b与a mod b的公约数;
假设d = gcd(n,m-kn), 则存在x,y, 使n = xd, m-kn = yd; 故m = yd+kn = yd+kxd = (y+kx)d;
故有a = mc = (y+kx)dc, b = nc = xdc; 可得 gcd(a,b) = gcd((y+kx)dc,xdc) = dc;
由于gcd(a,b) = c, 故d = 1;
即gcd(n,m-kn) = 1, 故可得gcd(b,a mod b) = c;
故得证gcd(a,b) = gcd(b,a mod b).

相关代码:

public static int gcd(int m,int n) { 
        if(n == 0){
        return m; 
        }
        int r = m%n;
        return gcd(n,r);
}

更相减损术,辗转相除法相关推荐

  1. 求最大公约数(更相减损术辗转相除法)

    求解最大公约数的多种Way: 1 暴力解决法:M不断自减找到最大公约数. 2 辗转相除法:反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数. 3 更相减损术:若两者都为偶数,进行折半,直到 ...

  2. 初等数论--整除--欧几里得算法/辗转相除法/更相减损术

    初等数论--整除--欧几里得算法/辗转相除法/更相减损术 欧几里得算法/辗转相除法/更相减损术 博主本人是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找 ...

  3. C++算法:辗转相除法与更相减损术

    辗转相除法与更相减损术 1.我们已经学过求最大公因数的知识,你能求出18与30的公因数吗? 2.如果公因数比较大而且根据我们的观察又不能得到一些公因数,我们又应该怎样求它们的最大公因数?比如求8251 ...

  4. 求最大公约数和最小公倍数——辗转相除法(欧几里得算法)、更相减损术、stein算法

    辗转相除法-- 辗转相除法求最大公约数的原理: 两个整数其中较小的数 和 两数相除(较大数除较小数)的余数(使用递归)的最大公约数. 辗转相除法求最小公倍数的原理: 两个整数分别除以最大公约数的结果相 ...

  5. 【C语言】辗转相除法+更相减损术+秦九韶算法

    一.辗转相除法 1.简介 辗转相除法又叫欧几里得算法. 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的: 1997 / 615 = 3 (余 152) 615 ...

  6. 辗转相除法和更相减损术

    高中学过的求大公约数的方法就是辗转相除法和更相减损术了. 辗转相除法递归版 #include <iostream> using std::cin; using std::cout; usi ...

  7. 辗转相除法与更相减损术(求最大公约数)

    辗转相除法:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数.比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数. ...

  8. 【求最大公约数详解】更相减损术和辗转相除法

    更相减损术 介绍 ​   更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合 步骤 任意给定两个正整数:判断它们是否都是偶数 ...

  9. 「辗转相除法」和「更相减损术」求最大公约数

    一.辗转相除法 举个例子,比如155和65 155=65*2+25 65=25*2+15 25=15*1+10 15=10*1+5 10=5*2+0 一直除到余数为0为止,所以最大公约数是5 publ ...

最新文章

  1. 深入浅出统计学(十三)假设检验
  2. LWIP再探----内存池管理
  3. 服务器性能瓶颈分析方法
  4. 【思考】一次交付项目小结
  5. 信息安全工程师笔记-综合知识冲刺(三)
  6. mac系统如何在当前目录下打开终端
  7. 第1次在Flash Builder中写程序
  8. OPPO Reno6系列和Reno5系列有啥区别?价格差不多?
  9. 微信开发经常会用到的一些方法
  10. mysql 开启binlog
  11. Autodesk CAD 2023简体中文正式版
  12. 毫米和像素怎么换算_像素换算(像素和毫米换算器)
  13. RISC-V MCU+病房系统
  14. 大数据时代的小数字感:数据再有价值,别人听不懂照样没用
  15. 对于多线程程序,单核cpu与多核cpu是怎么工作的
  16. 双硬盘装linux系统,在我的双硬盘windows电脑上安装ubuntu18.04
  17. 牛顿法与拟牛顿法学习笔记(一)牛顿法
  18. TP5接入快递查询api
  19. 解决SendMessage函数向QQ好友发送中文消息时出现乱码
  20. android+动画打包命令,Android 开机动画客制化

热门文章

  1. 「自然语言处理」使用自然语言处理的智能文档分析
  2. mysql数据库 when_mysql case when怎样运用?_数据库
  3. ec11编码器c语言程序,单片机驱动EC11编码器源程序
  4. 怎么撤销定时说说_怎么撤销qq空间定时说说
  5. 即时通讯音视频开发(十):实时语音通讯的回音消除技术详解
  6. 新网站如何做seo?小白站长实操案例!
  7. 全球与中国PUR和PIR低温绝缘市场需求前景与发展趋势预测报告(2022-2027年)
  8. 空间谱估计matlab实现,相干信号空间谱估计测向Matlab仿真研究
  9. phpcm 首页调单页提示栏目不存在报错
  10. ppt文本框含公式时的同时显示