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

2023-05-16

一、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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Win10 快捷键大全(史上最全)

    windows 10常用快捷键 win10正式版是微软续已发布的Windows系统的最新版操作系统 windows10 win10正式版 让人感到最意外的就是直接跳过了win9 那么今天我为大家讲解他推出的常用快捷键 希望能够帮到大家 复制
  • clash配置只代理某一个网站

    1 如果你已经导入了某一个订阅 xff0c 右键edit 2 在rules里配置 例如 xff1a 配置只代理域名为aa com开头的网站 DOMAIN SUFFIX aa com proxy1 参数说明 xff1a DOMAIN SUFF
  • bash/tcsh实现回收站(rm -rf 血的教训)

    rm rf 慎用 命令敲得多了 xff0c 常在河边走 xff0c 难免会湿鞋 昨天 xff0c 一个手误 xff0c 敲错了命令 xff0c 把原本想要留的文件夹给rm rf掉了 几天心血全木有了 xff0c 靠 xff0c 死的心都有了
  • Windows远程连接Ubuntu (远程桌面和XDMCP)

    从 RHEL CentOS 转过来 xff0c 几乎所有的编码都在 windows 下 xff0c 不习惯原生 linux 开发 总结了远程连接的两种方式 xff0c 一种用 Windows 自带的 rdp 协议 xff0c 另外一种用 x
  • Linux启动java程序很慢

    Linux启动java程序很慢 xff0c 原因有很多 网上的解决方式也很多 1 修改jre配置参数 xff08 尝试无效 xff0c 可能场景不一 xff09 JAVA HOME jre lib security java securit
  • MySQL数据库备份的几种方式

    MySQL备份的几种方式 最近一直想写点博客 xff0c 但是不知道写什么 xff0c 感觉自己最近的知识没有什么增加 xff0c 今天想到了一篇可以写的博客 以前试过根据data文件夹备份MySQL xff0c 但是从来没有成功过 xff
  • 【docker】深入探讨container,通过container生成image

    深入探讨container 对于上图的理解 image其实是由一层一层的layer来组成的 最底层基于linux内核在上面加了一层一层的layer 从docker仓库pull的image是由Dockerfile来生成 这个image是只读的
  • 创建表时附带的ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic 的解释

    ENGINE 61 InnoDB DEFAULT CHARSET 61 utf8 COLLATE 61 utf8 general ci ROW FORMAT的解释 1 示例 CREATE TABLE 96 student 96 96 id
  • c语言编程“水仙花数”

    文章目录 打印所有的水仙花数 所谓的 水仙花数 是指一个三位数 xff0c 其各位数字的立方和等于该数本身 例如 xff0c 153是水仙花数 xff0c 因为153 61 1 3 43 5 3 43 3 3 打印所有的水仙花数 所谓的 水
  • inux查看日志的几种方法

    linux 日志查看 tail head cat tac sed less echo 1 命令格式 tail 必要参数 选择参数 文件 f 循环读取 q 不显示处理信息 v 显示详细的处理信息 c lt 数目 gt 显示的字节数 n lt
  • asp不能正常用的原因

    前几天做网站时 xff0c 机子出现了这种症状 xff0c 重装过IE和IIS一样也无法解决 xff0c 在百度里找了一下 xff0c 下面的方法真的很适用 症状 xff1a 运行asp程序 包括其他动态网页程序 出现500内部错误信息 x
  • 用DLL实现把数据库的记录导出到EXCEL中(VB)

    39 新建一个ActiveX DLL工程工程名为DbToExcel 39 工程 gt 引用 引用Microsoft ActiveX Data Objects 2 6 Library 39 Microsoft Excel 9 0 Object
  • MySQL转换为SqlServer数据库

    如何将MySQL数据导入到SqlServer中 xff0c 请看以下步骤 xff1a 1 安装mysql数据库的ODBC驱动 xff0c mysql connector odbc 3 51 19 win32 msi 2 打开控制面板管理工具
  • DataTimePicker数据绑定遇到Null时异常的原因

    DateTimePicker1 DataBindings Add 34 Value 34 bindingSource1 34 assessortime 34 如果字段 assessortime的值 为 null 时 就会出现异常 后来发现
  • c#中DataTable与实体集合相互转换

    以下是将集合类转换成DataTable lt summary gt 将集合类转换成DataTable lt summary gt lt param name 61 34 list 34 gt 集合 lt param gt lt return
  • 用Linux命令行生成随机密码的十种方法

    转载自 极客范 xff0c 不得不夸夸强大的Bash啊 xff01 xff01 xff01 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • C++20 Ranges

    VS2019 C 43 43 20的Ranges 01 引入范围的动机02 范围 ranges 03 range v3库04 C 43 43 20 range demo 01 引入范围的动机 C 43 43 17以前的标准库中大多数通用算法
  • 面向对象分析设计步骤

    一 创建用例 初步确定用例 xff1a 1 确定参与者 2 确定用例 xff08 系统操作 xff09 3 确定参与者与用例之间的关系 用例细节描述 xff1a 1 用例名称 2 操作详细描述 3 前置条件描述 4 部署约束 5 正常事件流
  • collect2: ld terminated with signal 9 错误解决办法

    编译android是出现如下错误 xff1a target Java CameraEffectsTests out target common obj APPS CameraEffectsTests intermediates classe
  • 浅谈Stein算法求最大公约数(GCD)的原理及简单应用

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