相信大家对欧几里得算法,即辗转相除法不陌生吧。

代码如下:

int gcd(int a, int b){
return !b ? gcd(b, a % b) : a;
}

而扩展欧几里得算法,顾名思义就是对欧几里得算法的扩展。

切入正题:

首先我们来看一个问题:

求整数x, y使得ax + by = 1, 如果gcd(a, b) != 1, 我们很容易发现原方程是无解的。则方程ax + by = 1有正整数对解(x, y)的必要条件是gcd(a, b) = 1,即a, b 互质。

此时正整数对解(x, y)可以通过扩展欧几里得算法求得。

对于方程ax + by = gcd(a, b);我们设解为x1,  y1

我们令a = b, b = a % b;

得到方程bx + a % by = gcd(b, a % b);

由欧几里得算法可以得到gcd(a, b) = gcd(b, a % b);

代入可得:bx + a % b y = gcd(a, b)

设此方程解为x2, y2

在计算机中我们知道: a % b = a - (a / b) * b;

代入方程化解得:

ay2 + b(x2 - (a / b) y2) = gcd(a, b);

与ax1 + by= gcd(a, b) 联立,我们很容易得:

x1 = y2, y1 = x- (a / b)y2;

然后我们就这样可以解出来了。

等等我们似乎忘记一个东西了吧?对就是递归的终点。也就是最后方程的解x和y。

对于方程ay2 + b(x2 - (a / b) y2) = gcd(a, b);

当b = 0时,发现a * 1 + b * 0 = gcd(a, b)

则有x = 1, y = 0。

由此我们把ax + by = 1的其中一组解解出来了, 仅仅是其中一组解。

对于已经得到的解x1, y1;我们便可以求出通解。

我们设x = x1 + kt;t为整数

带入方程解得y = y1 - a * k / b * t;

而我们要保证y也为整数的话必须保证a * k /b也为整数,我们不妨令k = b/gcd(a, b);

所以通解为:

x = x1 + b / gcd(a, b) * t;

y = y1 -  a / gcd(a, b) * t;

其中t为整数。

附上伪代码:

int a, b, x, y;

int extgcd(int a, int b,int &x, int &y){
int d = a;
if(b != 0){
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
}
else x = 1, y = 0;
return d;
}//d = gcd(a, b);

扩展欧几里得算法还可以用来解如下方程:

ax = mt + b,ax - mt = b

这种形式不就是前面的形式吗?

扩展欧几里得算法(extgcd)的更多相关文章

  1. noip知识点总结之--欧几里得算法和扩展欧几里得算法

    一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a  ...

  2. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  3. vijos1009:扩展欧几里得算法

    1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...

  4. ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)

    1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...

  5. 浅谈扩展欧几里得算法(exgcd)

    在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...

  6. (light oj 1306) Solutions to an Equation 扩展欧几里得算法

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...

  7. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  8. 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)

    题面 题目描述 给出一个有理数 c=\frac{a}{b}  ​ ,求  c mod19260817  的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...

  9. 【learning】 扩展欧几里得算法(扩展gcd)和乘法逆元

    有这样的问题: 给你两个整数数$(a,b)$,问你整数$x$和$y$分别取多少时,有$ax+by=gcd(x,y)$,其中$gcd(x,y)$表示$x$和$y$的最大公约数. 数据范围$a,b≤10^ ...

随机推荐

  1. Java基础知识学习(五)

    高级特性:接口 接口(Interface) 1) 接口中只能定义抽象方法,默认为 public abstract 的,变量可以是static的 2) 接口中没有构造方法 3) 一个接口不实现另一个接口 ...

  2. 发现IE6的一个BUG,添加受信任站点后,页面无法跳转

    最近客户爆了一个问题,说是最近使用我们的系统,一登录浏览器就直接关闭了.   经排查,属于IE6设置受信任站点的问题,受信任站点设置了通配符,如 http://192.168.1.* 这样的格式,而我 ...

  3. php配置php-fpm启动参数及配置详解

    约定几个目录 /usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini一,php-fpm ...

  4. php框架laravel:数据库建立:artisan

    aravel 迁移是一种数据库的版本控制.迁移通常和 结构生成器 配对使用来管理您应用程序的数据库结构. 配置数据库 我们安装wamp,并且使用mysql方式.用wamp自带的phpMyAdmin添加 ...

  5. MySQL 优化之 index merge(索引合并)

    深入理解 index merge 是使用索引进行优化的重要基础之一.理解了 index merge 技术,我们才知道应该如何在表上建立索引. 1. 为什么会有index merge 我们的 where ...

  6. Linux软件的卸载

    configure作用:是源码安装软件时配置环境用的 他根据你的配置选项和你的系统情况生成makefile文件 为make 做准备 最常用的参数: ./configure --prefix 作用: 不 ...

  7. YUV420查表法高效、无失真的转换为RGB32格式

    YUV格式有两大类:planar和packed.planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V,这里所讲述的就是这中存储格式的:packed的YUV ...

  8. 深度学习笔记------windows系统下进行Linux-Ubuntu14.04双系统安装笔记(二)

    在上一篇文章中介绍了新手如何安装Ubuntu14.04的双系统,本文会说明Ubuntu系统下搜狗输入法的安装,并就我遇见的一些bug给出最简单的解决办法. 第一部分.搜狗输入法的安装 本身搜狗输入法的 ...

  9. /etc/fstab 参数详解及如何设置开机自动挂载

    某些时候当Linux系统下划分了新的分区后,需要将这些分区设置为开机自动挂载,否则,Linux是无法使用新建的分区的. /etc/fstab 文件负责配置Linux开机时自动挂载的分区. Window ...

  10. android 布局下划线

    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_cont ...