一、Stein算法过程及其简单证明

1.一般步骤:

s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k;
s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止;
s3:用更相减损法(辗转相减法),即GCD(a,b)=GCD(a-b,b),或辗转相除法求出两奇数的最大公约数d;
s4:原来两数的最大公约数即为d*k;

2.简单证明:

s1:即为求出两数为2的幂次方的最大公因数k;
s2:当化简后两数一奇一偶时,显然奇数是不含偶数因子的,那么另一化简后偶数的所有偶数因子都不可能为原来两数的最大公因数的因子;
s3:求出原来两数不为2的幂次方的最大公因数d;
s4:最大公因数即为2的幂次方的最大公因数k乘以不为2的幂次方的最大公因数d;

3.Stein算法的优点:

欧几里得算法在处理较小数字时优势是明显的,但对于大整数时,高精度的整除和取余运算就显得非常复杂,所以Stein算法的优点就在于只需要进行移位(位运算)和减法操作,处理高精度GCD问题时相对简便;

4.相关位运算符的简单介绍:

(1)按位与(&):

a&x为对数a的二进制形式的取位操作,即去a二进制形式的第x位。这里有一个重要应用就是a&1可以用于判断数a的奇偶性,即a末位为0即为偶数,末位为1即为奇数。

(2)异或运算(^):

具体介绍参考之前的随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8298554.html;
应用为交换两数:a^=b,b^=a,a^=b即完成了两数交换。

(3)按位左移(<<):

a<<=x即为使a乘以2的x次幂,原理是让a的二进制形式左移x位;应用为对与2的幂次方相乘使运算更快更方便;

(4)按位右移(>>):

a>>=x即为使a除以2的x次幂,原理是让a的二进制形式右移x位;应用为对与2的幂次方相除使运算更快更方便;

5.一般代码:

(1)递归形式:

int stein(int a,int b){if(a<b) a^=b,b^=a,a^=b;        //交换,使a为较大数; if(b==0)return a;                    //当相减为零,即两数相等时,gcd=a; if((!(a&1))&&(!(b&1))) return stein(a>>1,b>>1)<<1;   //s1,注意最后的左移,在递归返回过程中将2因子乘上;else if((a&1)&&(!(b&1)))return stein(a,b>>1);            //s2;else if((!(a&1))&&(b&1))return stein(a>>1,b);else return stein(a-b,b);                                             //s3;
} 

(2)迭代形式:

int stein(int a,int b){int k=1;        while((!(a&1))&&(!(b&1))){    //s1;k<<=1;                          //用k记录全部公因子2的乘积 ;a>>=1;                         b>>=1;} while(!(a&1))a>>=1;              //s2;while(!(b&1))b>>=1;if(a<b) a^=b,b^=a,a^=b;        //交换,使a为较大数; while(a!=b){                           //s3;a-=b;if(a<b) a^=b,b^=a,a^=b;   } return k*a;
}

转载于:https://www.cnblogs.com/COLIN-LIGHTNING/p/8425484.html

浅谈Stein算法求最大公约数(GCD)的原理及简单应用相关推荐

  1. 四种算法求最大公约数

    四种算法求最大公约数(C++) 一. 实验目的 明确算法的概念和特点. 通过对问题的分析,设计合理的算法解决问题: 二. 实验内容 运行最大公约数的常用算法,并进行程序的调式与测试,要求程序设计风格良 ...

  2. C语言求最大公约数GCD的算法(附完整源码)

    C语言求最大公约数GCD的算法 C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) C语言求最大公约数GCD的算法完整源码(定义,实现,main函数测试) #include < ...

  3. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法

    黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...

  4. 255.0.0.0子网掩码相应的cidr前缀表示法是?_【洛谷日报#246】浅谈表达式的求值(Vol.2 进阶)...

    Warning 在观看本博客之前,请保证自己理解了表达式的三种表达方式. 本文旨在让大家更深层次的了解表达式,基础的知识就是上方的链接中所写的.所以,在了解后缀表达式的运算原理之后,我将不会讲述类似的 ...

  5. 浅谈PPO算法-玩转月球登陆

    浅谈PPO算法-玩转月球登陆 前言 github 什么是Actor-Critic? Actor-Critic代码 ppo算法 实现 前言 总感觉强化学习公式真难学,也难表达心中所想,我还是白话强化学习 ...

  6. 浅谈:飞鸽传书 的TCP/IP原理

    浅谈:飞鸽传书 的TCP/IP原理,adj  兴趣浓厚的 飞鸽传书:见闻广博的,博识的he is hot in mathematics and chemistry  (他数学和化学极好.)复合词语ho ...

  7. laytpl语法_浅谈laytpl 模板空值显示null的解决方法及简单的js表达式

    浅谈laytpl 模板空值显示null的解决方法及简单的js表达式 laytpl 模板语法 {{ d.field }} 输出一个普通字段,不转义html 官方的说明 但d.field 为空时会显示nu ...

  8. Java实例15 - 求最大公约数 gcd 辗转相除 欧几里德算法

    /** * 辗转相除法求最大公约数又叫欧几里德算法 * 它的依据是公理gcd(n,m) = (m, n%m) */ package al; public class Gcd { public stat ...

  9. stein算法(求gcd)

    用欧几里得算法求gcd确实很方便,但是对于求大整数的gcd的情况下却很慢(因为要取模) stein算法的时间空间复杂度都和欧几里得相同,而且只需要位移和加减求可以实现,在常数方面更为优秀. 原理: g ...

最新文章

  1. 【转】如何使用VS 2013发布一个可以在Windows XP中独立运行的可执行文件
  2. mysql中index的作用,在mysql中使用INDEXES有什么好处?
  3. Eclipse中新建jsp提示The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
  4. Codeforces 1276C/1277F Beautiful Rectangle (构造)
  5. 解决ios10以上H5页面手势、双击缩放问题
  6. Oracle数据库的状态查询
  7. html中加粗的字体如何改细,css怎么把字体变细?
  8. 请问我应该怎么做,才能让前端的基础打牢固?
  9. Elasticsearch与SpringBoot整合 High-level-client-rest
  10. python网络虫营销_python与sem,大数据降低竞价推广成本利器
  11. ExtJs6 combo下拉框分页、提示、换行提示等增强功能
  12. superpixels(超像素)
  13. gridview 实现排序
  14. Pthread多线程
  15. centos 7.6上面安装向日葵远程连接软件
  16. 介绍几个巨佬给大家认识
  17. 一、Photoshop新版本(2019以后)常用快捷键总结、归纳
  18. 以二叉链表为存储结构, 试编写计算二叉树中叶子结点数目的递归算法.
  19. 论文笔记--InterFusion
  20. ps2口键盘改usb计算机设置,轻松把PS2键盘、鼠标接口改造成USB接口

热门文章

  1. mybatis 多表查询-多对多
  2. SQLAlchemy 基本使用
  3. Python 装饰器@functools.wraps(func)
  4. c++ 类和对象的内存管理
  5. C++语言类的多态介绍和示例
  6. 给机器人罗宾写一封英语回信_近10年高考英语书面表达真题及范文大汇总! 把握高考命题新趋势!...
  7. 杉岩数据:5种常见容灾复制技术图解
  8. Java Web学习总结(23)——Distributed Configuration Management Platform(分布式配置管理平台)
  9. python数据库操作封装_Python 封装一个操作mysql的类
  10. springmvc往html设置变量,SpringMVC:@MatrixVariable矩阵变量