更相减损术

辗转相除法、更相减损术(九章算术) 还是有点迷糊,

穿精又带淫゛_ 提交于 2020-04-07 07:27:12
首先重点无论式辗转相除法还是更相减损术,最重要的原理是:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数 你可以这么理解, C=(A,B) ,C为A,B的最大公约数;即A,B都有公因数C,那么A-B也有公因数C, A%C=0; B%C=0; A%C-B%C=(A-B)%C=0 假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z, 那么x一定能被z整除,y也一定能被z整除,所以x和y的线性组合mx±ny也一定能被z整除。(m和n可取任意整数) 对于辗转相除法来说,思路就是:若x>y,设x/y=n余c,则x能表示成x=ny+c的形式,将ny移到左边就是x-ny=c,由于一般形式的mx±ny能被z整除,所以等号左边的x-ny(作为mx±ny的一个特例)就能被z整除,即x除y的余数c也能被z整除。一直下操作, 最后就是更相减损术是拿来相减,而辗转相除是取余;当两个数很接近的时候前者算法效率高,两个数差距很大的时候后者效率高! 来源: https://www.cnblogs.com/Left-Behind/p/7554000.html

辗转相除法与更相减损术

大兔子大兔子 提交于 2020-04-07 07:26:45
          已知a、b求a与b的最大公因数与最小公倍数? 先说最大公因数   我们先把a、b改写成多个素数的幂相乘。比如a=36和b=54,那么a=2^2*3^2,b=2^1*3^3。根据定义最大公因数就是取a、b分解出的相同素数的最小指数相乘,即2^1*3^2=18。   辗转相除法就是用a、b中的大数对小数取余,再把余数和小数中的较小数取余,一直这样做,直到刚好整除,余数为0。比如36与54,先算54%36=18,再算36%18=0,结束,这里的18即为所求。  int gcd(int x,int y) { if(x%y==0) return y; else return zhanzhuan(y,x%y); }   然后是更相减损术。一种实现是把a、b中的大数减小数,然后把小数与差中的大数减小数,直到减到减数和差一样,此时的差即为所求。   比如36与54,先算54-36=18,再算36-18=18,此时18=18,18就是最大公因数了。 int gcd(int a,int b) { while(a!=b) { if(a>b)a=a-b; if(a<b)b=b-a; } return a; } 以上两种算法复杂度略玄学,有时快有时慢的…… 这里还有一种更相减损术的代码,复杂度是log级别的。 int gcd(int a,int b) { int F=1; while(a