1. 程式人生 > >模運算的乘法逆元

模運算的乘法逆元

不為 加法 col 情況 歐幾裏得 乘法逆元 找到 要求 整數

二元運算符 ‘≡’: 當 a%p = b%p 時,a ≡ b ( mod p )

模運算對於 加法 和 乘法 同樣適用,也就是說,如果 a ≡ a` (mod p) 和 b ≡ b` (mod p),那麽

a + b ≡ a` + b` (mod p)

a * b ≡ a` * b` (mod p)

對於 除法 卻不適用

  存在 a / b mod p != a` / b` mod p

模乘法逆元:若 a * b ≡ 1 (mod p),則稱 a 為 b 的模乘法逆元(在mod p 的情況下),或稱 b 為 a 的模乘法逆元(在mod p 的情況下)

假設 a / b ≡ c (mod p),b * x ≡ 1 (mod p)

那麽 a * x ≡ c (mod p)

  • 擴展歐幾裏得求模乘法逆元

  現已知 a,b,p 要求 c

   則只要找到 b 的模乘法逆元 x ,使得 b * x ≡ 1 (mod p) 則可求得 c

   b * x ≡ 1 (mod p)

   則 b * x + p * y = 1

   這樣問題就轉化為求已知 b,p 求 一元整數組 ( x, y ) 使得 b * x + p * y = 1 , 可用擴展歐幾裏得算法

    若得不到一元整數組 ( x, y ),也就是 gcd(b, p) != 1, 則 (在mod p 的情況下) 不存在 b 的模乘法逆元

  • 費馬小定理求模乘法逆元

  費馬小定理:假如 b 是一個整數,p 是一個質數,那麽 bp - b 是 p 的倍數

    b ^ p ≡ b ( mod p)

  b * bp-2 ≡ 1 (mod p)

  • 遞推求 1 - n 求模乘法逆元

  inv[ i ] 表示 i 的模乘法逆元

    設 k = p % i, t = ( p - k ) / i

     則 t * i + k = p

     t * i + k ≡ 0 ( mod p )

    若 k 不為 0 ,同除以 ( k * i )

     t * i / ( k * i ) + k / ( k * i ) ≡ 0 ( mod p )

     t / ( p % i ) + 1 / i ≡ 0 ( mod p )

     ( p - k ) / i * inv[ p % i ] + inv[ i ] ≡ 0 ( mod p )

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

   因為 k 不為 0,要求 p % i 不為 0

模運算的乘法逆元