计算32位int的阶乘(mod prime)比C中的O(n)快吗?

时间:2012-06-09 19:56:35

标签: c algorithm math

  

可能重复:
  Fast way to calculate n! mod m where m is prime?

让:

int k = 99999989;

k是素数。

给定一些(32位)int x,我们想要计算x factorial mod k。 (x!%k)

执行此操作的一种方法如下:

int factmk(int x)
{
    long long t = 1;

    for (long long i = 2; i <= x; i++)
    {
         t *= i;
         t %= k;
    }

    return (int)t;
};

这需要O(x)时间和O(1)空间。

在小于或等于O(logx)空间的直C中实现factmk是否有渐近更快的方法?如果是,那是什么?如果不是,则草图证明。

1 个答案:

答案 0 :(得分:0)

这不是一般性答案,但作为特殊情况,如果x = k-1,您可以使用Wilson's theorem

(x)! = -1 mod k

(p-1)! = -1 mod p