Я пытаюсь реализовать 64-битное шифрование RSA в качестве случайного эксперимента.
В процессе шифрования мы выполняем модульное возведение в степень. Звучало прямолинейно, поэтому я сделал это следующим образом:
result = (result * msg) % mod; //Repeat exponent number of times
К сожалению, это занимает смехотворно много времени.
Как быстрее выполнить эту операцию?
РЕДАКТИРОВАТЬ:
Я удалил этот вопрос, потому что на него не было ответов, и теперь я понимаю, что это был неразумный шаг. В любом случае, мне удалось найти решение, и вот быстрая реализация модульного возведения в степень с C++:
include <cstdint>
uint64_t modular_mul(uint64_t a, uint64_t b, uint64_t mod) {
uint64_t result = 0;
for (uint64_t current_term = a; b; b >>= 1) {
if (b & 1) {
result = (result + current_term) % mod;
}
current_term = 2 * current_term % mod;
}
return result;
}
uint64_t modular_pow(uint64_t base, uint64_t exp, uint64_t mod) {
uint64_t result = 1;
for (uint64_t current_factor = base; exp; exp >>= 1) {
if (exp & 1) {
result = modular_mul(result, current_factor, mod);
}
current_factor = modular_mul(current_factor, current_factor, mod);
}
return result;
}
Я получил это решение от пользователя, который ответил на мой вопрос здесь - это просто то же самое вопрос, но переспросил, лол.
O(log(exponent))
времени вместоO(exponent)
. - person cigien   schedule 19.08.2020