求1~n所有数的逆元:
假设1~i-1的逆元已求出,设p÷i=d……r(商d余r),则p=i*d+r。其中r=p%i。
对p=i*d+r,等式两边同时%p,得到0=(i*d+r)%p。
即为0≡i*d+r(mod p)(同余有一条性质:如果a≡b(mod m),x≡y(mod m),则有ax≡by(mod m)。)
由同余的自反性(一个数永远和自己本身同余)可知:i^-1*r^-1≡i^-1*r^-1(mod p),即可运用该性质
对上述同余式,乘i^-1*r^-1(乘i的逆元与r的逆元的积)
得到:0≡r^-1*d+i^-1(mod p);
∴i^-1≡-r^-1*d(mod p),r=p%i。
于是就有了这样一段伪代码:
inv[1] = 1; for(int i = 2; i < p; ++ i) inv[i] = (p - p / i) * inv[p % i] % p;