扩展欧几里得算法(extgcd)
相信大家对欧几里得算法,即辗转相除法不陌生吧。
代码如下:
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 + by1 = gcd(a, b) 联立,我们很容易得:
x1 = y2, y1 = x2 - (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)的更多相关文章
- noip知识点总结之--欧几里得算法和扩展欧几里得算法
一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a ...
- 欧几里得算法与扩展欧几里得算法_C++
先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...
- vijos1009:扩展欧几里得算法
1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...
- ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)
1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...
- 浅谈扩展欧几里得算法(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...
- (light oj 1306) Solutions to an Equation 扩展欧几里得算法
题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...
- 『扩展欧几里得算法 Extended Euclid』
Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...
- 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)
题面 题目描述 给出一个有理数 c=\frac{a}{b} ,求 c mod19260817 的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...
- 【learning】 扩展欧几里得算法(扩展gcd)和乘法逆元
有这样的问题: 给你两个整数数$(a,b)$,问你整数$x$和$y$分别取多少时,有$ax+by=gcd(x,y)$,其中$gcd(x,y)$表示$x$和$y$的最大公约数. 数据范围$a,b≤10^ ...
随机推荐
- SQL Server 2000 sp2 及更低版本不受此版本的 Windows 支持
SQL Server 2000 sp2 及更低版本不受此版本的 Windows 支持.在安装了 SQL Server 2000 之后请应用 sp3. 出现这种现象的原因在于:Windows Serve ...
- lsattr, chattr
lsattr $lsattr #查看文件的隐藏属性 $lsattr -------------e- ./bookmarks-2016-10-11.json -------------e- ./rxvt ...
- C语言(函数)学习之index、rindex
函数定义:char *index(const char *s, int c); 头文件: #include strings.h 函数说明:index()用来找出参数s 字符串中第一个出现的参数c ...
- 理解 OpenStack + Ceph (4):Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]
本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...
- Beyond IT
Know Yourself <开讲啦> 20160306 潘建伟:探索的动机
- 123——Appium Girls活动
有感于Ruby Girls和Python Girls,在15年就想组织一次移动测试的妹子活动,框架选择Appium, 从15年夏天开始准备,申请Google的会议室,招募教练,开放报名,审核报名,到正 ...
- 一些重要的mel命令
一些重要的mel命令 查询多边形顶点 xform -q -worldSpace -t "pCylinderShape1.vtx[0]" 设置顶点坐标 xform -objectSp ...
- 如何为logo配色
原网链接:http://design.jobbole.com/125287/ 色彩是带有情绪的.我们能感知到的色彩能带来各种各样的情绪,也能传达一种思想或一种文化. 企业logo的色彩就是利用上面的原 ...
- Java读写文本文件
1 字符输入(FileReader , char) import java.io.IOException; import java.io.FileReader; public class ep10_1 ...
- C语言--指向多维数组的指针和指针数组
#include <stdio.h> //void show(char *p[]); ]); int main(){ ][]={","abc","x ...