扩展欧几里德算法
来源:互联网 发布:用java编写三角形 编辑:程序博客网 时间:2024/06/13 01:52
扩展欧几里德算法
基本算法:对于不完全为 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,所以递归可以结束。
扩展欧几里德的递归代码:
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 }
扩展欧几里德非递归代码:
1 int exgcd(int m,int n,int &x,int &y) 2 { 3 int x1,y1,x0,y0; 4 x0=1; y0=0; 5 x1=0; y1=1; 6 x=0; y=1; 7 int r=m%n; 8 int q=(m-r)/n; 9 while(r)10 {11 x=x0-q*x1; y=y0-q*y1;12 x0=x1; y0=y1;13 x1=x; y1=y;14 m=n; n=r; r=m%n;15 q=(m-r)/n;16 }17 return n;18 }
0 0
- 欧几里德算法 & 扩展欧几里德算法
- 欧几里德和扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德算法及扩展欧几里德
- 欧几里德与扩展欧几里德算法
- 欧几里德和扩展欧几里德算法
- JRTPLIB 3.9.1 类大全
- 欧几里德算法
- web前端研发工程师
- ios即时通讯客户端开发之-mac上搭建openfire服务器
- CSS浏览器兼容问题集 (三)
- 扩展欧几里德算法
- 引力波是怎样产生的?
- CSS浏览器兼容问题集(四)
- 华为OJ_2168_字符串排序
- 易信公众平台开发从入门到精通之获取凭证
- Codeforces 439A Devu, the Singer and Churu, the Joker
- 浏览器兼容问题汇总
- ZOJ-1831
- VS08调C数据结构