白书 4.1.2 模运算的世界 P291
1.逆元
这里有个注意事项要说,就是当要求 (a-b)%m 的时候要注意不能直接 (a%m-b%m)%m 原因是得出的值有可能是负数,所以 (a%m-b%m+m)%m 才是正确的。
//x,y是引用
int exgcd(int a,int b,int &x,int &y){
//d是最后要返回的
int d=a;
if (b!=0){
//递归时,y和x也要换
d=exgcd(b,a%b,y,x);
//根据x求y
y-=(a/b)*x;
}else{
x=1;y=0;
}
return d;
}
//求逆元 ax恒等于1(mod m)
int mod_inverse(int a,int m){
int x,y;
exgcd(a,m,x,y);
return (m+x%m)%m;
}
2.费马小定理
这里说的简单点,它就是能简单的求逆元,但有限制条件,就是只有m是素数的时候才可以用。
即当m是素数时,ax恒等于1(mod m),这时a的逆等于a的m-2次方模m。