по модулю — модульное возведение в степень в стеке переполнения

Что-то не так в моем коде для модульного возведения в степень, и я не могу определить проблему, несмотря на то, что написал три раза при использовании двух разных источников псевдокода. Я читал другие вопросы о модульном возведении в степень в C ++ на SE, но это не помогло мне.
Вот мой последний код, написанный более простым, но менее оптимальным способом:

#include<iostream>
using namespace std;

// base ^ exponent mod modulus
unsigned mulmod1(unsigned base, unsigned exponent, unsigned modulus) {
int result = 1;
while(exponent > 0){
if(exponent % 2 == 1)
result = (result * base) % modulus;
exponent >>= 1;
base = (base * base) % modulus;
}
return result;
}

int main(){

//9688563^45896 mod 71 = 30
//12^53 mod 7 = 3

cout<<mulmod1(9688563,45896 ,71)<<"\n";   //gives 10 instead of 30
cout<<mulmod1(12,53,7)<<"\n";             //gives correct answer 3

return 0;
}

0

Решение

Санитаризировать входы в вашу функцию mulmod1! unsigned не может держать 9688563*9688563,
Если вы делаете это правильно, вам «нужен только» тип данных, который может содержать modulus * modulus (и ваши входные числа, конечно) для правильного выполнения модульного возведения в степень.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector