欧几里德算法扩展
2017-10-11 16:59
148 查看
欧几里德算法(辗转相除法)
由计算公式gcd(a,b) = gcd(b,a%b)得到算法如下:
欧几里德扩展
欧几里德扩展用来求方程ax+by = 1的解
首先进行第一个状态的转换:
我们知道gcd(a,b) = gcd(b,a%b)
所以有bx+a%b*y = 1
又a%b = a-(a/b)*b
代入上式,得到ay1+b(x1-(a/b)y1) = 1
两式对比,有:
x = y1
y = x1-(a/b)y1
就是说我们可以从最后一个状态推到最初的状态,而最后一个状态b == 0
所以我们可以写出递归算法如下:
由计算公式gcd(a,b) = gcd(b,a%b)得到算法如下:
int gcd(int a,int b) { if(b == 0) return a; else return gcd(b,a%b); }
欧几里德扩展
欧几里德扩展用来求方程ax+by = 1的解
首先进行第一个状态的转换:
我们知道gcd(a,b) = gcd(b,a%b)
所以有bx+a%b*y = 1
又a%b = a-(a/b)*b
代入上式,得到ay1+b(x1-(a/b)y1) = 1
两式对比,有:
x = y1
y = x1-(a/b)y1
就是说我们可以从最后一个状态推到最初的状态,而最后一个状态b == 0
所以我们可以写出递归算法如下:
//递归方法一 int extgcd(int a,int b,int &x,int &y) { int ans; if(b == 0){ ans = a;x = 1;y = 0;} else{ extgcd(b,a%b,x,y); int temp = x; x = y; y = temp-(a/b)*y; } return ans; } //简化下代码,如下所示 //递归方法二 int extgcd(int a,int b,int &x,int &y) { int ans; if(b == 0){ ans = a;x = 1;y = 0;} else{ ans = extgcd(b,a%b,y,x); y -= (a/b)*x;} return ans; }
相关文章推荐
- 辗转相除法(欧几里得算法)java实现
- 快速幂。素数筛选。辗转相除。
- 欧几里德和扩展欧几里德算法
- Wolf and Rabbit (hdu_1222) 欧几里德
- Happy 2006 (poj_2773) 欧几里德
- 欧几里德 和 拓展欧几里德算法
- 欧几里德 java
- 扩展欧几里德
- 扩展欧几里德算法 线性同余方程 中国剩余定理
- poj 1061(数论之欧几里德及其扩展)
- 最大公倍数和最小公倍数
- 【暑期第二次训练赛】小火山的跳子游戏
- 最大公约数算法详解
- poj2115欧几里德扩展
- Java实现求最大公约数和最小公倍数
- 欧几里德算法及拓展
- 扩展欧几里德一系列算法
- 欧几里德算法&&扩展欧几里德算法 (小推+模板)
- mysql5.6数据库备份及授权
- SQL SUBSTRING_INDEX 函数用法