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

扩展欧几里德算法求逆元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;

你可能感兴趣的:(算法)