扩展欧几里德算法求逆元1

 1 int exgcd(int a,int b,int &x,int &y)
 2 {
 3     if(b==0)
 4     {
 5         x=1;
 6         y=0;
 7         return a;
 8     }
 9     int ret=exgcd(b,a%b,x,y);
10     int tmp=x;
11     x=y;
12     y=tmp-a/b*y;
13     return ret;
14 }
View Code

该算法目的在于计算gcd(a,b)=d=ax+by式x和y的值,最后求得x即为a的逆元

•定理:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数d,必然存在整数对x,y,使得gcd(a,b)=d=ax+by
•对于gcd(a,b) = d,对(a, b)用欧几里德辗转相除会最终得到(d, 0)。此时对于把a =d, b = 0 代入a*x + b*y = d,显然x = 1,y可以为任意值。
•我们可以用a = d, b = 0的情况逆推出来任何gcd(a, b) = d 满足a*x + b*y = d的解。如果x0,y0是b*x + (a%b)*y = d 的解,那么对于a*x + b*y = d的解呢?

b*x + (a%b)*y = d →

b*x + (a - [a/b]*b)*y = d →

a*y + b*(x - [a/b]*y) = d

所以a*x + b*y = d的解

x1 = y0,y1= x0 - [a/b]*y0;

原文地址:https://www.cnblogs.com/wsruning/p/4673244.html