Я получил этот код, написанный на JavaScript, но он возвращает неправильное число для больших входных данных.
Он должен вычислять основание в степени экспоненты (ex) по модулю (mo).
Я написал эквивалентный код на C и работает. Пожалуйста, может кто-нибудь сказать мне, что не так.
Попробуйте проверить теорему Ферма по модулю 10^9 +7.
function powFun(base, ex, mo) {
var r;
if(ex === 0)
return 1;
else if(ex % 2 === 0) {
r = powFun(base, ex/2, mo) % mo ;
return (r * r) % mo;
}else
return (base * powFun(base, ex - 1, mo)) % mo;
}
(r+r)%m
без переполнения, еслиr
является 52-битным числом, но для вычисления(r*r)%m
вы получите переполнение перед тем, как взять модуль, еслиr
является 27-битным числом. - person r3mainer   schedule 04.06.201553/2
потому что операции умножения в двоичном формате приводят к удвоению количества битов входных данных. Таким образом, единственными безопасными входными данными являются53/2
биты. - person slebetman   schedule 04.06.2015