取模除法(逆元)(费马小定理)(线性求逆元)

引言

我们做题时经常会由于答案过大,被要求使答案对一个质数取模
我们都知道,加和乘对取模是没有影响的
减法也只需要写一个:

int mod_minus(int a,int b){return a-b>=0 ? a-b : a-b+mod}

就可以啦
但是除法就很头疼
怎么办呢?
这里介绍一种比较简单的利用费马小定理逆元实现取模除法的途径
结合快速幂,每次复杂度为log级别
除此之外,还会介绍一种线性求逆元的方法
首先我们先要搞清楚什么是逆元费马小定理

逆元

乘法逆元,是指数学领域群G中任意一个元素a,都在G中有唯一的逆元a’,具有性质a×a’=a’×a=e,其中e为该群的单位元。——《百度百科》

通俗点说就是逆元与本身相乘等于1
逆元有一个性质:

除一个数等于乘这个数的逆元

比如在正常的乘法意义下,a/b=a*(1/b)
这也是我们实现取模除法的关键
也就是说,当我们要模质数p的条件下使答案除以一个数x时,我们只需要乘上x在模p意义下的逆元即可
所以我们要求出这个逆元,也就是要找到一个k,使:

x*k=1(mod p)

怎么求呢?
我们就要请出我们的费马小定理

费马小定理

内容

若p为质数且a、p互质,则——

ap-1=1(mod p)

应用

讨论完逆元之后,
这个定理怎么用就很显然啦
首先a若不与p互质,那一定是p的质数,乘完肯定是0
不互质时,结合前面逆元的式子,我们就可以有

k*a=1=ap-1

这样就可以得到k:

k=ap-2

如果你只是想背结论,那么到这里你就已经下课了
不过背来的终究会忘!推出来才是自己的!
(虽然证明也可能会忘)
下面就是最好玩的证明了~

证明

我们只需要证明一下费马小定理,其他就都是自己推的了
怎么证呢?
引入概念:

完全剩余系:从模n的每个剩余类中各取一个数,得到一个由n个数组成的集合,叫做模n的一个完全剩余系

这玩意有啥用?
别着急,慢慢看
我们还需要一个引理:

对于互质的a、p, 若i!= j(mod p),则a ∗ * i != a ∗ * j (mod p)

这个为什么?怎么证?
看起来就是要反证啦
假设ai=aj(mod p)
移一下项:

a(i-j)=0(mod p)

又因为a、p互质,a mod p不可能为0
所以

i-j=0(mod p)

这与i!= j(mod p)矛盾
证毕

有了完全剩余系和这个引理,我们可以干一些东西了
先构造一个完全剩余系A:

A={0,1,2,…,p-1}

然后,我们令每一项乘上一个a,得到集合B:

B={0,a,2a,3a,…(p-1)a}

因为a与p互质,A又是完全剩余系,其中的数模p互不相同
由刚才的引理可知,B中的元素模p也互不相同,又因为B中也有p个数,所以B也是一个模p的完全剩余系
然后我们又有一个很显然的结论:

若a=b (mod p),c=d(mod p),那么
a ∗ * c = b ∗ * d(mod p)

这个很好证了,把每个数拆成k ∗ * p+x即可
所以我们把去掉模p=0的数后的A的所有数乘起来,B的所有数乘起来,它们得到的乘积还是关于p同余的
写一下就是:

(p-1)!=ap-1 ∗ * (p-1)!(mod p)

移一下项就是:

(p-1)! ∗ * (ap-1-1)=0(mod p)

因为p是质数,所以(p-1)!显然模p不等于0
所以:

(ap-1-1)=0(mod p)

也就是:

ap-1=1(mod p)

证毕

线性求逆元

洛谷传送门
如何在线性的时间复杂度求出[1,n]在模p意义下的逆元呢?
(和前面的条件一样,p必须是质数)
首先,求i的逆元时,假设我们已经求出[1,i-1]的逆元
我们可以令:

r=p%i

也就是

p=(p/i)*i+r

因为p是质数,i不等于1时,r不等于0
由于等式右边是p,所以不难得出:

(p/i)*i+r=0 (mod p)

等式两边同时乘 i-1 ∗ * r-1,再移项,得:

i-1=-r-1*(p/i)

因为r<i,r的逆元已知
这样就可以在O1的时间内求出i的逆元
从而做到在On的时间内求出[1,n]的逆元

thanks for reading!

(真的不点个赞再走吗awa)

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值