文章目录
- 引言
- 逆元
- 费马小定理
- 内容
- 应用
- 证明
- 线性求逆元
- thanks for reading!
引言
我们做题时经常会由于答案过大,被要求使答案对一个质数取模
我们都知道,加和乘对取模是没有影响的
减法也只需要写一个:
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)