`

stein算法

 
阅读更多

欧几里德算法是计算两个数最大公约数的传统算法,他无论从理论还是从效率上都是很好的。但是他有一个致命的缺陷,这个缺陷只有在大素数时才会显现出来。

考虑现在的硬件平台,一般整数最多也就是64位,对于这样的整数,计算两个数之间的模是很简单的。对于字长为32位的平台,计算两个不超过32位的整数的模,只需要一个指令周期,而计算64位以下的整数模,也不过几个周期而已。但是对于更大的素数,这样的计算过程就不得不由用户来设计,为了计算两个超过64位的整数的模,用户也许不得不采用类似于多位数除法手算过程中的试商法,这个过程不但复杂,而且消耗了很多CPU时间。对于现代密码算法,要求计算128位以上的素数的情况比比皆是,设计这样的程序迫切希望能够抛弃除法和取模。

Stein算法由J. Stein 1961年提出,这个方法也是计算两个数的最大公约数。和欧几里德算法 算法不同的是,Stein算法只有整数的移位和加减法,这对于程序设计者是一个福音。

为了说明Stein算法的正确性,首先必须注意到以下结论:

  • gcd(a,a) = a,也就是一个数和他自身的公约数是其自身
  • gcd(ka,kb) = k gcd(a,b),也就是最大公约数运算和倍乘运算可以交换,特殊的,当k=2时,说明两个偶数的最大公约数必然能被2整除

有了上述规律就可以给出Stein算法如下:

  1. 如果A=0,B是最大公约数,算法结束
  2. 如果B=0,A是最大公约数,算法结束
  3. 设置A1 = A、B1=B和C1 = 1
  4. 如果An和Bn都是偶数,则An+1 =An /2,Bn+1 =Bn /2,Cn+1 =Cn *2(注意,乘2只要把整数左移一位即可,除2只要把整数右移一位即可)
  5. 如果An是偶数,Bn不是偶数,则An+1 =An /2,Bn+1 =Bn ,Cn+1 =Cn (很显然啦,2不是奇数的约数)
  6. 如果Bn是偶数,An不是偶数,则Bn+1 =Bn /2,An+1 =An ,Cn+1 =Cn (很显然啦,2不是奇数的约数)
  7. 如果An和Bn都不是偶数,则An+1 =|An -Bn|,Bn+1 =min(An,Bn),Cn+1 =Cn
  8. n++,转4

这个算法的原理很显然,所以就不再证明了。现在考察一下该算法和欧几里德方法效率上的差别。

考虑欧几里德算法,最恶劣的情况是,每次迭代a = 2b -1,这样,迭代后,r= b-1。如果a小于2N,这样大约需要 4N次迭代。而考虑Stein算法,每次迭代后,显然AN+1BN+1≤ ANBN/2,最大迭代次数也不超过4N次。也就是说,迭代次数几乎是相等的。但是,需要注意的是,对于大素数,试商法将使每次迭代都更复杂,因此对于大素数Stein将更有优势。

stein算法实现:

unsigned int gcd(unsigned int a,unsigned int b){ 
if(!a) return b; 
else if(!b) return a; 
if(~a&0x1 && ~b&0x1) return 2*gcd(a>>1,b>>1); 
else if(~a&0x1 && b&0x1) return gcd(a>>1,b); 
else if(a&0x1 && ~b&0x1) return gcd(a,b>>1); 
else if(a>b) return gcd(a-b,b); 
else return gcd(b-a,a); 
}

 

links

en.wikipedia.org/wiki/Binary_GCD_algorithm

http://hi.baidu.com/cxh198412/blog/item/9977f8668628b121ab184caa.html

http://baike.baidu.com/view/3993128.htm

 

分享到:
评论

相关推荐

    计算机网络安全实验 stein算法实验+javaweb演示程序

    在这个实验中,我们关注的是Stein算法及其在网络安全中的应用,以及如何通过Java Web技术来实现和演示这一概念。 Stein算法是一种基于密码学的加密方法,它在信息安全中扮演着重要角色。该算法通常用于数据加密,...

    最大公约数算法欧几里德和stein

    用c#实现的最大公约数算法欧几里德和stein,递归和非递归的都有了,stein算法在大数方面比欧几里德要好些

    C#,最大公约数(GCD)斯坦因(Stein)算法的源代码

    Stein算法是一种计算两个数最大公约数的算法,是针对欧几里德算法在对大整数进行运算时,需要试商导致增加运算时间的缺陷而提出的改进算法。欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际...

    不同方案求解最大公约数及时间复杂度分析

    本文总结了四种不同的方案来求解最大公约数:暴力枚举法、欧几里得算法、更相减损法和Stein算法,并对它们的时间复杂度进行了分析。 暴力枚举法 暴力枚举法是一种简单的方法,通过从较小的数字开始枚举,找到第一...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    9.6.2 计算最大公约数算法一一Stein算法 288 9.6.3 计算最大公约数示例 289 9.7 最小公倍数 290 9.8 素数 292 9.8.1 素数概述 292 9.8.2 计算素数算法 292 9.9 回文素数 294 9.9.1 回文素数概述 294 9.9.2 ...

    两种最大公约数算法的量化分析

    为了验证Euclid算法和Stein算法在高精度条件下的真实运行效率,以随机生成的多组高精度正整数,并分别按同位、异位、完全随机、斐波那契数列相邻项4种情况对这两种最大公约数算法的平均执行效率进行比较。...

    ACM算法整理-2018-12-21

    在“数学相关”部分,文档首先涉及了最大公约数(GCD)和最小公倍数(LCM)的算法,包括著名的欧几里得算法,以及更为高效的时间复杂度为O(log(max(a,b)))的Stein算法。素数相关算法是另一个重点,文档提到了普通...

    求最大公约数和最小公倍数

    本文将详细介绍两种常用的计算最大公约数和最小公倍数的方法,即欧几里得算法和Stein算法,并提供了相应的C语言代码。 1. 欧几里得算法 欧几里得算法是一种传统的计算最大公约数的方法,它基于相除法来计算两个...

    《C++程序设计》课后习题解答(第二版)

    Stein算法,又称辗转相除法或欧几里得算法的优化版本,用于高效地求解两个整数的最大公约数。移位法是Stein算法的一种实现,利用位操作减少计算次数,是理解计算机底层运算机制的好例子。 总的来说,《C++程序设计...

    acm 算法编程代码模板

    - **Stein算法**:也称为二进制GCD算法,其时间复杂度为O(log(max(a,b))),比欧几里得算法更高效。 - **最小公倍数**:通常可以通过两数之积除以它们的最大公约数来得到。 2. **素数相关**: - **普通素数判断**...

    acm 算法模板 适合初学者使用

    - **Stein算法求最大公约数**:一种高效的计算最大公约数的方法。 - **最长递增子序列**:动态规划问题,常见算法实现时间复杂度为O(n log n)。 - **判断图中同一直线的点的最大数量**:可以通过向量或斜率来判断点...

    最大公约数

    求两个数的最大公约数,使用了Stein算法和欧几里得算法

    ACM中的数学问题_林舒.ppt

    Stein算法是另一种计算最大公约数的算法,渐近时间、空间复杂度均与欧几里德算法相同。 ``` r ← 0 while b > 0 do if a偶,b偶 then a ← a >> 1 b ← b >> 1 r ← r + 1 else if a偶,b奇 then a ← a >> 1 ...

    graphcut_all.rar_graphcut_graphcut_all_matlab graphcut_分割图片_图片分割

    最后,通过Karger-Stein算法或其他高效的最小割算法找到使得总割成本最小的割。 2. **Matlab实现**:在Matlab中,GraphCut通常通过构造像素相似度矩阵和区域连接约束矩阵来实现。相似度矩阵反映像素的颜色、纹理等...

    實驗三 ARM Assembly II1

    Stein算法是一种优化的欧几里得算法,用于计算两个非负整数的最大公约数。在这个实验中,要求使用递归方法和栈来传递参数,而不是只使用寄存器。学生需要在代码中声明变量`m`和`n`,并实现`GCD`函数。此外,还需要...

    数论zstu shulun

    3. Stein算法,适用于二进制数,通过简化计算过程提高效率。 **三、欧拉定理** 1. 欧拉函数PHI(x)表示小于等于x且与x互质的正整数个数。例如,PHI(8) = 4。 2. 欧拉定理表明,如果a和m互质,那么a^PHI(m) ≡ 1 ...

    6%%-第6章 数学问题.ppt

    Stein算法,也称为二进制减法GCD算法,是一种更高效的计算最大公约数的方法,避免了除法和取模运算,提高了计算效率。算法通过一系列位操作逐步缩小待求解的数对,直到找到最大公约数。 在素数的概念中,素数是只有...

    数学问题PPT学习教案.pptx

    - **Stein算法**:也称二进制GCD算法,通过位运算来求GCD,效率比欧几里德算法更高,不涉及除法和取模运算。 6. **素数**: 素数是只能被1和自身整除的正整数,1不是素数。判断一个数N是否为素数通常采用试除法,...

Global site tag (gtag.js) - Google Analytics