马上注册,享受更多特权
您需要 登录 才可以下载或查看,没有帐号?立即注册 ![](source/plugin/zhanmishu_wechat/template/static/img/wechat_login.png)
x
关于最大公约数常见算法有三种:辗转相除法、更相减损法、Stein算法
其中前两种算法编写简单,过程有些类似,但是算数相差较大或数值本身较大会引起过大的计算量。最后一种算法分类复杂,但是在算数过大时可以有效的减少计算量,所以在实际使用中可以对数据判断大小选择不同方式来计算。
提示:谨防while、repeat此类循环不限次数引发的宕机,建议增加限制次数EXIT的保护。
下面介绍内容,原理证明可自行百度。
1.辗转相除法(欧几里得算法)
gcd( a,b ) = gcd( a,a%b );
令a%b = c,循环求余计算
(1)c = 0,则b为最大公约数
(2)c != 0,则让a = b, b = c,执行a%b = c直到满足(1)
2.更相减损法
gcd( a,b ) = gcd( a,a-b );
令a、b循环相减计算
(1)a = b,则a或b就是最大公约数
(2)a != b,若a>b,则a = a-b;若a<b,则b = b-a;执行到满足(1)
3.Stein算法
核心:奇偶分类概念
首先规定,a>b
(1)均为偶数 gcd( a,b ) =2gcd( a/2,b/2 );
(2)均为奇数 gcd( a,b ) = gcd( (a+b)/2,(a-b)/2 );
(3)a奇b偶 gcd( a,b ) = gcd( a,b/2 );
(4)a偶b奇 gcd( a,b ) = gcd( a/2,b );
由上面不难看出,Stein算法按照奇偶性质进行2的n次方处理,即幂函数。对比相除相加的算法,幂计算在处理较大的数据时阶数逐渐降低,计算优势明显。
不论是哪种方法,都是给出了有关gcd(a,b)的性质,在实际计算中,完全可以将这些性质打乱重组灵活运用,最终目的就是快速计算出结果。
分享以学习交流为目的,如有错误请指正。
|