码迷,mamicode.com
首页 > 其他好文 > 详细

模运算的乘法逆元

时间:2017-11-29 23:41:56      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:style   size   除法   bsp   整数   欧几里得   情况下   转化   div   

二元运算符  ‘≡’: 当 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

 

模运算的乘法逆元

标签:style   size   除法   bsp   整数   欧几里得   情况下   转化   div   

原文地址:http://www.cnblogs.com/lkcc/p/7922826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!