求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;

 

posted on 2020-03-24 14:56  Allen_lml  阅读(249)  评论(0编辑  收藏  举报