zoukankan      html  css  js  c++  java
  • 乘法逆元的应用

    这个博客讲的很好,直接拉过来了。http://blog.sina.com.cn/s/blog_7c4c33190100s48a.html 网络上讲的也很少,这个算是最清楚的了。

    定义:

    满足a*k≡1 (mod p)的k值就是a关于p的乘法逆元。

     

    为什么要有乘法逆元呢?

    当我们要求(a/b) mod p的值,且a很大,无法直接求得a/b的值时,我们就要用到乘法逆元。

    我们可以通过求b关于p的乘法逆元k,将a乘上k再模p,即(a*k) mod p。其结果与(a/b) mod p等价。

     

     

    证:

    根据b*k≡1 (mod p)有b*k=p*x+1。

    k=(p*x+1)/b。

    把k代入(a*k) mod p,得:

     (a*(p*x+1)/b) mod p

    =((a*p*x)/b+a/b) mod p

    =[((a*p*x)/b) mod p +(a/b)] mod p

    =[(p*(a*x)/b) mod p +(a/b)] mod p

    //p*[(a*x)/b] mod p=0

    所以原式等于:(a/b) mod p

    更简单的证明:

    a/b mod p =  a* (b*b^(-1) ) /b =a*b^(-1);

     

    至于怎么求解二元不定方程,参见扩展欧几里得算法。(extended-gcd)

    http://blog.sina.com.cn/s/blog_7c4c33190100s4a8.html

     

    http://wenku.baidu.com/link?url=u2bKSFtzyQ8KT1lhlAUvQ1mYGHSU9iOkUpVSiJe7b_kYGAdHZUwdB3ipbf0DVZvqO_1mgyw0SrpJ7Zj7g3E5M2r0t9bCAVQ7U1QF_2fYNnu 贾志鹏线性筛;介绍了O(n)算法求出多个数的逆元。

     

    快速求出1—n的逆元(mod p)

    以下所有数都mod p

    首先要求出 1! 2!。。。n! 的值, 先求出 n!的逆元。

    逆元是积性函数, 可以根据n!的逆元 求出 1! 2!。。。(n-1)!的逆元。

    (n!)^(-1)= (n-1)!^(-1)  *  n^(-1)

     移项得

    ( (n!)^(-1) )/( n^(-1) ) = (n-1)! ^ (-1)  

    根据除以一个数等价于乘以这个数的逆元

    (n!)^(-1) * n = (n-1) ^ (-1)

     

    这样就求出了 1!,  2!。。。(n-1)!, n!的逆元。

    接下来 就是 如何 利用 阶乘的逆 求出 每个数的逆;

    ( (n-1)! ^ (-1) ) * n ^ (-1) = (n!) ^ (-1);

    移项得

    n ^ (-1) = (  (n!) ^ (-1) )  / ( (n-1)! ^ (-1) ) ;

    根据除以一个数等价于乘以这个数的逆元

    n ^ (-1) =  (n!) ^ (-1)  *   (n-1)! ;

    定义:

    若 a*k≡1 (mod p), a 与 p 互质,就说 k 是 a 模 p 的乘法逆元。记为 k = a-1.

    我个人习惯用 ie(a) 表示 a 模某数的逆元。(inverse element)

    补充性质:

    1. a/b≡a*b-1 (mod p),b | a.

      证明:a/b mod p = a/b*b* b-1 mod p,化简得 a/b mod p = a*b-1 mod p.

    2. ie(x) 是积性函数

      证明:设 x 是 a 关于 p 的逆元,y 是 b 关于 p 的逆元,即 xa mod p = yb mod p = 1,则

      xayb mod p = 1

      (ab)*(xy) mod p = 1

      即 xy 是 ab 关于模 p 的逆元,即 ie(ab) = xy = ie(a)*ie(b)。

    3. a-1 = ap-2

      证明:先证明 ap-1 mod p = 1.

      首先,a, 2a, 3a, ..., (p-1)a,这些数 mod p 的值互不相同。

      用反证法可以证明:假设 i*a≡j*a(mod p) (1 <= i, j < p),设 i > j,则 (i-j)*a mod p = 0,由于 a 与 p 互质,可以得到 (i-j)又 i-j 是 p 的倍数,又 i-j < p,矛盾,所以假设不成立。

      由上述结论可知,a, 2a, 3a, ..., (p-1)a mod p 的值与 0, 1, 2, ..., p-1 一一对应(不一定按顺序对应),将这些数相乘可以得到 (p-1)!*ap-1≡(p-1)! (mod p),两边消去 (p-1)!,得到 ap-1 mod p = 1.

      又 ap-1 = a*ap-2,所以 a*ap-2≡a*a-1 (mod p),即 a-1=ap-2.

  • 相关阅读:
    C++编程入门题目--No.5
    C++编程入门题目--No.4
    C++编程入门题目--No.3
    C++编程入门题目--No.2
    C++入门编程题目 NO.1
    深度使用魅族16T后的评价(本人魅友,绝对客观公正,不要盲目的为手机厂商辩护,想想从当初到现在,魅族正在一步步背离自己的信仰,有问题,解决问题才能有更好的发展)
    ACM及各类程序竞赛专业术语
    python刷LeetCode:3.无重复字符的最长子串
    python刷LeetCode:2.两数相加
    python刷LeetCode:1.两数之和
  • 原文地址:https://www.cnblogs.com/vb4896/p/3911283.html
Copyright © 2011-2022 走看看