【问题标题】:Calculating factorial (mod prime) of 32-bit int faster than O(n) in C? [duplicate]计算32位int的阶乘(模素数)比C中的O(n)更快? [复制]
【发布时间】:2012-06-09 19:56:35
【问题描述】:

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

让:

int k = 99999989;

k 是一个素数。

给定一些(32 位)int x,我们要计算 x 阶乘 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?如果是,那是什么?如果没有,草图证明。

【问题讨论】:

  • 可能转移到math.stackexchange.com?那里有一些令人惊叹的神童,你也可以谈论..
  • 好吧,如果n &gt;= k,那么n! % k == 0,所以它是O(1) ;)
  • 大概查找表是不可能的:-P
  • 除此之外,这是一个很好的问题,但重复了。您可以减少工作,但没有办法将其减少到低于 k/2 乘法。
  • @DanielFischer:从技术上讲,输入的数量是有限的,所以查找表是 O(1) 时间和 O(1) 空间,但我想你知道我的意思。跨度>

标签: c algorithm math


【解决方案1】:

这不是一般的答案,但作为特例,如果x = k-1,可以使用Wilson's theorem

(x)! = -1 mod k

(p-1)! = -1 mod p

【讨论】:

    猜你喜欢
    • 2019-05-25
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多