【发布时间】:2014-06-18 06:18:14
【问题描述】:
有没有人知道计算数量的方法
n! mod M
这样溢出不是问题吗?我想不出如此大的 n 值不会导致问题的任何事情。
【问题讨论】:
-
好吧,直到我用谷歌搜索后我才知道;)Stack Overflow: How to Ask。
标签: algorithm recursion factorial
有没有人知道计算数量的方法
n! mod M
这样溢出不是问题吗?我想不出如此大的 n 值不会导致问题的任何事情。
【问题讨论】:
标签: algorithm recursion factorial
如果您使用 Big Integer 库,它将永远不会溢出。但是,根据您想要的算法和位数,执行可能需要数年时间。
【讨论】:
假设n * (n-1)没有溢出,你可以在每次乘法后取乘积mod M。
更新:正如Dukeling 非常耐心地向我解释的那样,上述假设不是足够 条件以确保 应用该方法mod M 每次乘法后将保证不会溢出。
足够条件是(M-1)*(n mod M) 不会溢出,因为这是在采用mod 之前可能产生的最大可能结果。
【讨论】:
(M-1)*(n mod M) 不应该溢出。考虑5! mod 30 与50 的溢出。 5*4 << 50,但它溢出了。
mod M的最大数字是M-1。 M 也应该没问题。要获得更精确的界限,您也可以将n 替换为n-1。
M-1 是最大的数字,因此也是最大的产品,可以在后期存在,乘以最大的单个数字n,为您提供最大的产品前期。
n!。
n * (n-1) 是错误的,应该改为(M-1)*(n mod M) - 这本身不是答案,而是对您的更正。