世界上最早的算法:辗转相除法(求两个自然数最大公约数)

简介:       在数学界,辗转相除法,又称欧几里得算法,被认为是世界上最早的算法(公元前300年),该算法用于求两个最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题yⅠ和Ⅱ)中,而在中国则可以追溯至东汉出现的《九章算术》。

      在数学界,辗转相除法,又称欧几里得算法,被认为是世界上最早的算法(公元前300年),该算法用于求两个最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题yⅠ和Ⅱ)中,而在中国则可以追溯至东汉出现的《九章算术》。

    两个自然数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。例如,1254和390的最大公约数是6(1254 = 6 × 209;390 = 6 × 65);用这两个数推导最大公约数的过程如下:

1254 % 390 = 84

 390 % 84 = 54

 84 % 54 = 30

 54 % 30 = 24

 30 % 24 = 6

 

所以这两个数的最大公约数是6,这很明显是递归算法

这个算法的证明如下:

设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,k为a除以b的商。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。

第一步:令c=gcd(a,b),则设a=mc,b=nc

第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c

第三步:根据第二步结果可知c也是r的因数

第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c,与前面结论矛盾】

从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

PS:这个结论是根据第二步r =(m-kn)c,第一步b =nc   将r带入gcd(b,r),得到gcd(nc, (m-kn)c),所以只有n和m-kn互为素数,b和r的最大公约数才为c

下面给出Java的实现

public class GCD
{


    public static int getGCD(int a, int b)
    {
        if(a < 0 || b < 0)
            return -1;
        if(a < b)
        {
            int c = b;
            b = a;
            a = c;
        }
        int c = a % b;
        if(c == 0)
            return b;
        else
            return getGCD(b, c);
    
    }

    public static void main(String[] args)
    {
       System.out.println(getGCD(1254, 390));
    }

}


目录
相关文章
|
安全 算法 API
支付宝支付加密规则梳理,写的太好了!
前言 支付是一个安全等级很高的场景,系统间交互的每一条数据的泄露都有可能造成及其大的损失。因此支付时系统间交互的每一
支付宝支付加密规则梳理,写的太好了!
|
关系型数据库 MySQL 数据库连接
关于MySQL-ODBC的zip包安装方法
关于MySQL-ODBC的zip包安装方法
|
算法 Shell 开发者
【Conan 入门教程 】Conan 2.1中的打印方式/输出管理
【Conan 入门教程 】Conan 2.1中的打印方式/输出管理
249 1
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
CentOS7编译安装openssl1.1.1
centos7默认提供的openssl版本是1.0.2的,想要升级openssl版本则需要手动进行编译
|
8月前
|
存储 缓存 关系型数据库
《原生应用数据存储抉择:键值型与关系型数据库深度剖析》
在原生应用开发中,数据存储选型至关重要。键值型数据库以简单高效著称,适合非结构化数据与高并发场景,但事务支持较弱;关系型数据库则擅长处理复杂结构化数据,具备强大事务能力和查询功能,但在扩展性上面临挑战。两者各有优劣,需根据数据结构、性能需求、业务场景等综合考量。例如,物联网领域可选用键值型数据库,而企业级应用更适配关系型数据库。合理选择存储方案,才能构建高效稳定的应用基础。
212 0
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
2140 0
|
存储 分布式计算 大数据
大数据架构管理规范
8月更文挑战第18天
264 2
|
消息中间件 存储 SQL
Flume【基础知识 01】简介 + 基本架构及核心概念 + 架构模式 + Agent内部原理 + 配置格式(一篇即可入门Flume)
【2月更文挑战第18天】Flume【基础知识 01】简介 + 基本架构及核心概念 + 架构模式 + Agent内部原理 + 配置格式(一篇即可入门Flume)
3856 0
|
Java Apache Maven
list.size()和list.isEmpty()的区别和效率以及CollectionUtils.isEmpty()的使用
list.size()和list.isEmpty()的区别和效率以及CollectionUtils.isEmpty()的使用
567 0