快速算法计算大n!mod 2 ^ 32

use*_*227 3 algorithm biginteger factorial modulo

N最高可达2 ^ 31.我想计算N的准确值!mod 2 ^ 32.任何语言都可以,但我希望详细解释算法.时间限制<1秒

ric*_*ici 21

在python中:

if n > 33:
  return 0
else
  return reduce(lambda x, y: x*y, range(1, n+1)) % 2**32
Run Code Online (Sandbox Code Playgroud)

理由:

我们知道34!可以被2 32整除,因为在序列中:

1 * 2 * 3 * 4 * ... * 34
Run Code Online (Sandbox Code Playgroud)

有:

17 multiples of 2
 8 multiples of 4
 4 multiples of 8
 2 multiples of 16
 1 multiple  of 32
--
32 multiplications by 2
Run Code Online (Sandbox Code Playgroud)

它是每个较大因子的一个因子,因此所有较大的因子都是0 mod 2 32

对于小的N值,如果你没有可用的bignum算法,你可以进行单独的乘法mod 2 32,和/或你可以在factorial中预先计算2的幂,这很容易计算(见上文).


int*_*jay 6

正常计算阶乘(乘以数字1,2,3,...),在每次乘法后执行模数.这将为您提供小值的结果N.

对于较大的值N,请执行相同的操作.很快,您的中间结果将是0,然后您可以立即停止循环并返回0.您停止的点将相对较快:因为N == 64结果将是0因为1..64包含32个偶数的乘积因此可被整除2^32.N得到0 的实际最小值将小于64.