线性时间筛选n个模M的逆元的方法及证明

结论:

假设取模 M

初始化设

i n v [ 1 ] = 1

i n v [ i ] = ( M M i ) × i n v [ M   %   i ]   %   M


推导如下:

t = M i   ,   k = M   %   i

根据同余定义我们可以得到

t × i + k 0   ( m o d   M )

即:

t × i k   ( m o d   M )

两边同时乘上 i × k

t × i × i 1 × k 1 k × k 1 × i 1   ( m o d   M )

t × k 1 i 1   ( m o d   M )

t × i n v [ k ] i n v [ i ]   ( m o d   M )

这时我们得到了递推式,要求 i n v [ i ]

其实答案就是

t × i n v [ k ]   %   M

我们将一开始的设的 t , k

( M i ) × i n v [ M   %   i ]   %   M

即:

( M i )   %   M × i n v [ M   %   i ]   %   M

为了防止出现负数 ( M i )   %   M 完全可以加上一个 M ( M i + M )   %   M

原式化简为了

i n v [ i ]   %   M = ( M M i ) × i n v [ M   %   i ]   %   M

推导完毕。

复杂度 O ( n )

code:

void init(){
    inv[1] = 1;
    for(int i = 2; i <= n; i++)
        inv[i] = inv[M % i] * (M - M / i) % M;
}

猜你喜欢

转载自blog.csdn.net/codeswarrior/article/details/81698612