专栏文章

光速阶乘算法

休闲·娱乐参与者 83已保存评论 84

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
84 条
当前快照
1 份
快照标识符
@mip3889x
此快照首次捕获于
2025/12/03 05:26
3 个月前
此快照最后确认于
2025/12/03 05:26
3 个月前
查看原文

摘要

一种能在模数较小时 O(lognlogpn)O(\log n\log_p{n}) 求出 n!n! 的算法。

实现

我们知道:
(nn2)=n!n2!n2!\binom{n}{\left\lfloor \frac{n}{2} \right\rfloor}=\frac{n!}{\left\lfloor \frac{n}{2} \right\rfloor!\left\lceil \frac{n}{2} \right\rceil!}
所以:
n!=(nn2)n2!n2!n!=\binom{n}{\left\lfloor \frac{n}{2} \right\rfloor}\left\lfloor \frac{n}{2} \right\rfloor!\left\lceil \frac{n}{2} \right\rceil!
后面的 n2!n2!\left\lfloor \frac{n}{2} \right\rfloor!\left\lceil \frac{n}{2} \right\rceil! 可以根据 nn 的奇偶性化为 (n2!)2(\left\lfloor \frac{n}{2} \right\rfloor!)^2(n2!)2n2(\left\lfloor \frac{n}{2} \right\rfloor!)^2\left\lceil \frac{n}{2} \right\rceil
这个是可以递归计算的。
而前面的 (nn2)\binom{n}{\left\lfloor \frac{n}{2} \right\rfloor} 一般情况下并没有什么好的计算方法,但我们可以使用 Lucas 定理在模数较小的情况下在 O(logpn)O(\log_p{n}) 的时间内求出它的值。

时间复杂度分析

至多递归 O(logn)O(\log n) 层,每层使用 Lucas 定理是 O(logpn)O(\log_p{n}) 的,所以总复杂度是 O(lognlogpn)O(\log n\log_p{n}) 的。

前途

相比于休闲娱乐区前几篇光速阶乘算法,这个方法具有可行性且实际优化了复杂度。
相比于传统的快速阶乘算法的 O(nlogn)O(\sqrt{n}\log n),这个方法更快,在 p=104+7p=10^4+7 时,我们也可以在可接受的时间内计算出 n=1018n=10^{18}n!modpn!\bmod p 的值。

评论

84 条评论,欢迎与作者交流。

正在加载评论...