扩展欧几里得 【记录】
2015-10-17 18:42
176 查看
原始的欧几里得算法只能求解gcd(a, b),有两种写法
迭代写法:
递归写法:
扩展欧几里得算法应用:
定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。
定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。
定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。
对a*x + b*y = gcd(a, b) = d,求解gcd(a, b),x和y。
求出的x和y可能是负数或0,但是|x| + |y|最小。
扩展后,可以求解a*x + b*y = c中的x和y,其中c % d == 0才有解。
代码:
计算模n下a的逆元,不存在返回-1。
注意:
若 a == b (mod n) 能推出下面2条等式
1:(a+c) == b+c (mod n)
2:ac == bc (mod n) (但 ac == bc(mod n) 不能推出 a == b(mod n))
迭代写法:
LL gcd(LL a, LL b) { LL t; while(b) { t = b; b = a%b; a = t; } return a; }
递归写法:
LL gcd(LL a, LL b){ return b == 0 ? a : gcd(b, a%b); }
扩展欧几里得算法应用:
定理一:如果d = gcd(a, b),则必能找到正的或负的整数k和l,使d = a*x+ b*y。
定理二:若gcd(a, b) = 1,则方程ax ≡ c (mod b)在[0, b-1]上有唯一解。
定理三:若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。
对a*x + b*y = gcd(a, b) = d,求解gcd(a, b),x和y。
求出的x和y可能是负数或0,但是|x| + |y|最小。
扩展后,可以求解a*x + b*y = c中的x和y,其中c % d == 0才有解。
代码:
//求解ax + by = gcd(a, b) = d,可以求出x和y。 //x和y可能是负数或者0 且求出的|x| + |y|最小 void gcd(LL a, LL b, LL &d, LL &x, LL &y) { if(!b) { d = a; x = 1; y = 0; } else { gcd(b, a%b, d, y, x); y -= x * (a / b); } }
计算模n下a的逆元,不存在返回-1。
LL inv(LL a, LL n)//计算%n下 a的逆。如果不存在逆return -1; { LL d, x, y; extend_gcd(a, n, d, x, y); return d == 1 ? (x + n) % n : -1; }
注意:
若 a == b (mod n) 能推出下面2条等式
1:(a+c) == b+c (mod n)
2:ac == bc (mod n) (但 ac == bc(mod n) 不能推出 a == b(mod n))
相关文章推荐
- 重温常见排序法
- 同步和异步的初步理解?
- Android 命名规范 (提高代码可以读性)
- 第几天?
- 无法打开物理文件 "E:\GES系统\数据库\DB_GES.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server,错误: 5120)
- matlab 产生向量
- MyEclipse 10连接SQL Server 2008数据库
- Objective-C:自定义Block函数
- SPOJ GSS2 Can you answer these queries II
- 1027. 打印沙漏(20)
- 计算两点间的距离
- Cisco NAT --- 从内网用公网IP地址访问内网服务器
- 顺序栈的简单操作
- 三角形
- 调试libstdc++内部的函数
- 1026. 程序运行时间(15)
- SharedPreferences
- BroadcastReceiver应用详解
- 设置和删除环境变量
- LeetCode 4: Median of Two Sorted Arrays