【发布时间】:2014-08-21 14:53:44
【问题描述】:
所以我最近一直在使用 modpow 函数做一些工作。当模数是 2 的幂时,我需要的一种形式是模指数。所以我启动并运行了代码。很好,没有问题。然后我读到一个技巧可以让你更快地得到它,而不是使用正则指数,而是将它的模数放在模数的总和上。
现在,当模数是 2 的幂时,答案就是 2 的幂小于当前的幂。嗯,这很简单。所以我对它进行了编码,它有时会起作用。
由于某些原因,有些值不起作用,我就是不知道它是什么。
uint32 modpow2x(uint32 B, uint32 X, uint32 M)
{
uint32 D;
M--;
B &= M;
X &= (M >> 1);
D = 1;
if ((X & 1) == 1)
{
D = B;
}
while ((X >>= 1) != 0)
{
B = (B * B) & M;
if ((X & 1) == 1)
{
D = (D * B) & M;
}
}
return D;
}
这是一组无效的数字。
Base = 593803430
Exponent = 3448538912
Modulus = 8
不,在这个函数中没有检查来确定模数是否是 2 的幂。原因是这是一个内部函数,我已经知道只有 2 的幂会传递给它。但是,我已经仔细检查以确保没有 2 的非幂。
感谢你们提供的任何帮助!
【问题讨论】:
-
您是否尝试过添加一些
std::cerr << "M " << M << ", B " << B << ... << '\n';行,以便查看哪里开始出错?还是使用调试器?
标签: c++ math exponentiation