「数论」线性求所有逆元的方法
前几天在看 lucas 定理的时候发现要求 $1,~2,\cdots,p-1\bmod p$ 的逆元,然后就看到了一个 $\Theta(n)$ 的做法。
这个做法实际上是这样的,首先我们知道 $1^{-1} \equiv 1 \pmod p$,然后我们设 $p = k\cdot i + r,~r < i,~1 < i < p$,再将这个式子放到 $\mathrm{mod}\,\, p$ 意义下就会得到
\[k\cdot i + r \equiv 0 \pmod p\]两边同时乘上 $i^{-1}\cdot r^{-1}$ 就会得到
\[\begin{eqnarray*} k\cdot r^{-1} + i^{-1} &\equiv& 0 &\pmod p\\ i^{-1} &\equiv& -k\cdot r^{-1} &\pmod p\\ i^{-1} &\equiv& -\left\lfloor\frac{p}{i}\right\rfloor\cdot \left(p\bmod i\right)^{-1} &\pmod p\ \end{eqnarray*}\]于是就可以从前面推出当前的逆元了,代码也就一行
以下是旧版博客的评论
-
2015-01-29 18:57:3897littleleaf11 (#1)Orz Miskcoo
-
2015-08-04 01:46:19特殊多项式在整点上的线性插值方法 | Miskcoo's Space (#2)[…] mathcal O(k),右边的阶乘由于都不大可以用线性逆元在相同复杂度内算出来,然后剩下的 x - j […]
-
2016-03-20 21:37:58yhx (#3)后排orz
-
2016-04-25 18:17:54dna049 (#4)最后的 O(log p) 复杂度应该是对的,但是证明有问题,p是常量,所以小于 p mod i < p/2 并不能说明每一步折半,例如,p=n! -1 ,那么 p mod k = k-1 (k<n+1) 当然这种情况复杂度依然O(log p)。但怎么说明其复杂度为O(log p) ,我还不知道,当然平均复杂度是O(log p)是显然的。
-
2016-04-25 22:35:45miskcoo (#5) reply to好像是这么回事QAQ
-
2016-07-03 16:03:12samzhang (#6)单个数逆元用费马小不就行了。。。
-
2016-07-03 16:04:44samzhang (#7)O(n)求所有逆元可以利用O(n)预处理所有阶乘的逆元然后用的时候乘一下就行了吧。。。蒟蒻只会用这样比较简单的做法。。
-
2016-07-03 19:09:19miskcoo (#8) reply to阶乘的逆元怎么预处理的?我都是这样预处理出来再乘上去……
-
2016-07-03 22:03:09samzhang (#9) reply to首先我们logn求出n!的逆元,那么(n-1)!的逆元 = n!的逆元*n 2333333
-
2016-09-22 17:25:40test (#10)求出原根的话,也是O(n)。 不过你的这个技巧代码比较简单。
-
2016-10-05 21:01:56123 (#11) reply to费马小要求质数吧
-
2017-07-02 21:22:38hnc (#12) reply to你是没上过高中吧,尽管我也才初一
-
2018-02-06 13:11:12SYCstudio (#13)博主,好像您的公式挂了。。。
-
2018-02-06 15:31:47miskcoo (#14) reply to应该没有问题,可能是你没加载好,刷新一下大概就行了。
-
2018-03-16 13:01:08panda_2134 (#15) reply to还能这样啊66666
-
2018-04-29 15:24:15pechpo (#16)好神啊
-
2018-08-17 14:25:14Judge (#17)有问题那...代码部分不应该是 A[i]= (p-p/i)*A[p%i]; 吗?
-
2018-08-17 18:22:16miskcoo (#18) reply to-i 和 -i + p 认为没有区别
-
2018-10-19 08:54:54YJZoier (#19) reply toOrz.
-
2019-06-13 14:50:53ffffffff (#20) reply to是在说[这个](https://www.zhihu.com/question/59033693)吗 ~~文章里是删掉了吗~~
-
2019-08-04 19:55:29青君 (#21)赞