欧几里德算法一般简写为GCD,即辗转相除求最大公因数,模板为

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

由于这种求的方法适用于大数,所以一般数据类型采用long long int。

基于欧几里德算法,延伸出了拓展欧几里得算法,用于解决线性同余方程的问题,首先什么是线性同余方程,百度定义如下:在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如: ax≡b (mod n)的方程。此方程有解当且仅当 b 能够被 a 与 n 的最大公约数整除(记作 gcd(a,n) | b)。这时,如果 x0 是方程的一个解,那么所有的解可以表示为: {x0+kn/d|(k∈z)} 其中d = gcd(a,n)。在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 个解。

由上面的定义不难发现,只要有线性同余方程的一个特解,那么我们就可以求出其余的解,现在
问题就转化为如何求出方程的一个特解。

首先,由裴蜀定理(对任何整数a,b,m,关于未知数x,y的裴蜀等式ax +by = m, 当且仅当m为(d=gcd(a,b))的倍数时有整数解)知:ax + by = gcd(a,b)

根据这个式子来进行一定的推导,参考我们用一般欧几里德算法的模板时,递归的终点是当b=0时,所以这个时候我们也先来推导终点的情况,。当b=0时,等式就化为ax=gcd(a,0),而由一般欧几里德算法递归过程可知gcd(a,0)=gcd(0,a%0)=a,所以此时的解为X=1 Y=任何值,方便起见我们取Y=0,于是解为X=1 Y=0,这就是递归终点的值。

之后我们再来讨论一般情况,也就是a!=0&&b!=0的情况。一般等式为ax+by = gcd(a,b),如果取这个情况下的解为X1 Y1,于是有:gcd(a,b) = a * x1 + b * y1,利用一般欧几里德算法的模板,得到式子gcd(a,b)=gcd(b, a%b),同理再取gcd(b, a%b)=ax2+by2,而a%b又可以表示为 a%b = a-int(a/b)*b,于是得到这四个式子,联立得到 a * x1 + b * y1 = b * x2 + (a-int(a/b)*b) *y2,化简后为a * x1 + b * y1 = a * y2 + b * ( x2 –int(a/b) *y2 ),从这个式子中不难发现下面的结论:

      x1 = y2     y1 = ( x2 – int(a/b) *y2 )

这个结论是我们递归的第一层得出来,就是说这个式子的解是由第二层递归的值决定的,那么就需要继续递归下去,直到我们之前求得的递归终点为止,递归终点的XY值已经求出来了,那么需要的就是一层一层向上计算,最后就得出了ax+by = gcd(a,b)的特解。

当然,根据裴蜀定理,式子右边也可以是gcd(a,b)的倍数,这种情况下做个除法就好了,其余方法是一样的,化简后按照这个计算就行了。得到了特解后,我们就可以按照通解的定义进行后续的各类计算了。

模板如下:

long long int EXgcd(long long int a,long long int b)
{if(b==0){X=1;Y=0;return a;}else{int r=EXgcd(b,a%b);int t=X;X=Y;Y=t-a/b*Y;return r;}
}

针对这个模板,还有一部分容易看不懂的地方,这个函数是普通GCD的升级版,函数的返回值依然是最大公因数,这一点可以继续用,升级之处在于这个函数在递归的同时,还顺便把通解求出来了,存在了X Y上,如果用的话用这两个值即可。也就是说,在使用时,完全可以直接用拓展欧几里德的模板来代替普通的GCD。

