【问题标题】:Binary exponentiation of 251 restricted to modulo 16251 的二进制取幂限制为模 16
【发布时间】: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


【解决方案1】:

是的,您可以在任何阶段多次取模。 但是,您的问题不在于它,而是在使用 pow 函数时溢出。取模前的中间结果太大了。

【讨论】:

  • 正确。但是,只是在每个阶段进行取模不会为我节省任何计算,对吗?
  • 在此处使用pow 实际上是错误的,而且速度要慢得多,因为 OP 只想要幂的模(在许多语言中称为 modpow,在 python 中带有 3 个参数)
  • @RishavAmbasta 这不是速度问题,而是正确性问题。如果计算不正确,速度就没有意义
猜你喜欢
  • 1970-01-01
  • 2012-01-01
  • 2017-09-27
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多