最大公约数的四种方法

2023-05-16

最大公约数的四种方法

  • 前言
  • 1.暴力穷举法
  • 2.辗转相除法
    • 步骤
    • 原理
    • 证明:
  • 3.更相减损法
    • 步骤
    • 原理
    • 证明:
    • 比较
  • 4.stein算法
    • 比较
    • 原理
    • 步骤

前言

求两数的最大公约数,一共有四种方法:暴力穷举法、更相减损法、辗转相除法、stein 算法,小女不才,花了几天的时间终于把这几种方法全部弄明白,现在就把它们全部分享出来。

首先,假设被求的两个数为 x、y,且 x > y。最大公约数 d = gcd (x , y)

1.暴力穷举法

正如名字所说,暴击穷举法就是简单粗暴地把 1~ y(前面已经假设 x > y)都列出来分别判断是否为 x、y 的公约数,然后再找到其中最大的一个。

暴力穷举法最大的特点就是简单直接、很容易理解,但是计算比较繁琐。

2.辗转相除法

辗转相除法是由古希腊数学家欧几里得在其著作《The Elements》中提出的,所以辗转相除法又名欧几里得算法。

步骤

假设要用辗转相除法求 36 和 24 的最大公约数,则要经历以下步骤:

36 ÷ 24 = 1 …… 12
24 ÷ 12 = 2 …… 0
12 为 36 和 24 的最大公约数

先用 x 除以 y
若余数为 0 则 y 为两数的最大公约数;若余数不为零,则令 x = y,y = 余数,重复步骤 1 直到余数为 0,此时的 y 为两数的最大公约数。

原理

相信从上面的阐述中,大家应该可以发现,辗转相除法依赖于一个定理:

两个整数的最大公约数等于其中较小的那个数和两数取模的最大公约数。

即:gcd (x , y) = gcd (y , x % y ) ,其中 x > y。

证明:

设 d = gcd (x , y);
则 x % d = 0 , y % d = 0 ;
则设 x = a * d , y = b * d ;
余数 r = x % y = (a * d) % (b * d) = d * (a % b);
所以 r % d = 0 ;
即 (x % y) % d = 0;
所以 gcd (x , y) = gcd (y , x % y )

3.更相减损法

更相减损法出自《九章算术》,其原理其实与辗转相除法一样,只是辗转相除法将的是相除取余,而更相减损法讲的是相减取差。

步骤

下面先看实例:(还是求36和24的最大公约数)

36 - 24 = 12
24 - 12 = 12
12 是 36 和 24 的最大公约数

即:

x - y = r
若 r = 0 ,则 x = y ,最大公约数为它本身;若 r ≠ 0,则令 x = y 和 r 中较大的一个数 , y = 剩下的另一个数,重复步骤 1 直到 r = 0,此时的 x = y ,即为最大公约数。

原理

从上面的阐述中,大家应该也能发现,更相减损法的原理依赖于下式:

gcd (x , y) = gcd (y , x % y ) ,其中 x > y。

证明:

d = gcd (x , y);
则 x % d = 0 , y % d = 0;
设 x = a *d , y = b * d;
则 r = x - y = a * d - b * d = d * (a - b);
所以 r % d = 0;
即 (x - y) % d = 0;
所以 gcd (x , y) = gcd (y , x - y);

比较

这里我们可以将更相减损法和辗转相除法进行比较:

将上面两个实例中的式子稍稍变形:
辗转相除法 36 = 24 + 12 ; 24 = 12 * 2
更相减损法 36 = 24 + 12 : 24 = 12 + 12

可以看到,两种方法的本质并无太大差别,从代码上看,两种方法也十分相似。只是当比较的两数差值比较大时,可能要进行多次减法才能达到一次除法的效果。

我们可以分别用以上两种方法计算一下 1997 和 615 的最大公约数,看看哪个计算次数更少。

辗转相除法:
在这里插入图片描述

更相减损法:
在这里插入图片描述

我们可以看到,当两数差值比较大时,辗转相除法计算的次数明显比更相减损法少。

