乘法逆元

来源:互联网 发布:js获取file真实路径 编辑:程序博客网 时间:2024/06/13 22:54
逆元:
若,b*b1 % c == 1
则,b1称为b模c的乘法逆元。

在ACM中,许多除法取模都要用到求逆元。
但是,逆元,为什么能给我们带来 ( a/b ) % c == ( a*b1 ) % c ???

(当然a/b要整除)

要知道,取模等式等价变形中,是没有除法的!!!

而推导式,还是没有用除法的地方!!!



我们用反证法证明:

若b*b1 % c == 1,则( a/b ) % c != ( a*b1 ) % c
若我们证明这一命题是错误的,我们目的就达到了。

令,a/b   == k1*c+y1
       a*b1 == k2*c+y2
原来的证明则变成了:若b*b1 % c == 1,则 y1!=y2


两式相减,有 a/b-a*b1 == (k1-k2)*c + (y1-y2)
设 k == k1-k2
     y == y1-y2
有,a/b-a*b1 == k*c + y
左右乘以b,有 a*(1-b*b1) == k*b*c + b*y
左右模上c,
左边 == a*(1-b*b1)%c
        == ( a*( 1%c - b*b1%c ) )%c
        == 0
右边 == (k*b*c + b*y)%c
        == b*y%c
因为a/b为整除,b显然不会是0,那么y必须是0,这与命题矛盾,证毕

p.s. 因为是自己证的,万一有错误,还望大牛指出。


为什么求逆元会用扩展欧几里得?

我们的目标,其实是解b*b1 % c == 1
令 b*b1 == k*c + 1
即 -k*c + b*b1 == 1
仔细观察,这个不就是扩展欧几里得嘛。

那么,为什么gcd(b,c)==1,才会有逆元变得简单了。

因为 1 % gcd(b,c) == 0 ,扩展欧几里得才有解,具体来说,gcd(b,c)只能为1

求逆元的方式1。


用费马小定理 非常好用 配合快速幂简直是极品!

费马小定理内容:a^(p-1) ≡ 1 mod p 其中a p 互质

但是在acm中一般要mod一个inf=1e9+7 或者 一个质数 所以a p 一定会互质! 非常好用的性质!

可以改写一下 内容  a*a^(p-2) ≡ 1 mod p 得到 a^(p-2) 是a关于p的一个逆元 这样就求出来了逆元 quickpow(a,p-2,p);



方式2 。 

拓欧 (这个应该都很清楚了吧)

0 0
原创粉丝点击