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整除
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算法(求两个数最大公约数)相关推荐
- 埃拉托色尼筛选法c语言求最大公约数,用埃拉托色尼筛算法求两个数最大公约数C++的实现...
#include "stdafx.h" #include "iostream" #include #include //使用埃氏筛选法求最大公约数 void s ...
- 算法:求两个数最大公约数
算法:求两个数最大公约数 原来这是欧几里德先生的发明,无知了,在此记录. #Python 求两数最大公约数 def gcd(a,b):if b == 0:return areturn gcd(b,a% ...
- 如何求两个数最大公约数
一.程序描述 求两个数最大公约数,可以用四种方法,分别是暴力穷举法(不适用于大数字).辗转相除法(线性代数).更相减损法(九章算术).stein算法(Stein算法跟更相减损术很像,而且只有比较.移位 ...
- python两个自定义函数_Python自定义函数实现求两个数最大公约数、最小公倍数示例...
本文实例讲述了Python自定义函数实现求两个数最大公约数.最小公倍数.分享给大家供大家参考,具体如下: 1. 求最小公倍数的算法: 最小公倍数 = 两个整数的乘积 / 最大公约数 所以我们首先 ...
- C语言求两个数最大公约数和最小公倍数
1.求两个数的最大公约数 1.1 普通实现方法 #include<stdio.h> int main() {int a = 0;int b = 0;scanf("%d %d&q ...
- c语言如何求两个数最大公约数,c语言如何求两个数的最大公约数
c语言求两个数的最大公约数的方法:首先新建一个C语言源程序,并直接输入两个正整数a和b:然后取a,b这两个数中的较小值,存放到变量n中:接着从两个数a和b中的较小数开始,依次逐个减小1:.最后点击工具 ...
- 求两个数的公约数java_java中怎样求两个数的最大公约数?
方法一:(辗转相除法) 设用户输入的两个整数为n1和n2且n1>n2,余数=n1%n2.当余数不为0时,把除数赋给n1做被除数,把余数赋给n2做除数再求得新余数,若还不为0再重复知道余数为0,此 ...
- python求两个数的最大公约数和最小公倍数_Python求两个数最大公约数、最小公倍数...
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python写函数求两个数最小公倍数_Python自定义函数实现求两个数最大公约数、最小公倍数示例...
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
最新文章
- partial 分布类
- linux gotoxy(int x, int y)
- php odbc连接sqlserver,php pdo连接sqlserver配置
- python创建和控制的实体称为_Python eds包_程序模块 - PyPI - Python中文网
- 常用的JavaScript验证正则表达式
- nginx缓存、压缩配置
- mtk平台sensor分析一:alsps框架下的光距感驱动流程
- 6-2 折半查找 (15分)_数据结构实验7_羊卓的杨
- 关爱的艺术 - 致敬疫情前线奋战的医护人员!
- 研究型论文框架及阅读文献方法
- Java基础练习题(逢七跳过、百钱百鸡、不死神兔、复利(利滚利))
- 荣联科技再出发,奏响集成商转型最强音
- [企业权限管理项目](二)环境搭建
- 区块链是如何实现隐私保护的?
- scala 字符串转Int, Long 类型
- php易信短信接口,易信公众平台demo代码php(含验证接口)
- H2 database文档学习
- 评测三款最流行的epub阅读器(Mac适用)
- unity学习笔记-特效篇
- 文件夹无法打开怎么办?
热门文章
- oracle数据库中分析函数大全,Oracle数据库的分析函数
- javascript 校验 非空_Javascript的表单与验证-非空验证
- 大顶堆删除最大值_C++|使用STL算法创建、调整、输出最大堆、最小堆
- 远程桌面连计算机名称变ipv6,利用ipv6,从家里远程连接到学校的电脑上
- python文件是怎么写_python头文件怎么写
- mfc打开一个.txt文件并进行处理_文件处理方法Python
- qt 将int型数据显示在文本框_Qt编写Online judge爬虫
- mat 和asmatrix的区别_R语言的稀疏矩阵太大可能就不能用as.matrix了
- linux有哪些实时同步工具,rsync文件同步工具常见模式有哪些?linux系统
- python爬虫隐藏ip_Python3网络爬虫之使用User Agent和代理IP隐藏身份