4.stein算法

stein 算法就是那个我看了很久才看明白的算法……

比较

网络上很多人把 stein 算法与辗转相除法相比较。因为在 stein 算法之前,人们更常用的是辗转相除法,但是辗转相除法虽然相较暴力穷举法和更相减损法更高效,但是辗转相除法也有它的弊端。

简单地说就是当要计算的两个数很大很大很大很大很大很大的时候,除法运算就变得十分复杂,消耗很多时间,这时候一种不需要除法取模的 stein 算法就应运而生了。

之所以把 stein 算法放在更相减损法之后,是因为 stein 算法和更相减损法有相似之处。

在《九章算术》中,更相减损法的思想是:

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

简单地说就是能折半(除以2)的就折半,不能折半就相减,直到减数与差相等为止。

而 stein 算法则要利用移位和相减来实现求最大公约数。
在这里插入图片描述

其实 stein 算法在常规的计算中并不占优势,但是由于按位运算相对除法和取模运算更简便,所以当所求的数很大很大很大很大的时候,stein 算法就相对更简单啦~

当然,我们在对常规的数字求最大公约数的时候,还是推荐使用辗转相除法和更相减损法。

运算符
首先我们要先把stein 运算中涉及到的相关运算符进行简单介绍。

Ps:以下这些运算符在《【手把手带你入门】初识C语言》一文中的操作符一节进行了介绍,这里仅根据需要进行简单介绍,需了解详情请点击文章名字跳转。

&
这里 & 的作用就是利用 x & 1 来判断 x 的奇偶性。

如上图,因为 &(相与)是只要有0则为0,所以我们可以得到

偶数 & 1 = 0 ;
奇数 & 1 = 1 ;

移位操作符
(<<)左移和(>>)右移是C语言中的移位操作符,在这里,我们求的是两个数的最大公约数,我们计算的数都是正整数。

以实际的数 6 为例子:

6 的二进制数是……… 0110 (暂时只写出4位)
6<<1 即往左移1位变为1100
转换为十进制数是 12,而 12 = 6 * 2;
6 >>1 即往右移1位变为0011
转换为十进制数是 3,而 3 = 6 / 2;

那如果是 5 呢?

5 的二进制数是……… 0101 (暂时只写出4位)
5<<1 即往左移1位变为1010
转换为十进制数是 10,而 10 = 5 * 2;
5 >>1 即往右移1位变为0010
转换为十进制数是 2,而 2 = 5 / 2 …… 1;

所以这里我们可以简单地把 <<1 理解为乘 2、>>1 位理解为除 2;x << = a 即为使 x 乘 2a。

原理

弄明白移位之后,我们再来看 stein 算法的基本原理:

gcd (kx , ky) = k * gcd (x , y) ;

上面这个式子大家应该都能看的明白,所以这里就把证明省略啦

步骤

下面我们以20、30为例用 stein 算法求自大公约数:

20、30 均为偶数,20 ÷ 2 = 10,30 ÷ 2 = 15;
10 为偶数、15 为奇数,10 ÷ 2 = 5;
5、15 均为奇数,15 - 5 = 10;
10 为偶数、5 为奇数,10 ÷ 2 = 5;
剩下两数均为 5
则 5 * 2 = 10 是 20 和 30 的最大公约数

stein 算法的步骤:

若两个数都是偶数,则都除 >>1,记录次数;若两数为一奇一偶,则偶数 >>1 ;若两数均为奇数,则相减。
将得到的数重复执行步骤 1 直到得到的两个数相同。
若步骤 1 中两数都曾经 >>1,记录的次数为 n,则步骤 2 中得到的数再乘2n(<<n)即为两数的最大公约数。

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

