我找到了一个在modoulus中相乘的算法。下一个伪代码取自维基百科,页面模块化指数,部分从右到左的二进制方法。
完整的伪代码是
function modular_pow(base, exponent, modulus)
Assert :: (modulus - 1) * (modulus - 1) does not overflow base
result := 1
base := base mod modulus
while exponent > 0
if (exponent mod 2 == 1):
result := (result * base) mod modulus
exponent := exponent >> 1
base := (base * base) mod modulus
return result
我不明白这行伪代码是什么意思Assert :: (modulus - 1) * (modulus - 1) does not overflow base
;这一行意味着什么?如何用C ++编写最佳程序?
答案 0 :(得分:1)
在大多数计算机编程语言中,数字只能以有限的精度或在一定范围内存储。
例如,C ++整数通常是32位有符号整数,最多可以存储2 ^ 31作为值。
如果您尝试将两个数字相乘并且结果将大于2 ^ 31,则无法得到您期望的结果,它已经溢出。
答案 1 :(得分:1)
Assert
(粗略地说)是一种检查先决条件的方法; "必须这样才能继续"。在C ++中,您将使用assert
macro或您自己的手动断言系统对其进行编码。
'不溢出'意味着该陈述不应该太大而不适合任何整数类型base
;它是一个乘法,所以很有可能。 C ++中的整数溢出是未定义的行为,因此防范它是明智的!有很多资源可以解释整数溢出,例如this article on Wikipedia
要在C ++中进行检查,一个很简单的方法是将中间结果存储在一个更大的整数类型中,并检查它是否足够小以适应目标类型。例如,如果base
int32_t
使用int64_t
,请检查它是否低于static_cast<int64_t>(std::numeric_limits<int32_t>::max())
:
const int64_t intermediate = (static_cast<int64_t>(modulus) - 1) * (static_cast<int64_t>(modulus) - 1);
assert(intermediate < static_cast<int64_t>(std::numeric_limits<int32_t>::max()));