Я нашел алгоритм для умножения в 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++?
, если я правильно понимаю, что вы пытаетесь сказать, что строка кода означает, что (модуль-1)^2 должно быть меньше 2^31 (для подписанного int). Это правильно? – codiac
По существу да. Вам нужно посмотреть ограничения переполнения для типа данных, которые вы используете, а затем проверить, что вы не превысите их. –