Остаток от деления большого числа - Turbo Pascal
Формулировка задачи:
Здравствуйте!
Есть проблема при вычислении остатка от деления.
Нужно вычислить a^b mod t
При этом, например a=226 b=91 t=3827
Были поптытки вычислить сначала a^b, потом от результата mod t. Но a^b не влазит ни в один тип данных. Подскажите пожалуйста, как мне посчитать этот остаток.
Решение задачи: «Остаток от деления большого числа»
textual
Листинг программы
long a = 1000;
long b = 1000000000;
//В начале C присваиваем 1.
long C = 1;
while (b > 1) {
if (b % 2 == 0) {
//Если степень четная, уменьшаем её в два раза
b /= 2;
//при этом возводим в квадрат основание, делим по модулю
a = (a*a) % t;
} else {
//иначе уменьшаем показатель на единицу
b -= 1;
//увеличиваем коэффициент перед степенью, делим по модулю
C = (C*a) % t;
}
}
//теперь показатель степени равен 1
//значит можно найти по такой формуле
cout << ((C*a) % t);
Объяснение кода листинга программы
- Переменная
aинициализируется значением 1000. - Переменная
bинициализируется значением 1000000000. - Переменная
Cинициализируется значением 1. - Запускается цикл
while, который будет выполняться до тех пор, покаbбольше 1. - В условии цикла проверяется, является ли
bчетным числом. - Если
bчетное, то оно делится на 2, возводится в квадрат и результат делится по модулю наt. Значение, полученное по модулю, присваивается переменнойa. - Если
bнечетное, то из него вычитается 1, коэффициент перед степенью увеличивается на 1 и результат делится по модулю наt. Значение, полученное по модулю, присваивается переменнойC. - По завершении цикла значение переменной
Cбудет равно 1. - Выводится значение переменной
Cс помощью функцииcout. Результат будет равен(C*a)%t.