我尝试使用两个函数进行模幂运算,以求大基返回错误结果, 功能之一是:
uint64_t modular_exponentiation(uint64_t x, uint64_t y, uint64_t p)
{
uint64_t res = 1; // Initialize result
x = x % p; // Update x if it is more than or
// equal to p
while (y > 0)
{
// If y is odd, multiply x with result
if (y & 1)
res = (res*x) % p;
// y must be even now
y = y>>1; // y = y/2
x = (x*x) % p;
}
return res;
}
对于输入x = 1103362698 ,y = 137911680 , p=1217409241131113809;
它返回值(x^y mod p)
:749298230523009574
(不正确)。
正确的值为:152166603192600961
我尝试的其他功能也得到了相同的结果,这些功能有什么问题? 另一个是:
long int exponentMod(long int A, long int B, long int C)
{
// Base cases
if (A == 0)
return 0;
if (B == 0)
return 1;
// If B is even
long int y;
if (B % 2 == 0) {
y = exponentMod(A, B / 2, C);
y = (y * y) % C;
}
// If B is odd
else {
y = A % C;
y = (y * exponentMod(A, B - 1, C) % C) % C;
}
return (long int)((y + C) % C);
}
答案 0 :(得分:0)
如果p
= 1217409241131113809,则此值以及res
和x
的任何中间值都将大于32位。这意味着将这些数字中的两个相乘可能会导致大于64位的值溢出您正在使用的数据类型。
如果将参数限制为32位数据类型,并将64位数据类型用于中间值,则该功能将起作用。否则,您将需要使用较大的数字库来获取正确的输出。