【发布时间】:2011-08-25 21:13:19
【问题描述】:
我有很大的数字K、C[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,正确。但我怀疑这很慢。请通过编辑您的问题(最后添加)发布您拥有的整个代码,以便其他人可以查看和评论。也许还有其他问题,它很慢。