【发布时间】:2021-02-23 04:19:09
【问题描述】:
对于数学例程,对于所有整数 0 16,即存储在一个 16 位变量中。换句话说,
uint16_t result[65536];
void calculate_exponent_lookup_table(void)
{
for (uint16_t i = 0 ; i < 65536 ; i++)
result[i] = pow(251, i) % 65536;
}
但由于资源限制,我没有空间来静态单独计算和存储"result" 数组,也没有计算能力在运行时通过在给定持续时间内重复乘法计算高阶指数.
所以,我遇到了this link about Binary Exponentiation。
使用上述算法,我需要预先计算并存储 251 的 16 个指数,即 2511 到 25116。我只需要在运行时最多进行 16 次乘法,即 log 65536 即可获得任何指数,这是可行的。
但由于结果将以模 216 存储,我还能优化它并节省一些计算吗?
【问题讨论】:
-
你的意思是每次做一个乘法(即之前的结果,乘以 251)最终结果太慢了吗?还是每次都从头重新计算太慢了?
-
@harold,我的意思是,如果我不将指数存储在查找表中(由于内存限制),我需要在查找期间在运行时计算特定指数-向上重复乘法。请注意,我在数学例程中经常需要这些指数结果。
-
这能回答你的问题吗? Calculating pow(a,b) mod n
-
@RishavAmbasta 将循环更改为
result[i] = result[i - 1]*251 % 65536;,它会运行得更快。您无需每次都重新计算低功率 -
您需要范围为 [0, 15] 而不是 [1, 16] 的指数。
标签: c bit-manipulation bitwise-operators