欧几里德算法+拓展欧几里德算法相关推荐

  1. 欧几里德 和 拓展欧几里德算法

    一.欧几里德 欧几里德是用来求最大公约数的算法 其算法的中心思想为: 设a,b的最大公约数为c,则c一定也是a%b的最大公约数 证明方法很多,下面列出最简单的一个: 令 :a = xc: b = yc ...

  2. 欧几里德与拓展欧几里德定理

    一.欧几里德定理 欧几里德定理就是辗转相除法的原理,用来求两个整数的最大公约数gcd(a, b). 推理过程: 辗转相除法是由辗转相减法而来的,如果a和b(假设a>b)的最大公约数是k,那么可以 ...

  3. 欧几里德与拓展欧几里德

    欧几里德 介绍: 更相减损法 辗转相除法 拓展欧几里德 介绍: 条件: 证法: 代码: 逆元: 费马小定理 解释: 欧几里德 首先,我们知道有一个东西,叫:gcd!(就是最大公约数) int gcd ...

  4. 如何利用扩展欧几里得算法求解不定方程_欧几里德算法、拓展欧几里德、中国剩余定理...

    01.欧几里德算法(Euclidean algorithm)(辗转相除法) 欧几里德算法又称辗转相除法,主要是用于计算两个整数a,b的最大公约数. 简单点说一下算法原理:两个整数的最大公约数等于其中小 ...

  5. 欧几里德算法、拓展欧几里德、中国剩余定理

    目录 欧几里德算法(Euclidean algorithm)(辗转相除法) 拓展欧几里德算法 中国剩余定理 作业1: 作业2: 欧几里德算法(Euclidean algorithm)(辗转相除法) 欧 ...

  6. 【算法】欧几里德算法——求两个整数的最大公约数

    目录 1. 算法简介 2. 算法实现 2.1 暴力穷举法 2.2 欧几里德算法 1. 算法简介 欧几里德(Euclidean)算法,又被称辗转相除法,是求最大公约数的算法. 两个数的最大公约数是指能同 ...

  7. 青蛙的约会 数论 拓展欧几里德

    两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特 ...

  8. POJ 1061 :拓展欧几里德

    题目为POJ1061 青蛙的约会 题意大致为: 两只青蛙在不同的坐标x,y,沿着一个方向跑环,每一次的移动距离为m,n,环的长为L,问能否成功会师即在某一时刻在同一坐标点?输出最小移动次数或" ...

  9. Fraction Construction Problem(拓展欧几里德)

    Fraction Construction Problem 思路 cd−ef=ab\frac{c}{d} - \frac{e}{f} = \frac{a}{b}dc​−fe​=ba​ a<b&a ...

最新文章

  1. rockmq运维指令_RocketMQ运维监控
  2. Windows使用免费版Kiwisyslog搭建日志服务器
  3. 学会放下包袱,热爱单例
  4. 将一个数组输出到模板中来处理2
  5. USB的pid和vid以及usb路径名字之间的关系
  6. etcd集群搭建(高可用)
  7. Delphi Math里的基本函数,以及浮点数比较函数(转)
  8. 女士细线毛衣起多少针_从起针到缝合,教你织毛衣的各种要点(详细教程)
  9. docker php 一键部署_Java开发提升十倍生产力:Idea远程一键部署springboot到Docker
  10. Jsoup根据URL加载一个Document
  11. 在线图片转base64工具
  12. 图像分类模型AlexNet解读
  13. LoadRunner字符串编码转换函数:lr_convert_string_encoding
  14. Linux安装Diamond软件,Diamond软件比对蛋白质数据库
  15. iOS手势UIGestureRecognizer的使用及手势冲突的解决办法【转】
  16. Ubuntu14.04 用 CrossOver 安装 TMQQ2013
  17. 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论...
  18. Vue.js 踩坑记 (一)
  19. linux系统安装视频播放器,Linux操作系统上安装Mplayer播放器的方法
  20. linux格式化只读u盘,linux下FAT32格式u盘只读的问题及解决方法

热门文章

  1. 读取配置文件(configparser,.ini文件)
  2. 一天一个Java基础——序列化
  3. C# DDOS攻击代码
  4. edwardcmh@cnblogs
  5. bootstrap实现单页面跳转_SpringBoot拦截器,国际化,登录实现
  6. HikariCP不断打印WARN日志Failed to validate connection com.mysql.jdbc.JDBC4Connection@xxxxx (...) Possibly
  7. 一台机器上同时部署多个tomcat服务
  8. 生成器(generator)
  9. BZOJ 2843 极地旅行社
  10. 〖Demo〗-- 模拟登录