首页 > 代码库 > 同余方程(扩展欧几里得)
同余方程(扩展欧几里得)
#include<cstdio> using namespace std; int x,y; int gcd(int a,int b,int &x,int &y){ if(!b){ x=1,y=0; return a; } int ret=gcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return ret; } int a,b; int main(){ scanf("%d%d",&a,&b); gcd(a,b,x,y); printf("%d",(x+b)%b); }
欧几里得gcd(a,b)=gcd(b,a%b)=......
因为ax≡1(mod b) -》ax%b=1%b=1
所以ax+by=1,因为y是整数所以加个by就相当于%b(因为%b的本质是+上y个b),所以两个式子等价
由扩展欧几里得得 ax+by=gcd(a,b)=gcd(b,a%b)=bx+(a%b=a-a/b*b)*y=....(x,0)=x。(x是最大公约数,/是整除)
最后bx=b,(a%b)*y=0
所以得 x=1,y=0
因此递归就行了
x2=y1,y2=x1-a/b*y1(原x-整除的数*a/b=模数)
最后得到的是无数解中的一种,有可能是负的,只需要加上模数就行了
同余方程(扩展欧几里得)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。