介绍

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

欧几里得算法(辗转相除法)缺陷

欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际效率上都是很好的。但是却有一个致命的缺陷,这个缺陷在素数比较小的时候一般是感觉不到的,只有在大素数时才会显现出来。

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

基本原理

1.gcd(a,a)=a:一个数和其自身的最大公约数仍是其本身

2.gcd(ka,kb)=k*gcd(a,b):最大公约数运算和倍乘运算可以交换,取特殊值k=2时,说明两个偶数的最大公约数必然能被2整除

3.gcd(ka,b)=gcd(a,b):当ka与b互为质数时,约掉两个整数中只有其中一个整数含有的因子时,不会影响这两个数的最大公约数。取特殊值k=2时,说明求一个偶数和一个奇数的最大公约数时,可以先将偶数除以2

(插入概念:互为质数 一般指互质数。 互质数为数学中的一种概念,即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数。)

算法步骤

1.设整数A,B

2.若A=B,最大公约是就是其本身

3.若A=0, B就是最大公约数;反之亦然

4.若A,B都是偶数,最大公约数:2*gcd(A/2,B/2)

5.若A为even、B为odd,最大公约数为:gcd(A/2,B);反之亦然

6.若AB都是odd,使用更相损减法:gcd(abs(a-b),min(a,b));由于AB为odd,A-B必然为一个偶数,于是跳转第五步,优化为:gcd(abs(a-b)/2,min(a.b))

代码实现

#include<stdio.h>
#include<stdlib.h>                                //包含abs函数
#define MIN(a,b) a < b ? a : b
int gcd(int n, int m)
{if (n == m){return n;}if (n == 0){return m;}if (m == 0){return n;}if (n % 2 == 1){if (m % 2 == 1){return gcd(abs(n-m) / 2, MIN(n, m));}else{return gcd(n, m / 2);}}else{if (m % 2 == 1){return gcd(n / 2, m);}else{return 2 * gcd(n / 2, m / 2);}}
}
int main()
{int n = 0, m = 0;scanf("%d %d", &n, &m);printf("%d", gcd(n, m));return 0;
}

优化代码

通过位移运算符达到提高运算速度的效果:因为位移运算符直接作用于二进制补码,所以速度会提高很多

#include<stdio.h>
#include<stdlib.h>
#define MIN(a,b) a < b ? a : b
int gcd(int n, int m)
{if (n == m){return n;}if (n == 0){return m;}if (m == 0){return n;}if (n % 2 == 1){if (m % 2 == 1){return gcd(abs(n - m) >> 1, MIN(n, m));}else{return gcd(n, m >> 1);}}else{if (m % 2 == 1){return gcd(n >> 1, m);}else{return  gcd(n >> 1, m >> 1) << 1;}}
}
int main()
{int n = 0, m = 0;scanf("%d %d", &n, &m);printf("%d", gcd(n, m));return 0;
}

学习笔记 Stein算法相关推荐

  1. 【统计学习方法】学习笔记——EM算法及其推广

    统计学习方法学习笔记--EM算法及其推广 1. EM算法的引入 1.1 EM算法 1.2 EM算法的导出 1.3 EM算法在非监督学习中的应用 2. EM算法的收敛性 3. EM算法在高斯混合模型学习 ...

  2. c语言算法有效性,BerForest—C语言学习笔记-《算法》

    这是我学习C语言的笔记,也可以算是回忆录,反正有利于我的学习,也可以让C语言的新手借鉴. 许多人都在盲目的学习编程,其实学习编程无为就是学习一些编程语法.即使学会了,也不一定能够自己独立的编写出程序了 ...

  3. 目标检测学习笔记--DSSD算法

    1. 论文笔记 1.1 YOLO网络结构 论文链接:http://cn.arxiv.org/pdf/1506.02640 1.2 SSD网络结构 论文链接:http://cn.arxiv.org/pd ...

  4. 吴恩达神经网络和深度学习-学习笔记-12-RMSprop算法

    全称是root mean square prop算法 我们假设纵轴方向为b,横轴方向为W.我么希望纵轴slow,横轴fast. 对于第t次迭代,公式如上图. 我们希望W方向fast,B方向slow,所 ...

  5. 【学习笔记】算法101--数学(二)2.3篇

    前言: 学习<算法101>,每天进步一点点,加油

  6. 视频插帧—学习笔记(算法+配置+云服务+Google-Colab)

    恰好碰到同学项目需要,了解了一下关于利用深度学习视频插帧的相关知识,在这里做一个简单的记录. 目录 一.方法+论文 1.DAIN (Depth-Aware Video Frame Interpolat ...

  7. (JAVA学习笔记) 冒泡排序算法

    public class Demo06 {public static void main(String[] args) {int[] arr = {51,512,12,53,415,852,631,8 ...

  8. Fabric学习笔记-PBFT算法

    本文介绍了实用拜占庭容错算法(PBFT). Fabric在v0.6中采用的是PBFT算法,在v1.0.0-preview中是SBFT算法,在v1.0.0-release中文档上说PBFT还在开发中,项 ...

  9. C/C++学习笔记:算法知识之平衡树学习笔记,收藏一波吧!

    平衡树存储: size就是节点的个数. value是节点代表的权值. 权值相同的两个节点被视为一个,num记录折叠数量. rand是随机数,用来维护平衡树. son就是两个儿子. 平衡树size更新: ...

最新文章

  1. php解析ip列表并入库
  2. (0085)iOS开发之OC与JS交互高级用法(JavaScriptCore)
  3. 英伟达RTX 30系列卖得太好,财报业绩创新高,老黄:Arm收购完成时间已确定
  4. 【iOS】图片缩放动画
  5. 实践作业4:Web测试实践(小组作业)每日任务记录3
  6. vb编程转为c语言,C语言,VB编程题
  7. ubuntu:无法将“ubuntu1804.exe”项识别为cmdlet、函数、脚本文件或可运行程序的名称。【已解决】
  8. SSH Secure Shell Client用public key认证登录
  9. java入门学习_Java入门学习进阶知识点
  10. VS2019、VS2017、VS2013产品密钥
  11. Windows自带集成工具对ISO镜像是否源于官方网站的验证
  12. 计算机ip保留地址,ip地址显示为保留地址怎么解决
  13. 中国微型连接器市场趋势报告、技术动态创新及市场预测
  14. 类似 Teambition 的9大最佳项目管理软件
  15. win10本地组策略功能说明
  16. 上海房价地图热传:数据挺新 但不科学
  17. 微信小程序获取手机号并解密详解
  18. visio2013快速入门指南
  19. CLASS 文件反编译后,idea 无法编译情况解决
  20. 非常道-中小软件公司项目管理(3.1 性格测试)

热门文章

  1. SimLab Composer 10 for Mac(3D场景制作软件)
  2. centos7.4 限制用户登录失败次数并锁定用户
  3. From Java To Kotlin - Your Cheat Sheet For Java To Kotlin Edit
  4. 数据分析多元思维模型
  5. 渠道管理-经销商价格数字化管理的思路
  6. python机器学习手写算法系列——逻辑回归
  7. 基于多边形模型接触力(PCM)-接触检测
  8. 算法设计与分析选择题、简答题、证明题整理
  9. kali更新源安装中文输入法
  10. 从flv文件中提取音频并存储为mp3格式