扩展欧几里得求乘法逆元

xiaoxiao2021-03-01  27

好久没发博客了,总结下今晚学的扩展欧几里得吧

虽然现在也没学会

ax + by = c

扩展欧几里得知道a b c 求x y

求乘法逆元

a*x = 1(mod m)

知道a和m 求x

先复习一下欧几里得求最大公约数吧

inr gcd(int x,int y) { if(y==0) return x; else return gcd(y,x%y); }

求 ax + by = c。

int exgcd(int a,int b,int &x,int &y) { if(b==0) { x = 1; y = 0; return a; } int r = exgcd(b,a%b,x,y); int t = x;x = y; y = t - a/b*y; return r; } int main() { int a,b,c,x,y; while(cin>>a>>b>>c){ int d = exgcd(a,b,x,y); if(c%d) printf("-1\n"); int k = c/d; x*=k; y*=k; printf("%d %d\n",x,y); } return 0; }

 求乘法逆元

int exgcd(int a,int b,int &x,int &y) { if(a==0&&b==0) return -1; if(b==0) { x = 1; y = 0; return a; } int r = exgcd(b,a%b,y,x); y -= a/b*x; return r; } int cal(int a,int m) { int x,y; int gcd=exgcd(a,m,x,y); if(gcd==1) return (x%m+m)%m; return -1; } int main() { int a,m; while(cin>>a>>m){ int n = cal(a,m); cout<<n<<endl; } return 0; }

 

 

 

转载请注明原文地址: https://www.6miu.com/read-4550150.html

最新回复(0)