【发布时间】:2017-11-26 20:41:00
【问题描述】:
我正在尝试在c 中实现模幂(平方和从左到右相乘)算法。
为了从左到右迭代位,我可以使用 link 中解释的掩码
在此示例中,使用的掩码是 0x80,它仅适用于最大为 8 bits 的数字。
为了使它适用于任意位数,我需要动态分配掩码,但这有点复杂。
有没有其他方法可以做到。
提前致谢!
-------------编辑-----------
long long base = 23;
long long exponent = 297;
long long mod = 327;
long long result = 1;
unsigned int mask;
for (mask = 0x80; mask != 0; mask >>= 1) {
result = (result * result) % mod; // Square
if (exponent & mask) {
result = (base * result) % mod; // Mul
}
}
在这个例子中,如果我使用掩码0x80,它将不起作用,但如果我使用0x100,那么它工作正常。
在运行时选择掩码值似乎是一种开销。
【问题讨论】:
-
哪一部分复杂?你试过什么?
-
定义最大数,例如
size_t是您将继续进行的最大值。然后,要获取掩码,请使用size_t mask = ((size_t)1 << (sizeof(size_t) * 8 - 1))。稍后,要遍历您的号码,请使用size_t mynum = (size_t)input_number即可。我假设你只使用无符号数字。 -
@GauravPathak 实际问题是什么?
-
@tilz0R 你真的认为它不能吗?提示:阅读标准。是的,有实际机器的字节宽度超过 8 位。
-
如果您使用从右到左的算法,则无需担心将掩码初始化为适当大的值。
标签: c rsa traversal exponentiation