Как вычислить значение настолько "большого" выражения, как 308^611 (mod 899).
Просто делаю алгоритм RSA на C++. Возможно, решение в mod n
, но я не понимаю? как это сделать.
Просто выполняете умножения по модулю, а для возведения в степень используете быстрое возведение в степень.
Рассмотрим ваш случай.
689 = 1010110001
Значит, 308 в 689 степени считается так (все действия по модулю 899).
308^2 = 469
308^4 = 469^2 = 605
308^8 = 605*605 = 132
308^16 = 132*132 = 343
16 степень соответствует второй справа единице в бинарном представлении, так что теперь множим 343 на 308 и получаем 461 - это 308 в 17 степени по модулю 899.
Дальше получаем 308^32, перемножая 343*343, умножаем на наше 461... Ну, и так далее. Идея понятна?
Примерно так это выглядит на C++:
unsigned long long iqpow(unsigned long long x,
unsigned long long e,
unsigned long long p)
{
unsigned long long res = 1;
for(x %= p;e;e>>=1)
{
if (e&1) res = (res*x)%p;
x = (x*x)%p;
}
return res;
}
int main()
{
cout << iqpow(308,611,899) << endl;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Можно ли выполнять разные участки кода одной функции в разных потоках? Например:
Функция check() почему-то не работает, при вводе "Start" она все равно выводит сообщение о том, что "Команда введена не верно!" Не могу понять, где...
Не судите строго, ошибка в какой-то мелочи наверноеЕсть view