扩展欧几里德算法求逆元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 }
该算法目的在于计算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;