Euclid算法大概是我最早接触的东西了吧,下面是学长传授的代码:

1 int GCD(int a,int b){
2     return b==0?a:GCD(b,a%b);
3 }

短小精悍。当时也没理解为什么这段代码可以求出$a$和$b$的最大公因数。现补下证明。

$a$和$b$的最大公因数记为$gcd(a,b)$,简写为$(a,b)$.

证明Euclid算法的正确性,即证明$(a,b)=(a,b-ka)$.

设$x=(a,b)$,$y=(a,b-ka)$,

$\because x=(a,b)$,

$\therefore x|a$,$x|b$,

$\therefore x|(-ka+b)$,

$\therefore x|(a,b-ka)=y$,

故$x \leqslant y$.

$\because y=(a,b-ka)$,

$\therefore y|a$,$y|(b-ka)$,

$\therefore y|[ka+(b-ka)]=b$,

$\therefore y|(a,b)$,即$y|x$,

故$y \leqslant x$.

$\therefore x=y$.

即$(a,b)=(a,b-ka)$.证毕.

当$k=\lfloor \frac{a}{b} \rfloor$时,即为Euclid算法.

上述Euclid算法仅求出$(a,b)$,而不能得到$(a,b)$关于$a$和$b$的线性表示,故有了拓展的Euclid算法:

 1 int EXGCD(int a,int b,int &x,int &y){
 2     if(b==0){
 3         x=1;y=0;
 4         return a;
 5     }
 6     int d=EXGCD(b,a%b,x,y);
 7     int t=x;
 8     x=y;y=t-a/b*y;
 9     return d;
10 }

上述算法可求得$x$和$y$,使满足$(a,b)=ax+by$.

为便于证明,以非递归版本为例:

 1 int EXGCD(int a,int b,int &x,int &y){
 2     int x0=1,x1=0,x2=a;
 3     int y0=0,y1=1,y2=b;
 4     while(y2!=0){
 5         int q=x2/y2;
 6         int t0=x0,t1=x1,t2=x2;
 7         x0=y0;x1=y1;x2=y2;
 8         y0=t0-q*y0;y1=t1-q*y1;y2=t2-q*y2;
 9     }
10     x=x0;y=x1;
11     return x2;
12 }

若$ax_0+bx_1=x_2$,$ay_0+by_1=y_2$,

不难得到$a(x_0-qy_0)+b(x_1-qy_1)=x_2-qy_2$.

上述等式正式保证了拓展Euclid算法的正确性。

拓展Euclid算法可用来求模线性方程$ax+by=(a,b)$的解。

特别地,当$(a,b)=1$时,$x$即为$a$在$b$下的乘法逆元。

求$1$到$n$的数在$p$下的乘法逆元可以做到$O(n)$的复杂度:

令$inv_i$为$i$在$p$下的逆元,则有$inv_x \equiv [(p- \lfloor \frac{p}{x} \rfloor ) \times inv_{p\%x}](mod p)$.

证明:设$p=kx+r$,其中$0 \leqslant r < x$,

那么原式等于$inv_x \equiv [(p-k) \times inv_r](mod p)$

$\Leftarrow r \equiv [(p-k) \times x](mod p)$

$\Leftarrow r \equiv -kx(mod p)$

即$kx+r \equiv p \equiv 0(mod p)$,证毕.

故我们可以递推得到各个逆元。

转载于:https://www.cnblogs.com/barrier/p/6546094.html

关于Euclid算法相关推荐

  1. C语言求最大公约数欧几里得Euclid算法(附完整源码)

    最大公约数欧几里得Euclid算法 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) #inclu ...

  2. 证明:gcd(m,n)=gcd(n mod m,m)成立,m,n为正整数,m>0. 【Euclid算法证明】

     --本文证明部分转载自:   http://www.cnblogs.com/ider/archive/2010/11/16/gcd_euclid.html   作者:  Ider  网上证明如他所说 ...

  3. 可公度线段与欧几里得(Euclid)算法

    通过本文,我们将发现欧几里得算法(求两个数的最大公约数,也称作辗转相除),根本不需要死记硬背,仅仅通过数论中的一个小小的结论(有关可公度线段,commensurable),即可轻易推导出来. 既然算法 ...

  4. 做acm 需要学的算法

    做acm 需要学的算法 转一个搞ACM需要的掌握的算法.  要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.  适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什 ...

  5. 从今开始,好好学习一下算法!

    ACM 进阶之路(转) 2007年12月30日 星期日 18:20 一般要做到50行以内的程序不用调试.100行以内的二分钟内调试成功.ACM主要是考算法的,主要时间是花在思考算法上,不是花在写程序与 ...

  6. [转]RSA算法简介

    1978年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法. 它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard ...

  7. 跨越千年的RSA算法

    转自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思 ...

  8. 问,你的算法复习计划是什么?

    (另注:这篇文章发到首页,是希望多和大家交流,首先感谢大家) 小学和爸爸一起玩小霸王学习机,看着爸爸照着说明书上的程序在小霸王学习机上打出了一个超级玛丽奥.自己也尝试着打,却没有打出来. 初中,终于把 ...

  9. 这是关于如何学好算法

    这是关于如何学好算法 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,  因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打  出来.  ...

最新文章

  1. matlab 2014 破解使用
  2. iOS拓展---碰到奇葩需求
  3. spring容器创建bean对象的方式以及如何处理多个spring配置文件
  4. BZOJ-1069 [SCOI2007]最大土地面积
  5. java 学生学籍管理系统_JAVA学生学籍管理系统
  6. 将ClearCase的客户端编码设置为UTF-8
  7. pythonnumpy官网_Numpy安装
  8. 常用元器件使用方法5:RS-232电平转换芯片SP3232EEN的使用方法
  9. ENVI:如何进行遥感图像的分类?(支持向量机模型)
  10. python官网下载非常慢解决方法
  11. html 在线打开pdf文件,Html打开pdf、word、xls等文件
  12. 斐波那契数列 一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?
  13. 2021暑假Leetcode刷题——Two Pointers(1)
  14. 【黑灰产犯罪研究】恶意注册
  15. plt.imshow()无法显示两站图片?
  16. RH850从0搭建Autosar开发环境【2】- Davinci Configurator配置工程导入DBC与CDD文件
  17. Python---复制文件夹
  18. 新蓝领时代:快递员月收入过万“炼金术”
  19. 计算机 志愿活动总结,计算机及信息科学系青年志愿者协会活动总结计划.docx
  20. 通讯行业多媒体信息发布系统方案

热门文章

  1. 区块链是一种用一种不可变的形式存储数字信息
  2. 智能家居市场的魔方法则深度剖析
  3. 说说JSON和JSONP,也许你会豁然开朗
  4. mysql主主复制+keepalived 打造高可用mysql集群
  5. 从零开始系列-Project 2010视频教程 (102课时)
  6. 对C#下函数,委托,事件的一点理解!
  7. 系列文章|OKR与敏捷(二):实现全栈敏捷 1
  8. js技巧--转义符\的妙用(转)
  9. PHP过滤器 filter_has_var() 函数
  10. MariaDB AX开源分析解决方案