subfactorial modulo prime(!n mod p)

时间:2012-10-16 11:54:08

标签: algorithm math

是否有一种简单的方法可以实施!n mod pnumber of derangementswhere n ≤ 2∗10^8p是素数而p < 1000

程序必须快速执行,因此天真的方法不起作用。

2 个答案:

答案 0 :(得分:8)

事实证明,!n mod p是周期性的,期间为2p。因此,我们可以将!n mod p计算为!(n mod 2p) mod p,我们使用紊乱!n = (n-1) (!(n-1) + !(n-2))的递归公式进行计算。

证明:

  • 通过紊乱的递归关系观察!(p+1) = 0 mod p
  • 工作模p,!(n+p) = !p * !n(这可以使用先前的观察结果进行归纳证明)。
  • 观察!p = -1 mod p。维基百科提供了一个公式:!n = n! - Sum[(n choose i) * !(n-i), i=1..n] - 模p,右侧唯一的非零术语显示在i=n的位置。
  • 结束!(n+2p) = !p !p !n = !n mod p

从证据中我们发现,当!n = ± !(n mod p) mod p小于n mod 2p时,我们可以实际计算p符号为正的位置。

答案 1 :(得分:0)

使用递归公式(!n = (n - 1) (!(n-1) + !(n-2))),为什么不实现“乘法模p”和“加模p”操作?