正式叙述前还写了一点自己的小感受。

问题:求两个正整数a,b的最大公约数。

大神看来是很简单的问题,但是对于去年夏天刚学python的我来说,这是个很难的问题,还记得当时一晚上睡不着都在想怎么快一点的求出最大公约数,后来猜测最小公倍数的求法,还有最后想出来的欣喜若狂,我现在还记忆犹新。

还记得看过一个小梗:一个农民种着种着地,一排一排的种,突然陷入深思,沉思良久,回去算了很久以后,借了钱疯了似的坐火车跑到中科院门口,等来数学系教授,向他讲述了自己的重大发现。大概意思就是,自己从田地中大彻大悟,发明了一种快速计算方法,不用计数,不用加法,不用数学,还给了教授一张伟大的定律表。

教授告诉他:你真的很厉害,你的发现很伟大,能在种田中悟出来这种算法可不容易。

但是,你发明的这种算法叫乘法,你给我的表,完善一下以后,叫九九乘法表。

农民继续回去种田

(这个故事告诉我们要多虚心接受知识,不要老自己想。。。。)

我知道了欧几里得算法以后,感觉自己就跟这个农民一样。。。。。。。

不过,知道了自己的想法就是欧几里得算法时,还是挺高兴的。。。

就当锻炼思维了吧。。只能这么安慰自己。

好,开始正题。。。。::

我当时的思路是这样的:求a,b的最大公约数,假设最大公约数是x的话,a一定可以用i*x来表示,b也一定可以用j*x来表示,我们怎么把i和j去掉,把x榨出来呢??

让这俩数不断互相相减就可以啦!

后来自己想到了互相取余。

我们来看正规的欧几里得算法:

首先放简介:欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。

看代码实现:

Python

def gcd(a, b):while a != 0:a, b = b % a, areturn b

后来知道了欧几里得还有拓展:

可以用来求二元一次方程的通解,还可以用来求乘法逆元。

已知整数a、b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足贝祖等式ax+by=gcd(a,b)

如果a是负数,可以把问题转化成|a|(-x)+by=gcd(|a|,b) ,然后令x'=(-x)。

//返回 d=gcd(a,b); 和对应于等式 ax+by=d 中的 x,y
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{if(a==0&&b==0) return −1;//无最大公约数if(b==0){x=1;y=0;return a;}long long d=extend_gcd(b,a%b,y,x);y−=a/b*x;return d;
} 

求逆元,真的不想叙述了,上个代码算了

 //********* 求逆元 *******************
//ax = 1(mod n)
long long mod_reverse(long long a,long long n)
{long long x,y;long long d=extend_gcd(a,n,x,y);if(d==1) return (x%n+n)%n;else return −1;
} 

逆元,利用欧拉:

mod 为素数, 而且 a 和 m 互质

long long inv(long long a,long long mod)//为素数mod
{return pow_m(a,mod−2,mod);
}

欧几里得gcd/extend_gcd相关推荐

  1. acm数论之欧几里得gcd

    1.欧几里得定理 同余定理的公式:(a+b)%mod=(a%mod+b%mod)%mod (a*b)%mod=(a%mod*b%mod)%mod 扩展欧几里得也有自己的一个公式:a*x+b*y=gcd ...

  2. 欧几里得 扩展欧几里得

    欧几里得  &  扩展欧几里得 时间复杂度T(n):O(log2n); 空间复杂度S(n):O(n); Advantages: 1.    时间复杂度不高,和普通欧几里得一样: 2.    代 ...

  3. [数论]Gcd/ExGcd欧几里得学习笔记

    \(Q\):什么是\(GCD\)? \(GCD\) \(GCD\),即最大公约数(\(Greatest\ Common\ Divisor\)) 对于两个自然数\(a,b\),定义\(GCD(a,b)\ ...

  4. gcd + 扩展欧几里得定理+递推乘法逆元(模板)

    gcd: int gcd(int a, int b){ return b==0? a: gcd(b, a%b); } 扩张欧几里得定理: 扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+b ...

  5. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

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

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

  7. 欧几里得及拓展欧几里得

    博主链接 欧几里得 int gcd(int a,int b){return (b==0)?a:gcd(b,a%b); //一条语句搞定(三元运算符)装逼,跟上面略有不同,上面做到t=0,这里做到b=0 ...

  8. Codeforces Gym100812 L. Knights without Fear and Reproach-扩展欧几里得(exgcd)

    补一篇以前的扩展欧几里得的题,发现以前写错了竟然也过了,可能数据水??? 这个题还是很有意思的,和队友吵了两天,一边吵一边发现问题??? L. Knights without Fear and Rep ...

  9. 扩展欧几里得 POJ 1061

    感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...

最新文章

  1. c语言流程图图裂代表的意义,程序流程图的意义
  2. 32位数据源中没有mysql_如何在.NET中连接到MySQL数据库
  3. linux 添加动态链接库路径
  4. 笔记-计算机网络基础-开放系统互连参考模型OSI
  5. comparable和comparator比较
  6. 一个html5页面,html5做一个黑板报页面
  7. [转]关于父亲的故事
  8. 使用boost.python进行混合开发
  9. 【本周面试题】第5周 - 开发工具相关
  10. Linux 命令之 cd 命令-切换目录
  11. 前端学习(2007)vue之电商管理系统电商系统之优化复选框的样式
  12. CSS实现树形结构 + js加载数据
  13. xx_学脱壳 -- 脱壳总结小思路
  14. CG-光栅图形学区域填充算法-学习笔记
  15. 关于java代码中的注释问题。(类中方法的注释,我们一般都要写上这个方法的文档(doc),方法的参数也要有它的文档)
  16. 教职工使用计算机管理制度,教师配置笔记本电脑管理办法
  17. 学习总结 java Iterator迭代器练习
  18. 为什么需要建设者模式
  19. python—itertools模块常用函数
  20. Spring MVC使用@RestController生成JSON示例

热门文章

  1. apache根据ip分发_腾讯广告进入“IP新融点”时代
  2. flex 正则表达式匹配规则
  3. asterisk for mipsel
  4. 解决链接错误:error LNK2001: 无法解析的外部符号 __iob
  5. 使用 rapidxml 做配置文件
  6. ubuntu下制作u盘镜像_deepin下制作win10启动U盘
  7. linux串口编程实例_Linux 网络编程——原始套接字实例:发送 UDP 数据包
  8. 内存参数 计算_Spark统一内存管理的实现
  9. JAVA实现telnet代理,对输入命令拦截
  10. viper4android fxifi,ViPer4android. FX顶级音效!