欧几里德与扩展欧几里德算法
2016-06-27 21:58
267 查看
欧几里德算法(辗转相除法) 可用于计算两个整数a,b的公约数和公倍数
定理:gcd(a, b) = gcd(b , a%b)
int gcd(int a,int b)
{
return b ? gcd(b,a%b):a;
}
最小公倍数是:
a/gcd(a,b)*b
扩展欧几里德算法
基本算法:对于不完全为 0 的非负整数 a,b,必然存在整数对 x,y ,使得
gcd(a,b)=ax+by
★★用类似辗转相除法,求二元一次不定方程47x+30y=1的整数解。(网上看到的推导过程 觉得很好理解)
47=30*1+17
30=17*1+13
17=13*1+4
13=4*3+1
然后把它们改写成“余数等于”的形式
17=47*1+30*(-1) //式1
13=30*1+17*(-1) //式2
4=17*1+13*(-1) //式3
1=13*1+4*(-3)
然后把它们“倒回去”
1=13*1+4*(-3) //应用式3
1=13*1+[17*1+13*(-1)]*(-3)
1=13*4+17*(-3) //应用式2
1=[30*1+17*(-1)]*4+17*(-3)
1=30*4+17*(-7) //应用式1
1=30*4+[47*1+30*(-1)]*(-7)
1=30*11+47*(-7)
得解x=-7, y=11。
具体代码如下:
扩展欧几里德应用:
同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。
在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。
这时称求出的 x 为 a 的对模 n 乘法的逆元。
对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程
ax+ ny=同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。
在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。
这时称求出的 x 为 a 的对模 n 乘法的逆元。
对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程
ax+ ny= 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。
定理:gcd(a, b) = gcd(b , a%b)
int gcd(int a,int b)
{
return b ? gcd(b,a%b):a;
}
最小公倍数是:
a*b/gcd(a,b)不过我们为了防止a*b的溢出 采取先除后乘
a/gcd(a,b)*b
扩展欧几里德算法
基本算法:对于不完全为 0 的非负整数 a,b,必然存在整数对 x,y ,使得
gcd(a,b)=ax+by
★★用类似辗转相除法,求二元一次不定方程47x+30y=1的整数解。(网上看到的推导过程 觉得很好理解)
47=30*1+17
30=17*1+13
17=13*1+4
13=4*3+1
然后把它们改写成“余数等于”的形式
17=47*1+30*(-1) //式1
13=30*1+17*(-1) //式2
4=17*1+13*(-1) //式3
1=13*1+4*(-3)
然后把它们“倒回去”
1=13*1+4*(-3) //应用式3
1=13*1+[17*1+13*(-1)]*(-3)
1=13*4+17*(-3) //应用式2
1=[30*1+17*(-1)]*4+17*(-3)
1=30*4+17*(-7) //应用式1
1=30*4+[47*1+30*(-1)]*(-7)
1=30*11+47*(-7)
得解x=-7, y=11。
具体代码如下:
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 t = y; y = x - (a/b)*y; x = t; return r; }
扩展欧几里德应用:
同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。
在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。
这时称求出的 x 为 a 的对模 n 乘法的逆元。
对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程
ax+ ny=同余方程ax≡b (mod n),如果 gcd(a,n)== 1,则方程只有唯一解。
在这种情况下,如果 b== 1,同余方程就是 ax=1 (mod n ),gcd(a,n)= 1。
这时称求出的 x 为 a 的对模 n 乘法的逆元。
对于同余方程 ax= 1(mod n ), gcd(a,n)= 1 的求解就是求解方程
ax+ ny= 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。 1,x, y 为整数。这个可用扩展欧几里德算法求出,原同余方程的唯一解就是用扩展欧几里德算法得出的 x 。
相关文章推荐
- 九度OJ 1008 最短路径问题
- iOS Category
- Java 二进制,八进制,十进制,十六进制转换
- android开发性能分析
- java将小写的日期转换为大写的日期
- 欢迎界面动画
- Docker 无法删除images
- Memcached全面剖析
- Java软件安装
- 全是套路——字符串排序
- 深入理解Java的接口和抽象类
- 用html 和css 写了一个简单的空页面
- XML---DTD
- Spring Data MongoDB : Update document
- 修饰符
- iOS开发之xib技巧介绍
- 电信技术名词解释:什么是分组交换
- java I/O 输入输出流的编码问题
- Volley框架的理解以及自定义各个对象
- Apache Avro使用入门指南