扩展欧几里得求逆元
来源:互联网 发布:网络常用英文缩写 编辑:程序博客网 时间:2024/06/03 16:43
【转载】点击打开链接
用扩展欧几里得求解逆元是一种常用的方法,当然还有其他的方法。这里主要介绍两种,一种就是扩展欧几里得,另一种是不常用的方法。到后面会介绍。
你是否经常遇到过类似的问题 (A/B)%Mod 。此时,要先计算B%Mod的逆元p, 其实他是用逆元解决的典型题目。但是在使用逆元时候你需满足一下两个条件才能保证得到正确的结果。
一、gcd(B,Mod) == 1,显然素数肯定是有逆元的。
二、这里B需要是A的因子
下面就给出扩展欧几里得的典型式子:a*x + b*y = 1 求得x即为a%b的逆元; y即为b%a的逆元。
另一种方法是:p = b^(Mod-2) % Mod,因为b^(Mod-1)%Mod = 1(这里需要Mod为素数),因为这种方法不常用,因此这里不再详细介绍。
下面就给出求解逆元的模版(代码非原创)
扩展欧几里德求逆元模板: #include<iostream> #define __int64 long long using namespace std; //举例 3x+4y=1 ax+by=1 //得到一组解x0=-1,y0=1 通解为x=-1+4k,y=1-3k inline __int64 extend_gcd(__int64 a,__int64 b,__int64 &x,__int64 &y)//ax+by=1返回a,b的gcd,同时求的一组满足题目的最小正整数解 { __int64 ans,t; if(b==0){x=1;y=0;return a;} ans=extend_gcd(b,a%b,x,y);t=x;x=y;y=t-(a/b)*y; return ans; } //(a/b)%mod=c 逆元为p,(p*b)%mod=1 //(a/b)*(p*b)%mod=c*1%mod=c // (p*b)%mod=1 等价于 p*b-(p*b)/mod*mod=1其中要求p,b已知 等价于 ax+by=1 //其中x=p(x就是逆元),y=p/mod,a=b,b=b*mod 那么调用extend_gcd(b,b*mod,x,y)即可求(a/b)%mod的逆元等价于a*p%mod int main() { __int64 a,b,x,y,c,gcd,mod,p;//ax+by=c while(cin>>a>>b>>c) { gcd=extend_gcd(a,b,x,y); cout<<x<<" "<<y<<endl; if(c%gcd){cout<<"无解!"<<endl;continue;} cout<<"x="<<x*c/gcd<<" y="<<y*c/gcd<<endl; } return 0; }
void extend_Euclid(int a, int b) { if(b==0) { x = 1; y = 0; return; } extend_Euclid(b, a%b); int t = x; x = y; y = t - a/b*y; } int main() { //b%mod的逆元 int b,mod; while(cin>>b>>mod){ // x=0;y=0; extend_Euclid(b,mod); cout<<(x%mod+mod)%mod<<endl; } return 0; }
0 0
- 欧几里得扩展求逆元
- 扩展欧几里得求逆元
- 扩展欧几里得求逆元
- 扩展欧几里得求逆元
- 扩展欧几里得(求逆元)
- 扩展欧几里得求逆元:
- 乘数密码 扩展欧几里得求逆元
- hdu1576 扩展欧几里得算法求逆元
- 【欧几里得&扩展欧几里得】
- 欧几里得和扩展欧几里得
- 欧几里得 与 扩展欧几里得
- 欧几里得&扩展欧几里得
- 欧几里得和扩展欧几里得
- 欧几里得与扩展欧几里得
- 欧几里得和扩展欧几里得
- 欧几里得 与 扩展欧几里得
- 欧几里得 扩展欧几里得
- 欧几里得与扩展欧几里得
- C#中ref和out的使用小结
- 【OpenJudge】c语言_苹果和虫子
- 44.字符串逆序输出
- 文章标题
- Python中pass的作用
- 扩展欧几里得求逆元
- 校内ACM上出现Presentation Error的一点认识
- div.2/C. They Are Everywhere<two pointer>
- 地图导航ios(url)
- React-Native 对index.android.js的修改reload之后不能显示在模拟器上
- NOIP 2011 - 普及组 瑞士轮 归并排序 重庆一中高2018级竞赛班第四次测试 2016.7.25 Problem 4
- 题目4 ASCII码排序
- maven+eclipse项目问题报错原因(Cannot change version of project facet Dynamic web module to 2.5)
- java事件处理机制(自定义事件)