gcd欧几里德算法/extgcd扩展欧几里德算法以及在解不定方程中的应用
来源:互联网 发布:中科院分词 python 编辑:程序博客网 时间:2024/05/12 16:37
这个应该是我在noip前就应该会的东西 ,但是当时也许只是记下了代码吧 ,现在有诸多的不理解。后来借着书和几篇博客弄懂了并小证了一下,鉴于网上有些博客关于这个的写的真的不好看,所以自己来总结一下,顺带以后也能看。
顺带一提,
欧几里德算法
辗转相除法求最大公约数问题,同可求最小公倍数。
既然是辗转相除法,自然就是%%%,%到互相整除为止。代码也很详尽简洁。
int regulargcd(int x,int y){ return y==0?x:(regulargcd(y,x%y));}
最小公倍数为两数之积除以他们的最大公约数,相信大家都能明白。
扩展欧几里德算法
我之前一直困惑的是它为什么可以求不定方程的解,后来基本明白了:
给定一个形如方程
我们知道
所以说,假设我们有
再推到一般,若
然后接下来我们考虑特殊解的情况:
于是我们来找
于是原方程解为
这样我们就能递归地计算方程的解了。
int extgcd(int a,int b,int &x,int &y){ if(b==0) { x=1; y=0; return a; } else { int ans; ans=extgcd(b,a%b,x,y); int tmp=x; x=y; y=tmp-(a/b)*y; return ans; }}
不定方程不是有很多解吗?是的,这只是最小解。设最小解为
while(x<=0) { x+=(b/res); } printf("%d\n",x);
例题:zoj3609求逆元
方法同上,AC代码
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <vector>#include <queue>//zoj3609 ACusing namespace std;int extgcd(int a,int b,int &x,int &y){ if(b==0) { x=1; y=0; return a; } else { int ans; ans=extgcd(b,a%b,x,y); int tmp=x; x=y; y=tmp-(a/b)*y; return ans; }}int regulargcd(int x,int y){ return y==0?x:(regulargcd(y,x%y));}int main(){ int a,b; int cas; scanf("%d",&cas); for(int z=0;z<cas;z++) { scanf("%d%d",&a,&b); int x,y; if(regulargcd(a,b)==1) { int res=extgcd(a,b,x,y); if(x>0) { printf("%d\n",x); } else { while(x<=0) { x+=(b/res); } printf("%d\n",x); } } else { printf("Not Exist\n"); } } return 0;}
关于逆元,请移步逆元-wiki
谢谢看到这里
- gcd欧几里德算法/extgcd扩展欧几里德算法以及在解不定方程中的应用
- 扩展欧几里德算法求不定方程
- 欧几里德算法的扩展-求解不定方程
- HDU 1222 Wolf and Rabbit //gcd+欧几里德算法求解不定方程的应用
- HDU 1576 扩展欧几里德算法求二元一次不定方程
- 『转』扩展欧几里德算法求不定方程
- uva 12169 扩展欧几里德解不定方程
- 扩展欧几里德解二元一次不定方程
- 欧几里德算法 & 扩展欧几里德算法 & 求解丢番图方程
- 欧几里德算法 & 扩展欧几里德算法
- 数论,扩展欧几里德算法,同余方程
- 欧几里德和扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 欧几里德与扩展欧几里德算法
- 使用POI组件操作Excel文档
- android基础学习1————用户注册界面
- C++之cmath常用库函数一览
- Qt音乐进度条的实现仿网易云音乐
- iOS 生成缩略图
- gcd欧几里德算法/extgcd扩展欧几里德算法以及在解不定方程中的应用
- Wolf从零学编程-用Django撸个Blog(四)
- 密码协议概述
- 顾客显示器通信
- listview显示不同条目的Adapter
- RecycleView使用
- java.lang.NoClassDefFoundError: org/hibernate/annotations/Entity
- hdu 6015 Skip the Class
- vs2012创建WCF应用程序