模块化指数函数对c

时间:2019-09-06 17:11:33

标签: c modular-arithmetic mod exp

我尝试使用两个函数进行模幂运算,以求大基返回错误结果, 功能之一是:

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); 
} 

1 个答案:

答案 0 :(得分:0)

如果p = 1217409241131113809,则此值以及resx的任何中间值都将大于32位。这意味着将这些数字中的两个相乘可能会导致大于64位的值溢出您正在使用的数据类型。

如果将参数限制为32位数据类型,并将64位数据类型用于中间值,则该功能将起作用。否则,您将需要使用较大的数字库来获取正确的输出。