用欧几里得算法求gcd确实很方便,但是对于求大整数的gcd的情况下却很慢(因为要取模)


stein算法的时间空间复杂度都和欧几里得相同,而且只需要位移和加减求可以实现,在常数方面更为优秀。

原理: g c d ( k a , k b ) = k ∗ g c d ( a , b ) gcd(ka,kb)=k*gcd(a,b) gcd(ka,kb)=k∗gcd(a,b)

设x,y为非0奇数,有以下结论:

  1. g c d ( x , 0 ) = x gcd(x,0)=x gcd(x,0)=x
  2. g c d ( 2 x , 2 y ) = 2 g c d ( x , y ) gcd(2x,2y)=2gcd(x,y) gcd(2x,2y)=2gcd(x,y)
  3. g c d ( 2 x , y ) = g c d ( x , y ) gcd(2x,y)=gcd(x,y) gcd(2x,y)=gcd(x,y)
  4. g c d ( x , y ) = g c d ( ∣ x − y ∣ , m i n ( x , y ) ) gcd(x,y)=gcd(|x-y|,min(x,y)) gcd(x,y)=gcd(∣x−y∣,min(x,y))

很显然,第4个式子两个奇数相减会出来一个偶数,那么就可以继续往下除二了。


#include<bits/stdc++.h>
using namespace std;#define LL long long
LL stein(LL a, LL b) {if(!a)return b;if(!b)return a;if(!(a & 1) && !(b & 1))return stein(a >> 1, b >> 1) << 1;else if(!(a & 1))return stein(a >> 1, b);else if(!(b & 1))return stein(a, b >> 1);return stein(abs(a - b), min(a, b));
}int main() {while(1) {LL a, b;cin >> a >> b;cout << stein(a, b) << "\n";}
}

stein算法(求gcd)相关推荐

  1. 浅谈Stein算法求最大公约数(GCD)的原理及简单应用

    一.Stein算法过程及其简单证明 1.一般步骤: s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k: s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止: ...

  2. stein法求gcd 学习笔记

    原理显然 由于当x,y都为奇数时进行辗转相见 每次减完必有偶数 而偶数最多除log次 那么也最多减log次 复杂度有保证 注:代码未验证 int gcd(int x,int y){int res=1; ...

  3. 求最大公约数和最小公倍数——辗转相除法(欧几里得算法)、更相减损术、stein算法

    辗转相除法-- 辗转相除法求最大公约数的原理: 两个整数其中较小的数 和 两数相除(较大数除较小数)的余数(使用递归)的最大公约数. 辗转相除法求最小公倍数的原理: 两个整数分别除以最大公约数的结果相 ...

  4. Stein算法(求两个数最大公约数)

    欧几里德算法是计算两个数最大公约数的传统算法,他无论从理论还是从效率上都是很好的.但是他有一个致命的缺陷,这个缺陷只有在大素数时才会显现出来. 考虑现在的硬件平台,一般整数最多也就是64位,对于这样的 ...

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

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

  6. 求最大公约数与最小公倍数 (辗转相除法+更相减损法+Stein算法)

    辗转相除法与更相减损法对比: (1)两者都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显 ...

  7. 【最大公约数 GCD】 --- 常用四大算法(辗转相除法,穷举法,更相减损法,Stein算法)

    [最大公约数 GCD] --- 常用的四大算法 1. 辗转相除法(又名欧几里德算法) 2. 穷举法(也称枚举法) 3. 更相减损法 (又名辗转相减法) 4. Stein算法 1. 辗转相除法(又名欧几 ...

  8. 离散数学/初等数论:用“质因子分解法”和“欧几里得算法”求最大公约数gcd;“质因子分解法”和“最简算法”求最小公倍数lcm;以及对“意义”的一些看法。

    需要在开头提前说明,本篇文章仅仅用于在学习初等数论或者离散数学时候对算术基本定理的理解,实际应用的时候把结论告诉大家,想求最大公约数就用欧几里得算法是最简单的,在本篇不再赘述,有机会我会在其他文章中说 ...

  9. 【原创】更相减损术 stein算法 欧几里得算法 拓展欧几里得算法 扩展欧几里得算法 逆元的计算与筛法 解模线性方程

    欧几里得 说在前面 数论学复习 Part 6. 然后再来一章CRT和组合数,就飞往概率,以此为跳板去向DP. 计划很美啊你. P.S. 这么说来拉格朗日插值可以说是数论学复习的Part 0了啊. 有一 ...

最新文章

  1. CPA、CPS、CPM、CPT、CPC 是什么
  2. mysql order by 日期_mysql order by基于时间的盲注
  3. 图片和文件上传js剖析
  4. 怎么在github上下载项目_Github上Top20 Python与机器学习开源项目汇总
  5. python 最麻烦的时间有药了
  6. applicationhostconfig
  7. 基数树(radix tree)
  8. 烂泥:学习ssh之ssh隧道应用
  9. **inline**与**volatile**关键字
  10. java jxls_java使用jxls导出Excel
  11. confluence挖矿病毒(kdevtmpfsi 、solrd)解决
  12. 一个计算机台式机的组装方案,组装机电脑配置推荐_台式组装机电脑配置推荐-系统城...
  13. 华为服务器基本功能介绍 及服务器BMC提供的基本功能
  14. java media player 设置音量_SoundPlayer可调音量 - c#
  15. 办公软件使用学习笔记:excel第四节。excel美化表格(智能表格,美化套路)。图表数据动态显示,迷你图、条件格式、动态图表、
  16. Excel表格 |两列数据(多列)合并一列且自动换行
  17. 简明扼要的概述微服务设计原则,深入开发微服务,就从今天开始
  18. 游戏必备组件_一款Beta版游戏周销量 30 万份,独立游戏究竟有多火?
  19. MFC使用Haru free pdf lib生成pdf文件
  20. R语言怎么写积分_会员积分规则怎么写?

热门文章

  1. 安防智能视频平台EasyCVR后台界面流量统计显示问题的优化
  2. 华南理工计算机基础知识题,华南理工大学计算机复试经验(双非跨考)复试真题...
  3. 远程桌面连接出错「用户账户限制会阻止你登录...」
  4. 安装Windows10系统,磁盘MBR格式转换为GPT格式
  5. 更多内容请关注今日头条
  6. Fastjson介绍
  7. WSingle主题 – 支持多本的WordPress小说主题,美观大方,功能强大
  8. python爬ppt和风景_Python小工具爬取PPT模板
  9. JAVA的四种引用类型的作用——强引用、软引用、弱引用、虚引用
  10. M1芯片的MacBook Pro打开软件闪退解决方法