【问题标题】:Sum and multiplication modulo和和乘模
【发布时间】:2011-08-25 21:13:19
【问题描述】:

我有很大的数字KC[1]C[2]C[3] 等,我必须计算 b:

b = C[1]*C[2]+C[3]*C[4]+... (mod K)

现在我计算总和,然后做类似的东西

b = SUM % K.

但是当 SUM 变得大于无符号长限制时这不起作用,所以我必须使用类似的东西

b = (C[1]*C[2] %K + C[3]*C[4] %K ) %K

但这很耗时。我尝试使用 unsigned long long 除了 unsigned long,这也很耗时。有没有更好的办法?

更新:

  C = (unsigned long long int *) malloc(N*sizeof(unsigned long long int));
  unsigned long int i, j, l;
  C[0] = 1;
  for (i=1; i<=N; i++) {
    C[i] = 0;
    l = (unsigned long int) i/2;
    for (j=0; j<l; j++) {
      C[i] += C[j]*C[i-j-1];
      C[i] = C[i] % K;
    }
    C[i] = C[i]*2;
    C[i] = C[i] % K;
    if (i - l*2 == 1) {
      C[i] += C[l]*C[l];
    }
    C[i] = C[i] % K;
  }

【问题讨论】:

  • 那么,如果P 大约是2^100,你用什么数据类型来存储它?
  • 总和约为 2^100。但如果我在每次乘法后计算 % P,大约是 2^16。
  • 那么,您的意思是 P 小于 2^16 ?然后,您可以对所有算术函数使用 32 位整数。
  • 问题是 SUM 太大。所以我必须在每次乘法后计算 % P,这使得程序非常慢。
  • 你必须在每次乘法和每次加法后做% P,正确。但我怀疑这很慢。请通过编辑您的问题(最后添加)发布您拥有的整个代码,以便其他人可以查看和评论。也许还有其他问题,它很慢。

标签: c algorithm math


【解决方案1】:

计算

b = ( C[1]*C[2]+C[3]*C[4]+... ) % P 

你可以这样做:

b = ( ( (C[1] % P) * (C[2] % P) % P )
    + ( (C[3] % P) * (C[4] % P) % P )
    + ...
    ) % P

由于所有操作的结果都不会大于(P-1)^2,因此如果您将所有中间结果保存在类型尽可能小的变量中,我希望这会更快。


如果数字 P 是某种特殊形式,例如 2 的幂,则有更快的方法。


在这个 SO 问题中:big-numbers-in-c,您会找到对 GNU Multiple Precision Arithmetic Library 的引用。如果不允许您使用这样的库,我想最好的选择是实现您自己的此类库(的子集)。

您可以将整数(大于 2^64)存储在数组中,并为这些数字定义加法、乘法、除法和取模函数。

【讨论】:

  • 是的,mod 2^N 的例子很多,但是我找不到其他 P 的例子。这就是问题所在。
  • 好像这个库帮不上忙。因为它会比当前的解决方案更慢。
【解决方案2】:

如果您可以将 K 分解为 pairwise relatively prime 数字 K1,...,Kn 那么您可以为每个 Ki 并使用 Chinese remainder theorem 将结果组合成 K 的结果。这通常要快得多,尤其是当 Ki 适合机器字时。

【讨论】:

  • 我看不出它如何解决 OP 的问题。 K 不超过 2^16。将 K 分解为 K1,...,Kn 可以得到什么?
  • 没错,我可能错过了他声明限制的评论。对于2^100 会很有用,但对于2^16 则不然。
【解决方案3】:

模m算术是环同态。

那么说 f(x) = x%P

f(a+b) = f(a)+f(b) 还有

f(a*b) = f(a)*f(b)。

http://en.wikipedia.org/wiki/Modular_arithmetic

这意味着你可以在每一步之后做一个 mod P。

【讨论】:

  • 不,我不能,因为数据类型的限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2013-07-21
  • 2012-04-01
相关资源
最近更新 更多