0

我必须以 X 次方(X 介于 1 到 300 之间的任意位置)以 50 为底提高许多数字。这些数字存储为 bignums。

我的问题是:因为我会将两个 bignums 逐位(以 50 为底)相乘很多次,所以缓存这个乘法会更快吗?

a[]所以,每次我乘以b[]我将不得不做a[i]*b[j]很多次 where a[i]and b[j]are base 50 numbers。

我在想而不是a[i]*b[j]每次都实际做,事先创建一个矩阵会不会更快:prod[50][50], where prod[i][j] = i*j. 然后我会有类似的东西prod[a[i]][b[j]]

从内存中读取是否比实际执行乘法更快?

如果我的问题不清楚,快速示例:

代替:

for(int i=1; i<=100; ++i){
   sum += 50*30;
   sum += 37*20;
}

这是不是更快:

for(int i=1; i<=100; ++i){
   sum += prod[50][30];
   sum += prod[37][20];
}

?

4

1 回答 1

3

简短的回答:是的,很可能。

长答案:这取决于。如果它不在缓存中,在缓存中计算乘法可能比从内存中获取大量数要快。

您确实需要实现缓存并将其与“无缓存”进行基准测试以查看您得到的结果。

还要记住,计算幂比仅仅乘法更有效,例如,如果我们想要 y = x 5,而不是计算y = x * x * x * x * x,我们可以计算x2 = x * x;, then y = x2 * x2 * x;,这只有四次乘法而不是五次。如果您有 x 300,则可以通过多次使用相同的方案(计算 x4 和 x16 等)来节省大量资金。

于 2013-05-02T17:10:32.263 回答