辗转相除法

来源:互联网 发布:景区票务软件 编辑:程序博客网 时间:2024/05/27 19:27

  辗转相除法是一种很古老求两正整数最大公约数的算法,据传出自欧几里得的《几何原本》一书,可以追溯至公元前300年前。这也意味着,这一算法在2000多年后依然在流传,被使用。之前学习希尔排序的时候,还感叹这已横跨半世纪的算法依然生命力旺盛。现在又了解了这两千多年前的算法,感觉还是有点惊异的。
  
        这里写图片描述
  
  在辗转相除法里,两个正整数m和n,他们的最大公约数等于其中较大数除以较小数的余数与m, n之中的较小数的最大公约数。听着有点绕。假如要求18和30这两个数的最大公约数,那么,就是求12(30除以18余12)和18(18和30中的较小数)的最大公约数,然后可以递归下去。
  那么,如何证明呢? 

已知m>n, m ÷ n = a……bc = gcd(m,n),d = gcd(n,b)证明:c = d1.设 m = k1*c,n = k2*c   #k1和k2均为正整数则 b = m-na = (k1-k2*a)c那么 n、b有公约数c          #n = k2*c又 d = gcb(n,b)           #d是n和b的最大公约数所以 c ≤ d2.设 n = k3*d,b = k4*d   #d是n和b的最大公约数则 m = na+b = (k3*a+k4)*d那么 m、n有公约数d         #b = k4*d又 c = gcb(m,n)          #c是m和n的最大公约数所以 d ≤ c由于 c ≤ d 且 d ≤ c,故 d = c,即gcd(m, n) = gcd(n, b)

下面用C语言实现这个算法。

int t = 0;int gcd(int m, int n) {    t = m > n ? n: m;    m = m > n ? m: n;    n = t;    if (m % n == 0)        return n;    return gcd(m % n, n);}

下面用python实现。

def gcd(m, n):    m, n = (m, n) if m > n else (n, m)    if m % n == 0:        return n    return gcd(m % n, n)
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 二建有效期到了怎么办 二级建造师到期怎么办 网上选车牌号后怎么办 政府拖欠水利工程款怎么办 重庆造价员到期了怎么办 枕大神经发炎怎么办 塑钢推拉窗下沉怎么办 网上买东西数量不够怎么办 淘宝买东西数量不够怎么办 康佳遥控器坏了怎么办 电视机频幕脏了怎么办 极米遥控器失灵怎么办 电视遥控坏了怎么办 小米手机触摸屏失灵怎么办 oppo手机触摸屏失灵怎么办 苹果手机屏幕没反应怎么办 苹果6sp换屏卡顿怎么办 苹果4屏幕失灵怎么办 苹果手机老是卡怎么办 苹果手机卡机了怎么办 苹果手机卡屏了怎么办 苹果8手机老卡机怎么办 苹果手机不开机怎么办 手机开机后黑屏怎么办 苹果x手机黑屏怎么办 苹果7手机黑屏怎么办 苹果触控不灵敏怎么办 收银机触屏失灵怎么办 手机屏一半失灵怎么办 苹果六手机屏幕失灵怎么办 苹果5s卡怎么办 苹果5很卡怎么办 笔记本屏幕卡顿怎么办 手机外屏幕失灵怎么办 6p手机屏幕失灵怎么办 home键指纹失灵怎么办 小米触屏不灵敏怎么办 vivo手机音量小怎么办 iphone尾插松动怎么办 充电头接触不良怎么办 苹果充电口松动怎么办