扩展欧几里得算法
来源:互联网 发布:欧洲右翼崛起知乎 编辑:程序博客网 时间:2024/06/09 14:14
如果事先不了解 欧几里得算法 ,请点击。
扩展欧几里得算法:对于不完全为0的非负整数 a,b,必然存在整数对 X,Y,使得 aX + bY = gcd(a,b)。
解法见注释。
/* How to solve "aX + bY = gcd(a,b)" ?1、if b=0, gcd(a,b) = a, X = 1 , Y is any number. For convenience,we make Y equals 0.2、if b!=0, gcd(a,b) = aX1 + bY1; gcd(b,a%b) = bX2 + (a%b)Y2; ----> (a-a/b*b)Y2;--> aX1 + bY1 = aY2 + b(X2-a/b*Y2);--> X1 = Y2 , Y1 = X2-a/b*Y2; So we can use recursion to sovle it.*/#include <stdio.h>int GCD;void ExGcd(int a,int b,int &x,int &y){ if(b == 0) { x = 1; y = 0; GCD = a; return ; } ExGcd(b,a%b,x,y); int t = x; x = y; y = t - a/b*y;}int main(){ int a,b,x,y; scanf("%d%d",&a,&b); ExGcd(a,b,x,y); printf("gcd(%d,%d) -> %d * %d + %d * %d\n",a,b,a,x,b,y);return 0;}下面讨论如何用扩展欧几里得算法解决不定方程 aX + bY = c。
1、当 c mod gcd(a,b) = 0 的时候,该方程才有整数解。
2、方程可转化为 aX + bY = gcd(a,b) * c/gcd(a,b)。
等价于 aX/(c/gcd(a,b)) + bY/(c/gcd(a,b)) = gcd(a,b)。
所以将方程 aX + bY = gcd(a,b) 的解乘以 c/gcd(a,b) 即可得到解 X0,Y0。
对于上述两个方程的其他解,我们可以用方程 a(X0+△X) + b(Y0+△Y) = c 表示。
于是得到 a△X + b△Y = 0,即 △X / △Y = - b/a = - ( b/gcd(a,b) ) / ( a/gcd(a,b) ) = t。( t 为与X、Y无关的参数)
于是方程的所有解可以用 X = X0 + b/gcd(a,b)*z , Y = Y0 - a/gcd(a,b)*z 来表示。( z 为任意整数)
另外有一个没有证明过的猜想:利用上述方法求出的 (X0,Y0) 是所有 |X| + |Y| 的值中最小的(并不一定唯一),从而有X0 < |b|。(假设a < b)
- 欧几里得算法&&扩展欧几里得算法
- 欧几里得算法/扩展欧几里得算法
- 欧几里得算法&&扩展欧几里得算法
- 欧几里得、扩展的欧几里得算法
- 欧几里得及欧几里得扩展算法
- 欧几里得、扩展的欧几里得算法 .
- 欧几里得与扩展欧几里得算法
- 欧几里得和扩展欧几里得算法
- 欧几里得和扩展欧几里得算法
- 欧几里得算法及扩展欧几里得
- 欧几里得和扩展欧几里得算法
- 欧几里得, 扩展欧几里得算法模板
- 欧几里得算法及其扩展
- 扩展的欧几里得算法
- 扩展的欧几里得算法
- 欧几里得扩展算法
- 扩展欧几里得算法
- 扩展欧几里得算法
- Computer Networks
- 文本框禁止切换输入法。
- 【zz】对Linux的进程内核栈的认识
- Ajax与JSON的一些总结
- 字符输入限制正则表达式
- 扩展欧几里得算法
- VTK简介
- servlet 对传输数据进行压缩
- UVA 10137 旅行
- 详解Java多态性(转)
- S3C2440A工程移植:从ADS1.2到RealView MDK
- Ubuntu开机自动挂载硬盘的权限问题
- SQL 的包含查询 例子:根据IP获得省市名称,然后再获得市的ID
- Java与云计算