本文为joshua317原创文章,转载请注明:转载自joshua317博客 数据结构和算法-数学问题-最大公约数 - joshua317的博客
一、最大公约数说明
最大公约数,也称最大公因数、最大公因子,指两个或多个整数共有约数中最大的一个。
如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。比如,只能说8是某数的倍数,2是某数的约数,而不能孤立地说8是倍数,2是约数。
几个自然数公有的约数,叫做这几个自然数的公约数。其中最大的一个,叫做这几个数的最大公约数。比如,12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数,一般记为(12,16)=4。12、15、18的最大公约数是3,记为(12,15,18)=3。
二、实现最大公约数的算法
2.1 辗转相除法,又称欧几里德算法
辗转相除法又称欧几里德算法,是用来求两个正整数最大公约数的算法。它是古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。
定理:两个正整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。
gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)
欧几里得的辗转相除算法是计算两个自然数最大公约数的传统算法,对于多个自然数可以执行多次辗转相除法来得到最大公约数。辗转相除法的执行过程如下:
(1)对于已知两自然数a、b,假设a>b;
(2)计算a除以b,将得到的余数记为r;
(3)如果r=0,则b为求得的最大公约数,否则执行下面一步;
(4)将b的值保存到a中,将r的值保存到b中,
重复执行步骤(2)和(3),直到r=0,便得到最大公约数。
流程图如下:
2.2 Stein算法
Stein算法是一种计算两个数最大公约数的算法,是针对欧几里德算法在对大整数进行运算时,需要试商导致增加运算时间的缺陷而提出的改进算法。
欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际效率上都是很好的。但是却有一个致命的缺陷,这个缺陷在素数比较小的时候一般是感觉不到的,只有在大素数时才会显现出来。一般实际应用中的整数很少会超过64位(当然已经允许128位了),对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以