求最大公约数

基本概念

  • 因数 :若A=m×n,则称m,n是A的因数;A是m,n的倍数 一个数的最大因数和最小倍数都是它本身
    一个数的最小因数是1。
  • 质数(素数):在大于1的整数中,只有1和它本身两个因数的数,叫做质数。** 0、1既不是质数也不是合数;2 是唯一的偶数质数**。
  • 约数:若A÷B=x„0(A能够整除B,没有余数); 则称B是A的约数;A是B的倍数
  • 质约数:如果一个整数的约数恰好是一个质数,则称此约数为这个整数的质约数
  • 分解质因数(分解质约数):把一个整数分解成多个质因数(约数)连乘 标准分解质因数的写法:把小的写在前面,多个相同的质数要用乘方表示。

宣传语

历经两个半月的准备,三次大改版,十七次小改版。le1024终于要和大家见面了。

le1024每天推荐1~3段,有趣、有爱、有故事的视频。

为您工作、学习、生活之余增加一点快乐的感觉。

  • 互质, 也称之为互素。若N个整数的最大公因子是1,则称这N个整数互质。
  • 合数:在大于2的整数中,除了1和它本身两个因数,还有其它因数的数,叫做合数
    整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a叫b的倍数,b叫a的约数(或 因数)。一个数的约数是有限的。

什么是最大公约数

最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。
如,12 和 30 的约数,以及公有的约数。

那么可知,12和30的最大公约数为6

辗转相除法

两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数

例如,252和105的最大公约数是21(252 = 21 × 12;105 = 21 × 5);因为252 / 105 = 2余42,所以105和42的最大公约数也是21。在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至余数变为零。这时的除数就是所求的两个数的最大公约数。

辗转相除法的演示动画:两条线段分别表示252和105,其中每一段表示21。动画演示了循环从大数中减去小数,直到其中一段的长度为0,此时剩下的一条线段的长度就是252和105的最大公约数。

条形表示法:

最初的绿色矩形的长和宽分别是a = 1071、b = 462,从中不断铺上462×462的正方形直到剩下部分面积是462×147;然后再铺上147×147的正方形直至剩下21×147的面积;最后,铺上21×21的正方形时,绿色部分就没有了。即21是1071和462的最大公约数.

瓷砖表示法:

数学表示:

f(x,y) = f(y, x % y)

ruby 代码:

def gcd(x , y)
    return (y == 0 )? x : gcd(y , x % y)
end

用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。

时间复杂度:
O(log n),其中 n 为输入数值的位数。

相减法

以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

例如:91和49

较大值 较小值
91 49
49 42
42 7
35 7
28 7
21 7
14 7
7 7

数学表示:

f(x,y) = f(x-y, y)

ruby 代码:

def gcd2(x , y)
  if(x < y)
    return  gcd2(y , x)
  elsif(y == 0)
    return x
  else
    return gcd2(x - y , y)
  end
end

时间复杂度: < O(log n)

此解法用减法而不是除法,降低了计算的复杂度,但是迭代的次数比除法要多,当遇到f(10000000,1)的情况时这不是一个好方法。

相除法和想减法的区别

(1)都是求最大公约数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显。
(2)从结果体现形式来看,辗转相除法体现结果是以相除余数为0则得到,而更相减损术则以减数与差相等而得到。

融合以上两种方式

首先,从公约数的特点入手

  • x和y来说,如果 x = k * x1 , 那么y = k * y1 ,那么就有f(x, y) = k * f(x1, y1)
  • 如果x = p * x1, 假设p是素数,并且y % p!=0 (即y不能被p整除, 若等于0,那么y就是最大公约数),那么f(x, y) = f(p * x1, y) = f(x1, y)
  • 2是一个素数,同时对于二进制表示的大整数而言,可以很容易地除以2和乘以2的运算转换成移位运算,从而避免大整数除法,由此可以利用2这个数字来进行分析

数学的表示方法

取 p = 2  
若x, y 均为偶数 f(x,y)= 2 * f(x/2,y/2) = 2 * f(x >> 1, y>>1)  
若x为偶数,y为奇数 f(x,y) = f(x/2, y) = f(x >> 1, y)  
若x为奇数,y为偶数 f(x,y) = f(x, y/2) = f(x, y >> 1)  
若x, y均为奇数  f(x, y) = f(y, x-y)
那么在f(x,y) = f(y, x- y)之后,(x - y)是一个偶数,下一步就是除以2的操作   

ruby 代码

  def gcd3(x ,y)
    if(x < y)
      return gcd3(y, x)
    end

    if(y == 0)
      return x
    else
      if(is_even?(x))
        if (is_even?(y))
          return (gcd3(x >> 1, y >> 1) << 1)
        else
          return gcd3(x >> 1, y)
        end
      else
        if(is_even?(y))
          return gcd3(x, y >> 1)
        else
          return gcd3(y, x-y)
        end
      end
    end
  end

  def is_even?(a)
    if(a%2 == 0)
      return true
    else
      return false
    end
  end

时间复杂度

O(log2(max(x,y)))

辗转相除法证明:

设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,k为a除以b的商,即a÷b=k.......r。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。

第一步:令c=gcd(a,b),则设a=mc,b=nc
第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c
第三步:根据第二步结果可知c也是r的因数
第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】
从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 求最小公倍数 有两种方法 (1)分解质因数法 先把两个数用其质因数的乘积表示出来如:求45和30的最小公倍数45 ...
    敬轩大大阅读 903评论 1 0
  • 求最大公约数有三种方式 暴力穷举法 辗转相除法 更相减损术 暴力穷举法 暴力穷举法的思路:从两个数之间找最小的数,...
    zxcvbnmzsedr阅读 6,284评论 2 9
  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,588评论 0 5
  • 作为一个数学很渣的人,我表示学习算法真是有点困难,虽然万事开头难,我还是迈出了第一步,以后我尽量保证一天跟新一个算...
    coder_那一抹刚吹过的风阅读 639评论 0 0
  • 惊闻今日厦门斑马两名参赛者猝死。有五句话想说: 1.锻炼身体的方式有N种,并无什么好坏运动之分,也没有最好的运动,...
    路易栗阅读 249评论 0 0