求最大公约数(GCD)的两种算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

求最⼤公约数(GCD)的两种算法
之前⼀直只知道欧⼏⾥得辗转相除法,今天学习了⼀下另外⼀种、在处理⼤数时更优秀的算法——Stein
特此记载
1.欧⼏⾥得(Euclid)算法
⼜称辗转相除法,依据定理gcd(a,b)=gcd(b,a%b)
实现过程演⽰: sample:gcd(15,10)=gcd(10,5)=gcd(5,0)=5
C语⾔实现:
1int Euclid_GCD(int a, int b)
2 {
3return b?Euclid_GCD(b, a%b):a;
4 }
2.Stein 算法
⼀般实际应⽤中的整数很少会超过64位(当然现在已经允许128位了),对于这样的整数,计算两个数之间的模是很简单的。

对于字长为32位的平台,计算两个不超过32位的整数的模,只需要⼀个指令周期,⽽计算64位以下的整数模,也不过⼏个周期⽽已。

但是对于更⼤的素数,这样的计算过程就不得不由⽤户来设计,为了计算两个超过 64位的整数的模,⽤户也许不得不采⽤类似于多位数除法⼿算过程中的试商法,这个过程不但复杂,⽽且消耗了很多CPU时间。

对于现代密码算法,要求计算 128位以上的素数的情况⽐⽐皆是,设计这样的程序迫切希望能够抛弃除法和取模。

依据定理:
gcd(a,a)=a,也就是⼀个数和其⾃⾝的公约数仍是其⾃⾝。

gcd(ka,kb)=k*gcd(a,b),也就是运算和倍乘运算可以交换。

特殊地,当k=2时,说明两个偶数的必然能被2整除。

当k与b互为质数,gcd(ka,b)=gcd(a,b),也就是约掉两个数中只有其中⼀个含有的因⼦不影响。

特殊地,当k=2时,说明计算⼀个偶数和⼀个奇数的时,可以先将偶数除以2。

C语⾔实现:
1int Stein_GCD(int x, int y)
2 {
3if (x == 0) return y;
4if (y == 0) return x;
5if (x % 2 == 0 && y % 2 == 0)
6return2 * Stein_GCD(x >> 1, y >> 1);
7else if (x % 2 == 0)
8return Stein_GCD(x >> 1, y);
9else if (y % 2 == 0)
10return Stein_GCD(x, y >> 1);
11else
12return Stein_GCD(min(x, y), fabs(x - y));
13 }。

相关文档
最新文档