这个博客讲的很好,直接拉过来了。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)
补充性质:
-
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.
-
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)。
-
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.