博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
欧几里得算法及扩展欧几里得算法简单解释
阅读量:6201 次
发布时间:2019-06-21

本文共 1001 字,大约阅读时间需要 3 分钟。

欧几里得算法:

  解释:给定两个自然数,求出两个自然数的最大公约数。也叫——辗转相除法

  过程:1.给定两个自然数a、b

     2.a == 0 时 gcd(a,b)= b;b == 0 时 gcd(a,b) = a

     3.当a,b都大于0时有 gcd(a,b)= gcd(b,a%b),减小a,b继续计算

  证明:当a,b都大于0时,我们保证a大于b;并令a=kb+r

     当 r = 0时,最大公约数就是b

     当 r != 0时,首先r = a%b = a-kb,又令g = a与b的任意公约数

     a与kb都能整除g,所以r也能整除g,所以b与a%b的公约数等于g

     反过来也可以从b与a%b推出,a与b的公约数为g,这样b与a%b跟a与b的所有公约数是一样的

     得证

  代码:

int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}

 

扩展欧几里得算法:

   解释:找到一对整数(x,y)使得ax+by=gcd(a,b)

   证明及过程:当a为0时,y为1,(b一样)

      当a、b都不为0时,因为gcd(a,b)=gcd(b,a%b)

      所以 ax+by = b*x1+a%b*y1

            = b*x1+(a-a/b*b)*y1

            = a*y1+b*(x1-a/b*y1)

      然后我们需要模拟欧几里得算法,交换x、y,并改变x

   代码:

void exgcd(int a,int b,int &d,int &x,int &y){    if(!b)    {        x=1,y=0;        d=a;    }    else    {        exgcd(b,a%b,d,y,x);        y-=x*(a/b);    }}

   应用:模线性方程

     方程:ax ≡ c (mod b) -> 线性不等方程 ax+by = c(≡ 为前后mod b同余)

     解出ax+by=gcd(a,b)后a*(x*c/g)+b*(y*c/g)=c(g=gcd(a,b))

转载于:https://www.cnblogs.com/zhuanzhuruyi/p/6445728.html

你可能感兴趣的文章
Ubuntu 安装 Emacs23.4
查看>>
微信公众平台消息接口开发(1)
查看>>
学习多线程 笔记
查看>>
Intellij IDEA Scala开发环境搭建
查看>>
python str使用笔记(更新)
查看>>
leetcode 242 有效的字母异位词
查看>>
读书笔记之:C++参考大全
查看>>
PYDay2-linux基础\常用命令
查看>>
《软件测试自动化之道》读书笔记 之 目录导航
查看>>
语义化标签
查看>>
Java数据类型和MySql数据类型对应表
查看>>
iOS的动态代理模式的实现
查看>>
内存架构
查看>>
用户管理的备份与恢复
查看>>
Linux(CentOS 7)环境下安装MySQL
查看>>
64bit ubuntu 移植 arm-linux-gcc 4.3.2 版本出错
查看>>
对象映射工具AutoMapper介绍
查看>>
括号字符串
查看>>
解决Android调用https服务API时出错的问题
查看>>
MyBatis3学习--来源自用户指南
查看>>