最大公约数的四种方法 的相关文章

  • 高中生的高效学习法之“纵横术”

    考试的时候 xff0c 你或许遇经常遇到这种情况 xff1a 面对考试题 xff0c 你冥思苦想这个题是哪一章的知识点 xff0c 到底想要考什么 xff1f 或许你知道这个题考的是什么 xff0c 但是由于你对这部分知识掌握不牢而导致还是
  • 学习必备软件:OneNote+Mindmaster完美结合(精彩内容持续更新中…….)

    一 为什么做笔记 xff1f 做笔记应该注意哪些方面 xff1f 1 为什么做笔记 xff1f 做笔记的意义体现在以下几个方面 xff1a xff08 1 xff09 抵抗忘记 根据艾宾浩斯遗忘曲线 xff0c 前一天记住的信息 xff0c
  • 关于数学建模(或科研论文)的画图学习建议

    对于数学建模画图来说 xff0c PPT xff0c visio matlab就够用了 xff0c 其他根据特点备选 首先搞清楚 xff0c 我们需要画的图主要分为两种 xff1a 一是 示意图 xff0c 主要是用于表达思路 xff0c
  • Linux 网桥配置br-lan、eth0、eth1、ra0、rai0

    Linux网关模式下将有线LAN和无线LAN共享网段实现局域网内互联 思路其实很简单 xff1a 就是将虚拟出一个bridge口 xff0c 将对应的有线LAN和无线LAN都绑定在这个虚拟bridge口上 xff0c 并给这个bridge口
  • 用java -jar 命令执行架包时出现了Invalid or corrupt jarfile xxxx.jar

    将一个 java文件打包 jar后 xff0c 需要在META INF目录下的MANIFEST ME中添加Main Class选项 使用命令java jar xxxx jar后出现了Invalid or corrupt jarfile xx
  • 如何用Stata完成(shui)一篇经济学论文(三):基本命令

    目录 变量的生成 gen与egen区别 xff09 变量的删除变量的更改 在开始正式学习前 xff0c 有一个小建议 xff0c 希望大家养成在do file里写代码的习惯 xff0c 主要是方便保存已经写过的代码 xff0c 因为Stat
  • 阿里云服务器ECS入门题库

    Apsara Clouder云计算专项技能认证 xff1a 云服务器ECS入门题库 题库一多选题题库二多选题题库三多选题 保证及格 xff0c 不保证100分 xff01 xff01 xff01 保证及格 xff0c 不保证100分 xff
  • mysql 设置大小写不敏感

    一 原理与参数 mysql大小写敏感配置与两个参数相关 lower case file system 和 lower case table names 查看当前mysql的大小写敏感配置 show global variables like
  • mysql字符集查看与设置

    一 查看 MySQL 字符集 以下命令 Windows amp Linux通用 1 服务器和数据库 mysql gt show variables like 39 char 39 43 43 43 Variable name Value 4
  • WindTerm使用(暂停更新)

    作为一个经常和代码以及服务器打交道的人 xff0c 连接远程服务器所使用的工具肯定是越方便越好 目前 xff0c 我使用的是xshell5和MobaXterm两个 Xshell最新的是7 xff0c 破解版的我懒得去找 xff0c 那xsh
  • 彻底解决[未识别的网络][公共网络]的问题

    未识别的网络 导致网络变成 未知网络 或 公共网络 会造成一系列问题 比如防火墙的一些端口会挡在公共之外 等等 不细说 那么要如何把 未知网络 公用网络 怎么改变为 家庭 和 工作网络 网络的回答比如 百度问题上的回答都是无脑的回答 不可能
  • centos7安装Docker详细步骤(无坑版教程)

    一 安装前必读 在安装 Docker 之前 xff0c 先说一下配置 xff0c 我这里是Centos7 Linux 内核 xff1a 官方建议 3 10 以上 xff0c 3 8以上貌似也可 注意 xff1a 本文的命令使用的是 root
  • windows通过xrdp实现远程ubuntu

    首先声明 xff1a 我使用的是root用户 xff0c 所以无视权限问题 第一步 安装vncserver wget http www c nergy be downloads tigervncserver 1 6 80 4 amd64 z
  • 【Vue2+Vue3】开发指令使用总结,未完待续

    目录 一 watch监听及深度监听 二 directive自定义指令详解 43 实例 三 1 vue父子组件 xff1a 数据双向绑定 一 数据双向绑定 sync xff08 支持多个双向绑定值 xff09 三 2 父子组件间方法的调用 1
  • 南京大学数字电路与计算机组成实验的Verilator仿真(二)

    实验二 1 2 4译码器 top v module span class token function decode24 span span class token punctuation span x span class token p
  • firefox 的cookie 存放在哪里?

    在地址栏输入about surpport 打开配置页 找到about profiles 点击打开 看到有两个目录项 看准正在使用的那一个 34 正在使用此配置文件 34 找到cookie sqlite 的位置 正在使用的那个配置是删不掉的
  • C++ 构造函数和New运算符

    算法和数据结构就是编程的一个重要部分 xff0c 你若失掉了算法和数据结构 xff0c 你就把一切都失掉了 系统会自动在栈中为每个变量开辟内存空间 xff0c 以保证数值被合理地存放 由于栈是系统自动分配的 xff0c 因此速度较快 xff
  • matlab函数interp2及其c++代码

    最近将一个matlab程序转为c 途中遇到interp2这个家伙 我是左查右查 发现网上没有人总结这个玩意 于是我来初探一下 还是别有洞天的 嘿嘿 1 关于interp2 nbsp nbsp Vq interp2 X Y V Xq Yq l
  • CentOS 7中利用Snapper快照进行系统备份与恢复

    为什么要使用Snapper快照 xff1f 我们可以想像以下场景 xff1a 1 场景一 xff1a 系统发生意外宕机 xff0c 工程师无法快速定位问题 xff0c 业务受到中断 xff0c 客户十分不满意 2 场景二 xff1a 项目会

