【发布时间】:2012-04-01 10:43:34
【问题描述】:
我很好奇是否有一个好的方法来做到这一点。我当前的代码是这样的:
def factorialMod(n, modulus):
ans=1
for i in range(1,n+1):
ans = ans * i % modulus
return ans % modulus
但似乎很慢!
我也无法计算n!然后应用素数模数,因为有时 n 太大以至于 n!明确计算是不可行的。
我也遇到了http://en.wikipedia.org/wiki/Stirling%27s_approximation,想知道这里是否可以以某种方式使用它?
或者,我如何在 C++ 中创建一个递归的、记忆化的函数?
【问题讨论】:
-
慢有多慢?从你的伪代码,我推断你是用 Python 计算的,对吗?
-
任何语言,真的;就语法而言,它在 C++ 中几乎相同。我在这里选择 Python 是因为它易于阅读。不过,即使在 C++ 中,我也需要一个更快的函数。
-
有一种非常快速的方法可以使用不变乘法或Montgomery reduction。这两种方法都消除了模数,并允许使用循环展开技术。
-
您可以将模数分解为主要因数,以更容易识别为零的情况,尽管这对较大的主要因数没有帮助 - 这有多大帮助取决于您对模数的了解,如果有的话,如果素因数分解让你喜欢。
-
如果 ans > 模数(信用:tech.groups.yahoo.com/group/primenumbers/messages/…)
标签: algorithm math factorial modulus