题记:这是我第四次复习扩展欧几里得原理,因为不常用到,想要使用的时候又想不起细节,总是要查资料,于是索性这次整理一下欧几里得原理及其扩展原理存档至博客以备查用。

一、欧几里得原理

欧几里得原理(Euclidean Theory)是初等数论中求两正整数最大公约数(Greatest Common Divisor, GCD)的方法。欧几里得原理在中国古代又称“辗转相除法”,这一称法揭示了其求最大公约数的过程。

对于两个正整数a,b,记其最大公约数为gcd (a,b)。

那么我们有 gcd (a,b) = gcd (b,a%b)

即a与b的最大公约数也是a除以b的余数与b的最大公约数。

欧几里得原理可以通过递归实现,下面给出其实现的C代码:

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

函数返回参数a,b的最大公约数。注意该gcd函数调用时参数a,b不应该同时为0,否则该函数将不存在实际意义。

二、扩展欧几里得原理

欧几里得原理的扩展版本最经典的用法在于求二元一次不定方程的整数解。

(1)先来看一个最简单的二元一次不定方程:

a*x + b*y = 1     (*),且 gcd (a,b) = 1,设它的一组整数解为 x = x1, y = y1。

对于另一个二元一次不定方程:

b*x + (a%b)*y = 1    (**),设它的一组整数解为 x = x2, y = y2。

那么我们可以得到 a*x1 + b*y1 = b*x2 +(a%b)*y2 = 1,又因为 a%b = a - a/b*b,带入前式,

我们可以得到 a*x1 + b*y1 = a*y2 + b*(x2-a/b*y2),由于a,b是任意的互质正整数,故可由该式得到方程(*)与方程(**)的解的关系如下:

x1 = y2,

y1 = x2-a/b*y2,即方程(*)的解可由方程(**)的解得到。

若我们想要求得a*x + b*y = 1的解,可以先求b*x + (a%b)*y = 1的解。我们可以发现这两个方程其未知量x,y 的系数之间是“辗转相除”的关系。那么最终我们只需要求gcd (a,b)*x + 0*y = 1的解(这里gcd (a,b) = 1,其解为 x = 1,y任意,一般取0),逆推之就可得到原方程的解。而逆推的过程就是扩展欧几里得原理的过程。

(2)我们现在已经解决了求二元一次不定方程 a*x + b*y = 1, gcd (a,b) = 1的解。下面考察二元一次不定方程的一般情况:

对于一般的二元一次方程 m*x + n*y = t,

  • 若gcd (m,n) | t,亦即 t%gcd(m,n) == 0,方程的解将与方程 (m/gcd(m,n))*x + (n/gcd(m,n))*y = t/gcd(m,n) 的解相同。记新方程为 a*x + b*y = d,那么其解将是方程 a*x + b*y = 1的d倍。而方程 a*x + b*y = 1, gcd(a,b) = 1的解在(1)中已经求得。
  • 否则方程无整数解

上述过程即用扩展欧几里得原理求一般二元一次不定方程整解的过程。

欧几里得原理及扩展欧几里得原理(Euclidean Theory and Extended Euclidean Theory)学习笔记相关推荐

  1. 欧几里得定理与扩展欧几里得定理

    欧几里的定理(辗转相除法): gcd(a,b) = gcd(b,a%b) gcd(a,b)表示a,b的最大公约数 证明: 设 a > b c = a%b a = k * b + c (k为某个整 ...

  2. 欧几里得定理与扩展欧几里得

    3,欧几里德定理:(射影定理) 定理指出素数是无限的. a*b*c+1要么是素数要么其质因子就是素数. 扩展欧几里得: 扩展欧几里得算法是欧几里得(又叫辗转相除法)的扩展.已知整数a.b,扩展欧几里得 ...

  3. 扩展欧几里得及其应用

    欧几里得算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理:gcd(a,b)=gcd(a,a mod b) gcd函数就是用来求(a,b)的最大公约数的. ...

  4. 扩展欧几里得定理的证明和代码

    1.欧几里得算法,gcd(a,b)为a b(a>b)的最大公约数,则gcd(a,b) = acd(b, a%b) 利用这个定理我们可以反复对ab模下去求得a和b的最大公约数 代码如下 int G ...

  5. Strange Optimization(扩展欧几里得)

    Strange Optimization Accepted : 67   Submit : 289 Time Limit : 1000 MS   Memory Limit : 65536 KB Str ...

  6. 欧几里得算法扩展欧几里得

    本文包括: 1.几里德算法 递归实现 2.扩展欧几里德算法 递归实现 -实际上就是把别人总结的,我认为有助于自己理解的内容copy过来,再加上几句自己的理解. 欧几里得算法 欧几里德算法又称辗转相除法 ...

  7. 【欧几里得扩展欧几里得】

    欧几里得 LL gcd(LL a,LL b){return (b==0) ? a : gcd(b,a%b);} 扩展欧几里得 int ex_gcd(int a,int b,int &x,int ...

  8. 欧几里得算法(扩展欧几里得、欧拉定理、费马小定理)

    问题描述: a 和 b的最大公约数是多少? 古代解法:辗转相除法 迭代过程:例如: {a = 15 和 b = 12  } =>{ a = 12,b =  15 - (15/12)* 12 = ...

  9. 扩展欧几里得定理 新手向证明及代码

    知识储备 1 . 朴素欧几里得原理:gcd(a,b) == gcd(b,a % b) 2 . 负数取模:忽略符号返回绝对值就好了 3 . 模数原理:对于整数a,b必然存在整数k使得a % b == a ...

最新文章

  1. Visual Studio 2013 中如何设置断点
  2. windows程序崩溃生成dump文件
  3. 史上最全的机器学习资料(上)
  4. CTO:再写if-else,逮着一个罚款1000!
  5. 非公平锁和公平锁在reetrantlock里的实现过程是怎样的
  6. 图的根节点-数据结构作业。。
  7. 大量DelegatingClassLoader类加载器,导致Perm区溢出
  8. “猜心思”的Hard模式:问答系统在智能法律场景的实践与优化
  9. JdbcTemplate(操作数据库-查询返回对象、查询返回集合)
  10. java sbyte_Java Byte parseByte()方法
  11. mysql创建用户navicat_14MYSQL创建用户和授权、15Navicat的使用、16-pymysql模块的使用、17-索引...
  12. mysql自动多表联合更新_mysql多表联合更新 的 三种方法
  13. IDEA Maven Mybatis generator 自动生成代码
  14. sqoop的job工具
  15. 微信红包封面催生暴利灰产:有人月入三十万
  16. 东大22春《马克思主义基本原理X》在线平时作业1_100分满分非答案
  17. 3Dvr全景制作VR全景技术讲解-道可云
  18. unity3d 中添加视频
  19. JS进行人民币大小写转换
  20. 数据库的实例化操作——员工信息的查询——简单表查询(二)

热门文章

  1. 阿里云身份证实名认证
  2. android 触摸灵敏,安卓手机打开这个设置,流畅度瞬间提升60%
  3. 2020电力电缆模拟考试题及电力电缆作业考试题库
  4. 软件测试实验一 语句和判定覆盖测试设计
  5. C++-stack:stack基本用法【stk.push(x)、stk.top()、stk.pop()、stk.size()、stk.empty()】
  6. 【数据库架构】Apache Couchdb 最终一致性
  7. 淘集集活动的报名的链接怎么显示是大于300字呢
  8. 资深老师告诉你机加工铣刀选用的原则
  9. Webshell介绍
  10. Gitlab----管理员如何创建用户并邮件通知