随机推荐

  • 计蒜之道 作弊揭发者(测试赛)

    鉴于我市拥堵的交通状况 xff0c 市政交管部门经过听证决定在道路两侧安置自动停车收费系统 当车辆驶入车位 xff0c 系统会通过配有的摄像头拍摄车辆画面 xff0c 通过识别车牌上的数字 字母序列识别车牌 xff0c 通过连接车管所车辆信
  • 7-10 兔子繁衍问题

    7 10 兔子繁衍问题 xff08 15 分 xff09 一对兔子 xff0c 从出生后第3个月起每个月都生一对兔子 小兔子长到第3个月后每个月又生一对兔子 假如兔子都不死 xff0c 请问第1个月出生的一对兔子 xff0c 至少需要繁衍到
  • Ubuntu运行tkinter程序的部署

    软件部署 xff08 Ubuntu系统 xff09 1 安装python环境 前提需要有网 ubuntu会自带python xff0c 不用单独安装 xff0c 但python的pip工具和tkinter包需要安装 xff08 1 xff0
  • Linux-用shell脚本写一个进度条

    shell执行脚本 xff1a 创建一个 sh文件 xff0c 编辑文件即可执行脚本 Shell脚本中用 表示注释 xff0c 相当于c语言的 注释 但如果 位于第一行开头 xff0c 并且是则例外 xff0c 它表示该脚本使用后面指定的解
  • S3C2440裸机按键控制小灯

    1 环境 1 操作系统 xff1a win7 64位 2 集成开发环境 xff1a keil4 7 3 开发板 xff1a FL2440 4 下载器 xff1a Jlink V9 2 按键以及LED灯原理图 根据FL2440开发板原理图可知
  • 数组存邻接表

    模板 xff1a 数组表示邻接表 int top 61 0 向 点中存第top个边 int head MAX N 61 1 每个点在建立邻接表时 xff0c 栈顶的边的编号 边的结构体 struct Edge int v 另一端连接的点 i
  • windows远程桌面到Ubuntu

    环境 xff1a VMware 43 Ubuntu18 04 方案 xff1a xrdp 43 gnome ubuntu xff08 不要安装xubuntu xff0c 费力不讨好 xff09 自己分步安装有时会遇到配置困难 xff0c 建
  • 系列一、NotePad++离线安装NppFTP插件

    一 下载离线插件 链接 xff1a https pan baidu com s 16EEGYOTKkMP bB8LcnwpsQ pwd 61 yyds 提取码 xff1a yyds 二 解压自己NotePad 43 43 对应版本 xff0
  • Ubuntu18 AMD和ARM版本的源的区别

    Ubuntu18 AMD和ARM版本的源的区别 文章目录 Ubuntu18 AMD和ARM版本的源的区别AMD版本ARM版本主要区别 之前因为懒没有仔细研究ubuntu AMD和ARM版本系统apt源的区别 xff0c 导致今天换源时候走了
  • 【C51】基于C51单片机的定时闹钟(含代码,电路,拿走即可用)

    基于C51单片机的定时闹钟 上电后设置定时时间 xff0c 按键1选择设置的是小时分钟还是秒钟 按键2对其进行具体的数字设置 一次选择完成之后就默认进入计时模式 达到计时时间后响铃 按键3可以关闭响铃 代码 span class token
  • 解决Centos7.9图形界面root用户登录报“sorry, that didn‘t work please try again”问题

    一 问题描述 xff1a 新装的Centos7 9 在图形界面以root身份进行登录时报 sorry that didn t work please try again xff0c 如下图所示 xff1a 经确认 xff0c root密码是
  • ubuntu 安装QT 5.0出现错误:Failed to load platform plugin "xcb".

    当你安装QT 5 0 时 xff0c 启动的时候会出现如下错误 xff1a Failed to load platform plugin 34 xcb 34 Available platforms are linuxfb minimal x
  • 获取Android设备的序列号(SN号)

    方法 xff08 一 xff09 通过反射获取sn号 public static String getDeviceSN String serial 61 null try Class lt gt c 61 Class forName 34
  • Python smtplib.SMTP()和smtplib.SMTP_SSL() 登录邮箱并发送邮件比较

    一 邮件发送流程 邮件的发送是主动行为 xff1a 主要通过 MUA 邮件客户端软件 xff0c 将邮件内容发送给对应的服务器 暂存到投递服务区 xff0c 然后由当前运营商根据邮件特征信息将邮件转发给目标服务器的投递服 务区 xff0c
  • mysql limit 使用规范

    在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢 xff1f 不用担心 xff0c mysql 已经为我们提供了上面这样一个功能 xff08 0 xff09 mysql不支持select
  • 【Proteus仿真】【STM32单片机】智能电饭煲系统设计

    文章目录 一 功能简介二 软件设计三 实验现象联系作者 一 功能简介 本项目使用Proteus8仿真STM32单片机控制器 xff0c 使用继电器加热 保温模块 数码管模块 按键模块 LED指示灯 蜂鸣器模块等 主要功能 xff1a 系统运
  • Kurento-6.7.1 媒体服务器搭建详细教程(Kurento-Media-Server)

    Kurento 6 7 1 媒体服务器搭建详细教程 关于 Kurento 媒体服务器 Kurento 架构的核心是媒体服务器 xff0c 它被命名为Kurento媒体服务器 xff0c 即 KMS Kurento 媒体服务器所有的媒体处理模
  • 什么是jsp?

    什么是JSP JSP全称Java Server Pages xff0c 是一种动态网页开发技术 它使用JSP标签在HTML网页中插入Java代码 标签通常以 lt 开头以 gt 结束 JSP是一种Java servlet xff0c 主要用
  • Echarts实现自定义图标——风向图

    上图用了两种模式表示风向图 xff0c 第一种是自定义系列 xff0c 第二种使用了折线图 xff0c 给折线图添加自定义图标 两者的区别在于给options series设置不同的type值 xff0c 如下图 xff1a 那么我们来一步
  • 最大公约数的四种方法

    最大公约数的四种方法 前言1 暴力穷举法2 辗转相除法步骤原理证明 xff1a 3 更相减损法步骤原理证明 xff1a 比较 4 stein算法比较原理步骤 前言 求两数的最大公约数 xff0c 一共有四种方法 xff1a 暴力穷举法 更相