欧几里得算法(gcd):

  又名辗转相除法,是求最大公约数的算法。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。两个数的最大公约数通常写成 gcd(a, b)
例如,计算a = 1071和b = 462的最大公约数的过程如下:
  从1071中不断减去462直到小于462(可以减2次,即商q0 = 2),余数是147: 1071 = 2 × 462 + 147. 然后从462中不断减去147直到小于147(可以减3次,即q1 = 3),余数是21: 462 = 3 × 147 + 21. 再从147中不断减去21直到小于21(可以减7次,即q2 = 7),没有余数: 147 = 7 × 21 + 0. 此时,余数是0,所以1071和462的最大公约数是21。
由此可以得到算法

递归:
int gcd (int n, int m)
{if (m == 0)return n;elsereturn gcd(m, n % m);
}
迭代:
int gcd(int m,int n)
{int t = 1;while(t != 0) {t = m % n;m = n;n = t;}return m;
}

扩展的欧几里得算法(exgcd):

  是欧几里得算法(又叫辗转相除法)的扩展。已知整数a、b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足贝祖等式 ax+by=gcd(a,b)
例子过程展示
用类似辗转相除法,求二元一次不定方程47x + 30y = 1的整数解。

  • 47 = 30 * 1 + 17
  • 30 = 17 * 1 + 13
  • 17 = 13 * 1 + 4
  • 13 = 4 * 3 + 1

然后,把它们改写成“余数等于”的形式。

  • 17 = 47 * 1 + 30 * (-1)    //式1
  • 13 = 30 * 1 + 17 * (-1)    //式2
  • 4 = 17 * 1 + 13 * (-1)     //式3
  • 1 = 13 * 1 + 4 * (-3)

然后,倒着计算并带入式子 1, 2, 3:

  • 1 = 13 * 1 + 4 * (-3)
  • 1 = 13 * 1 + 【17 * 1 + 13 * (-1)】 (-3)*     //带入式 3
  • 1 = 17 * (-3) + 13 * 4
  • 1 = 17 * (-3) + 【30 * 1 + 17 * (-1)】 * 4   // 带入式 2
  • 1 = 30 * 4 + 17 * (-7)
  • 1 = 30 * 4 + 【47 * 1 + 30 * (-1)】 * (-7)   //带入式 1
  • 1 = 47 * (-7) + 30 * 11

得解 x = -7,y = 11

代码实现:
int exgcd(int a, int b, int &x, int &y)
{if(b == 0){x = 1;y = 0;return a;}int r = exgcd(b, a % b, x, y);int t = x;x = y;y = t - a / b * y;return r;
}

欧几里得算法及其扩展欧几里得算法——数论相关推荐

  1. 欧几里得算法、扩展欧几里得算法(特解、应用、通解)

    文章目录 1. 欧几里得算法(也叫辗转相除法) 1.1 直接上模拟 1.2 几何理解 1.3 用代数方法证明 g c d ( a , b ) = g c d ( b , a % b ) gcd(a, ...

  2. 欧几里得算法及扩展欧几里得算法简单解释

    欧几里得算法: 解释:给定两个自然数,求出两个自然数的最大公约数.也叫--辗转相除法 过程:1.给定两个自然数a.b 2.a == 0 时 gcd(a,b)= b:b == 0 时 gcd(a,b) ...

  3. 扩展欧几里得算法java_扩展欧几里得算法

    首先.扩展欧几里得定理:对于两个不全为0的整数a.b,必存在一组解x,y,使得ax+by==gcd(a,b); int gcd(int a,intb) {intt,d;if(b==0) { x=1; ...

  4. 数论:欧几里得与扩展欧几里得算法

    文章目录 欧几里得算法 历史发展 表示 证明 代码 例题 扩展欧几里得算法 表示 求解方法 代码 其他定理: 例题 欧几里得算法 历史发展 欧几里得算法用来求得两个数的最大公约数,大约公元前300年首 ...

  5. 欧几里得算法/扩展欧几里得算法

    转载请说明出处:http://blog.csdn.net/leader_one/article/details/75222771 说在前面 出于尊重,简单介绍一下欧几里得(想了解更多自己百度去) 欧几 ...

  6. Python在GF(2⁸)有限域上求解多项式的乘法逆元——基于扩展欧几里得算法

    文章目录 一.前言 二.数学基础 1.GF(2⁸)有限域内的多项式 2.不可约多项式 3.多项式模运算 3.乘法逆元 三.算法步骤 1.扩展欧几里得算法 2.多项式除法 3.多项式乘法 四.代码实现 ...

  7. Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...

    Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...

  8. 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...

    难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...

  9. [BZOJ1477] 青蛙的约会|扩展欧几里得算法

    1477: 青蛙的约会 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 306  Solved: 192 [Submit][Status][Discuss ...

最新文章

  1. 对外星智能的搜索得到了重大的升级
  2. Java相对路径调用dll文件,VS项目中调用他人提供的.lib和.dll文件的用法(绝对路径和相对路径)...
  3. python 从excel中抓取数据_使用Python抓取美团数据存于Excel中
  4. 装了Visual Studio 2005之后重装IIS的问题解决方法
  5. php 去掉不可见字符串,php去掉指定字符串的办法
  6. CentOS虚拟机时间同步
  7. linux文件目录与管理
  8. 【转】ARC下dealloc过程及.cxx_destruct的探究
  9. VoltDB公布4.0版本号,大步提高内存实时分析速度,进军操作数据库市场
  10. 物联网架构----EMQ-Hook了解、连接Kafka发送消息
  11. leetcode刷题:循环队列
  12. 如何:删除Word 2010中的“向下箭头”
  13. 戴口罩人脸数据集和戴口罩人脸生成方法
  14. Hutool介绍(详)
  15. 数据运营与组织变革 知识体系
  16. 离线语音识别与语音转写初探
  17. CentOS-7磁盘扩容之殇
  18. javascript中获取非行间样式的方法
  19. ECCV 2022最佳论文奖公布!两位华人学者摘得桂冠!本科来自清华、浙大
  20. Android读ipconfig.txt配置文件乱码

热门文章

  1. 解决iPhone 浏览器上的圆角问题
  2. StringTokenizer是什么
  3. 关于Eclipse的基本使用方法
  4. Ubuntu安装luminati
  5. Linux下的常用的打包和解压缩命令
  6. ZYNQ之AXI简介
  7. 不规则形状或图片添加阴影效果
  8. 某游戏公司测试工程师面试题
  9. C++输入密码显示*
  10. 如何打动用户?携程用户体验实践分享