扩展欧几里德算法(数论初步) By ACReaper
来源:互联网 发布:淘宝图片下载工具 编辑:程序博客网 时间:2024/04/29 19:17
扩展欧几里德算法主要用来求ax + by = d这样的等式的整数解,当且仅当gcd(a,b) = d时该算法可直接求该等式,当gcd(a,b) != d时,可先求ax + by = gcd(a,b),然后按照进行值统一法,见解求解。
首先统一如下知识
1. a mod b = a - floor(a / b) * b
其实这个等式只是用数学语言描述的很严格,我们以前上小学时就学过了怎么计算除法,除不进就有余数,那是的那种方法其实就是向下取整的求法。
2.其实这个算法要理解并不难,关键是人家怎么想到的,首先我们知道gcd(a,b) == gcd(b, a mod b),也就是说ax + by = gcd(b,a mod b) = .... 直到 a’ mod b‘ == 0即gcd(b’,a' mod b'== 0),此时就代表着系数a = b‘,b = 0,我们就可以直接求出x的值了,于是又可一回代入上层的gcd(a’,b')。
算法分析:
对于b != 0,Extended-Euclid(a,b),先计算d' = gcd(b, a mod b)和d‘ = bx’ + (a mod b)y‘(由ax + by = gcd(a,b)可知),于是有d = d’ = bx‘ + (a - floor(a / b) b)y’ = ay' + b(x' - floor(a/b)y')
所以算法(伪代码)可如下
Extended-Euclid(a,b)
if(b == 0)
return (a,1,0)//gcd(a,0) == a,ax + 0 = a,x == 1
(d',x',y') = Extend-Euclid(b, a mod b)
(d,x,y) = (d',y',x' - floor(a / b)y')
return (d,x,y);
我的C代码实现
#include <stdio.h>void Extend_Eculid(int a,int b,int &d,int &x,int &y){if(b == 0){d = a,x = 1,y = 0;}else{int x1,y1;Extend_Eculid(b, a % b,d,x1,y1);x = y1,y = x1 - (a /b) * y1; }}int main(){int d,x,y;Extend_Eculid(99,78,d,x,y);printf("%d %d %d",d,x,y);}
- 扩展欧几里德算法(数论初步) By ACReaper
- 幂取模(数论初步) By ACReaper
- 除法表达式(数论初步) By ACReaper
- 模线性方程(数论初步) By ACReaper
- 数论/扩展欧几里德算法
- 数论初步之扩展欧几里德
- 数论初步之欧几里德算法
- 【数论】[总结]扩展欧几里德算法
- 初等数论-扩展欧几里德算法
- 无平方因子的数(数论初步) By ACReaper
- 简单素数筛选法介绍(数论初步) By ACReaper
- 直线上的点(数论初步) By ACReaper
- 同余与模运算(数论初步) By ACReaper
- 大整数取模(数论初步) By ACReaper
- HDU-2669(数论初步之扩展欧几里德)
- 【ACM_数论初步】欧几里德算法及其应用
- 数论,扩展欧几里德算法,同余方程
- 扩展欧几里德算法与数论倒数
- 黑马程序员--命名空间、字符串
- 遗传算法(GA)的matlab实现
- .Net下客户端与远端服务器网络通信与文件传送的实例
- poj1011
- 黑马程序员-- 继承
- 扩展欧几里德算法(数论初步) By ACReaper
- 程序中时间的分析及探讨
- 画表格 在图形环境中很容易做出漂亮的表格。但在控制台环境中就比较困难了。 有的时候可以用一些符号大略地模拟:(word文档中可能不整齐,拷贝到记事本中看)
- Android之使用wifi连接adb
- php获取网页内容方法总结
- Apache SSL安装与配置教程(Linux系统)
- 黑马程序员-java面向对象
- 装了red hat后无法启动win7
- 程序算法与人生选择