首页 > 代码库 > 【数论】扩展欧几里得算法
【数论】扩展欧几里得算法
扩展欧几里得
上回刚写完欧几里得,那现在还有一个东西叫拓展欧几里得:
扩展欧几里得法是一个在求解同余方程等问题上的一个很好的方法,其具体功能如下:
在已知(a,b)时,求解一组(p,q)使得p*a+q*b=GCD(a,b)
首先,根据数论中的原理,解一定是存在的。
我们可以设a对于GCD(a,b)的倍数是k,b对于GCD(a,b)的倍数是l
那么p*(GCD(a,b)*k)+q*(GCD(a,b)*l)=GCD(a,b)
可以推出:p*k*GCD(a,b)+q*l*GCD(a,b)=GCD(a,b)
两边同时除以GCD(a,b),可得p*k+q*l=1
那么我们求解的是一个二元一次不定方程,它是一定有解的。
其次,因为我们知道GCD(a,b)=GCD(b,a%b)
所以p*a+q*b=GCD(a,b)=GCD(b,a%b)=p*b+q*a%b=q*(a-a/b*b)=q*a+(p-a/b*q)*b
这样这个方程就化简为了b与a%b的线性组合。
那么最终的代码是这样的:
#include<iostream>using namespace std;int extended_GCD(int a,int b,int &x,int &y){ if(b==0){ x=1,y=0; return a; } int ans=extended_GCD(b,a%b,x,y); int tmp=x; x=y; y=tmp-a/b*y; return ans;//返回的是GCD(a,b)}int main(){ int a,b,x,y,z; cin>>a>>b; z=extended_GCD(a,b,x,y); cout<<z<<" "<<x<<" "<<y; return 0;}
【数论】扩展欧几里得算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。