欧几里德算法 & 扩展欧几里德算法 & 求解丢番图方程
来源:互联网 发布:怎么看网络直播 编辑:程序博客网 时间:2024/05/23 19:22
欧几里德算法
即辗转相除法,计算整数A, B最大公约数。
基本算法:设 a = kb + r,其中a,b,k,r都是整数,则 gcd(a,b) = gcd(b,r),即 gcd(a,b) = gcd(b,a%b) 。证明:
a = kb + r; 则r = a%b ;设m为 a , b 的一个公约数,则 m|a , m|b,而 r = a - kb; 所以 m|r (注:m整除r,r能被m整除),因此m也是 (b , a%b) 的公约数;
设m为 b , r 的一个公约数,则 m|b , m|r,而 a = r + kb; 所以 m|a ,因此m也是 (a , b) 的公约数;
因此 (b , a%b) 与 (a , b) 公约数相同,最大公约数也一定相同,得证。
算法的C语言实现:
int gcd(int a,int b){ if(b==0) return a; return gcd(b, a%b);}
扩展欧几里德算法
基本算法:对于不完全为 0 的非负整数 a,b,必然存在整数对 x,y ,使得 ax + by = gcd(a,b) 。证明:
前文得证 gcd(a,b) = gcd(b, a%b) ;所以 ax + by = bx1 + a%by1 ;
化简得 ax + by = ay1 + b(x1 - (a/b)*y1) ;
得到:x = y1 ; y = b(x1 - (a/b)*y1) ;
递归的最终停止结果为 a = gcd( a , b) , b = 0 , 此时 x = 1 , y = 0 ;
扩展欧几里德递归代码实现:
int exgcd(int a,int b,int &x,int &y){ if(b == 0) { x = 1; y = 0; return a; } int r = exgcd(b,a%b,x,y); int temp = x; x = y; y = temp-a/b*y; return r;}
扩展欧几里德算法求解丢番图方程
用扩展欧几里德算法求解丢番图方程 ax + by = c , 系数 a, b, c 为任意整数。
丢番图方程有解的充要条件为 c % gcd( a , b ) == 0 。
由前一章节可知 ax + by = gcd(a,b) 存在整数解, 因此 c % gcd( a , b ) == 0 为丢番图方程有解的充分条件(为什么是必要条件还不清楚?)
代码实现的话与扩展欧几里德算法基本相同, 不同的地方就是最后的结果 x和y 要乘上倍数 c / gcd ( a, b) 。
阅读全文
0 0
- 欧几里德算法 & 扩展欧几里德算法 & 求解丢番图方程
- 欧几里德算法的扩展-求解不定方程
- 扩展欧几里德算法求解线性同余方程
- 扩展欧几里德算法求解线性同余方程
- 扩展欧几里德算法求解线性同余方程
- 扩展欧几里德算法求解线性同余方程
- 欧几里德算法 & 扩展欧几里德算法
- 扩展欧几里德算法求不定方程
- 数论,扩展欧几里德算法,同余方程
- 欧几里德和扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- ???Finding the Radius for an Inserted Circle
- heap和stack有什么区别?
- GIT
- Android----INSTALL_FAILED_USER_RESTRICTED错误
- JZOJ 5379. 【NOIP2017提高A组模拟9.21】Victor爱数字
- 欧几里德算法 & 扩展欧几里德算法 & 求解丢番图方程
- final、finally和finalize的区别
- JavaScript学习笔记-01类型
- 计蒜客: 最大的快乐指数(树形DP)
- javaweb未全站https化,因tomcat版本导致站内http请求出错解决
- MySQL中存储过程无限报错的问题(delimiter)
- JavaScript学习笔记-02对象创建方式
- mem类函数
- python爬取京东机票,监控机票,机票价格分析