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

考虑现在的硬件平台,一般整数最多也就是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整除

C++/实现
// c++stein 算法
int gcd(int a,int b){
    if(ab{
        int temp = a;
        a = b;
        b=temp;
    }
    if(0==b)//the base case
        return a;
    if(a%2==0 && b%2 ==0)//a and b are even
        return 2*gcd(a/2,b/2);
    if ( a%2 == 0)// only a is even
        return gcd(a/2,b);
    if ( b%2==0 )// only b is even
        return gcd(a,b/2);

return gcd((a+b)/2,(a-b)/2);// a and b are odd

}

Stein算法(求两个数最大公约数)相关推荐

  1. 埃拉托色尼筛选法c语言求最大公约数,用埃拉托色尼筛算法求两个数最大公约数C++的实现...

    #include "stdafx.h" #include "iostream" #include #include //使用埃氏筛选法求最大公约数 void s ...

  2. 算法:求两个数最大公约数

    算法:求两个数最大公约数 原来这是欧几里德先生的发明,无知了,在此记录. #Python 求两数最大公约数 def gcd(a,b):if b == 0:return areturn gcd(b,a% ...

  3. 如何求两个数最大公约数

    一.程序描述 求两个数最大公约数,可以用四种方法,分别是暴力穷举法(不适用于大数字).辗转相除法(线性代数).更相减损法(九章算术).stein算法(Stein算法跟更相减损术很像,而且只有比较.移位 ...

  4. python两个自定义函数_Python自定义函数实现求两个数最大公约数、最小公倍数示例...

    本文实例讲述了Python自定义函数实现求两个数最大公约数.最小公倍数.分享给大家供大家参考,具体如下: 1. 求最小公倍数的算法: 最小公倍数  =  两个整数的乘积 /  最大公约数 所以我们首先 ...

  5. C语言求两个数最大公约数和最小公倍数

    1.求两个数的最大公约数 1.1  普通实现方法 #include<stdio.h> int main() {int a = 0;int b = 0;scanf("%d %d&q ...

  6. c语言如何求两个数最大公约数,c语言如何求两个数的最大公约数

    c语言求两个数的最大公约数的方法:首先新建一个C语言源程序,并直接输入两个正整数a和b:然后取a,b这两个数中的较小值,存放到变量n中:接着从两个数a和b中的较小数开始,依次逐个减小1:.最后点击工具 ...

  7. 求两个数的公约数java_java中怎样求两个数的最大公约数?

    方法一:(辗转相除法) 设用户输入的两个整数为n1和n2且n1>n2,余数=n1%n2.当余数不为0时,把除数赋给n1做被除数,把余数赋给n2做除数再求得新余数,若还不为0再重复知道余数为0,此 ...

  8. python求两个数的最大公约数和最小公倍数_Python求两个数最大公约数、最小公倍数...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. python写函数求两个数最小公倍数_Python自定义函数实现求两个数最大公约数、最小公倍数示例...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

最新文章

  1. partial 分布类
  2. linux gotoxy(int x, int y)
  3. php odbc连接sqlserver,php pdo连接sqlserver配置
  4. python创建和控制的实体称为_Python eds包_程序模块 - PyPI - Python中文网
  5. 常用的JavaScript验证正则表达式
  6. nginx缓存、压缩配置
  7. mtk平台sensor分析一:alsps框架下的光距感驱动流程
  8. 6-2 折半查找 (15分)_数据结构实验7_羊卓的杨
  9. 关爱的艺术 - 致敬疫情前线奋战的医护人员!
  10. 研究型论文框架及阅读文献方法
  11. Java基础练习题(逢七跳过、百钱百鸡、不死神兔、复利(利滚利))
  12. 荣联科技再出发,奏响集成商转型最强音
  13. [企业权限管理项目](二)环境搭建
  14. 区块链是如何实现隐私保护的?
  15. scala 字符串转Int, Long 类型
  16. php易信短信接口,易信公众平台demo代码php(含验证接口)
  17. H2 database文档学习
  18. 评测三款最流行的epub阅读器(Mac适用)
  19. unity学习笔记-特效篇
  20. 文件夹无法打开怎么办?

热门文章

  1. oracle数据库中分析函数大全,Oracle数据库的分析函数
  2. javascript 校验 非空_Javascript的表单与验证-非空验证
  3. 大顶堆删除最大值_C++|使用STL算法创建、调整、输出最大堆、最小堆
  4. 远程桌面连计算机名称变ipv6,利用ipv6,从家里远程连接到学校的电脑上
  5. python文件是怎么写_python头文件怎么写
  6. mfc打开一个.txt文件并进行处理_文件处理方法Python
  7. qt 将int型数据显示在文本框_Qt编写Online judge爬虫
  8. mat 和asmatrix的区别_R语言的稀疏矩阵太大可能就不能用as.matrix了
  9. linux有哪些实时同步工具,rsync文件同步工具常见模式有哪些?linux系统
  10. python爬虫隐藏ip_Python3网络爬虫之使用User Agent和代理IP隐藏身份