扩展欧几里德算法
来源:互联网 发布:java c base64 编辑:程序博客网 时间:2024/06/02 10:25
一 题目:
扩展欧几里德算法 不仅能够求出两个正整数a 和 b 的最大公约数d,还能求出两个整数x和y(不一定为正),使得 ax+by =d
二 分析该问题
基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。
证明:设 a>b。
1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2,ab!=0 时
设 ax1+by1=gcd(a,b);
bx2+(a mod b)y2=gcd(b,a mod b);
根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);
则:ax1+by1=bx2+(a mod b)y2;
即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;
根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
因此该问题的递归过程可定义为: b!=0时, t=x; x=y; y= x-(a/b)*y;
三 代码实现
扩展欧几里德的递归代码:
1 int exgcd(int a,int b,int &x,int &y) 2 { 3 if(b==0) 4 { 5 x=1; 6 y=0; 7 return a; 8 } 9 int r=exgcd(b,a%b,x,y);10 int t=x;11 x=y;12 y=t-a/b*y;13 return r;14 }四 注意 该过程也可用非递归来实现,详细可参考 点击打开链接
0 0
- 欧几里德算法 & 扩展欧几里德算法
- 欧几里德和扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德算法及扩展欧几里德
- 欧几里德与扩展欧几里德算法
- 欧几里德和扩展欧几里德算法
- android tips—启动Emergency call拨号盘
- GCC 编译使用动态链接库和静态链接库的方法
- java的深拷贝和浅拷贝
- 百度三道面试题 答案
- 使用JVM TI技术实现JVM监控
- 扩展欧几里德算法
- JavaMail实现邮件发送
- to solve gem install timeout
- 5-2 派生类的构造函数
- Android个性闹钟——摇摇醒
- linux运维常用命令
- 6.拦截器(Interceptor)
- 一点心得体会
- 在Linux(ubuntu10.10)系统中使用摄像头之USB摄像头