扩展欧几里得算法
来源:互联网 发布:如何进入淘宝卖家中心 编辑:程序博客网 时间:2024/06/03 15:54
先说一下欧几里得算法是什么,就是小学学过的辗转相除法,用来求gcd的。大概是像这样的:
int gcd(int a,int b){if(b==0) return a;gcd(b,a%b);}然后我们在这段代码上加一些奇奇怪怪的东西,就变成扩展欧几里得了。顺便解释一下扩展欧几里得是什么,就是一种方法来求ax+by=gcd(a,b),的特殊解的。相信大家想起来初中老师讲不定方程时的方法了吧。
没错,这就是扩欧。下面我们推一波公式:
假设我们已经求出了bx1+a%b*y1=gcd(b,a%b),求ax+by=gcd(a,b)。
因为gcd(a,b)=gcd(b,a%b)
bx1+(a-a/b*b)y1=gcd(a,b)
ay1+b(x1-a/b*y1)=gcd(a,b)
根据上面的对应
x=y1;y=x1-a/b*y1
ps:gcd(a,b)=gcd(b,a%b)
而且我们知道了ax+0*y=gcd(a,0)的解,所以可以使用exgcd求出ax+by=gcd(a,b)的特殊解。
代码大概长这样:
int exgcd(int a,int b){if(b==0){x=1;y=0;return y;}gcd(b,a%b);int t=y;y=x-a/b*y;x=t;}然后扩展欧几里得有一个比较有用的东西,就是求逆元。(a*b)%mod=1,则定义a与b互为逆元。现在我们知道b,mod,求a。
则a*b=1+y*mod
a*b+y*mod=1。
是不是和刚刚那个式子长得很像呀,是不是就可以用扩欧求了呀。
然后补充一波逆元的公式求法:
1、定义f(i)是i在模mod下的逆元。f(i)=(-mod/i)*f(mod%i)
2、定义f(i)是i!在模mod下的逆元。f(i)=f(i+1)*(i+1)%mod
然后就是注意取模!!!
阅读全文
0 0
- 欧几里得算法&&扩展欧几里得算法
- 欧几里得算法/扩展欧几里得算法
- 欧几里得算法&&扩展欧几里得算法
- 欧几里得、扩展的欧几里得算法
- 欧几里得及欧几里得扩展算法
- 欧几里得、扩展的欧几里得算法 .
- 欧几里得与扩展欧几里得算法
- 欧几里得和扩展欧几里得算法
- 欧几里得和扩展欧几里得算法
- 欧几里得算法及扩展欧几里得
- 欧几里得和扩展欧几里得算法
- 欧几里得, 扩展欧几里得算法模板
- 欧几里得算法及其扩展
- 扩展的欧几里得算法
- 扩展的欧几里得算法
- 欧几里得扩展算法
- 扩展欧几里得算法
- 扩展欧几里得算法
- Python解释器
- 论人生第一次写启发式搜索(一次靠暴力rank1的悲惨总结)
- 文通手机车牌识别优势
- Spring中bean的生命周期
- iframe嵌套微信网页,图片音频无法显示问题
- 扩展欧几里得算法
- Ubuntu 16.04中安装tftp
- vim基礎memo
- 查看Linux系统架构类型的5条常用命令
- xss发送请求
- docker新手快速入门
- Android搜索关键字过滤并高亮
- Redis 数据备份与恢复
- android activity 绘制完成之后 MessageQueue.IdleHandler