308 в степени 611 mod 899

213
29 декабря 2018, 05:50

Как вычислить значение настолько "большого" выражения, как 308^611 (mod 899).
Просто делаю алгоритм RSA на C++. Возможно, решение в mod n, но я не понимаю? как это сделать.

Answer 1

Просто выполняете умножения по модулю, а для возведения в степень используете быстрое возведение в степень.

Рассмотрим ваш случай.

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;
}
READ ALSO
Вызвать функцию в разных потоках C++

Вызвать функцию в разных потоках C++

Можно ли выполнять разные участки кода одной функции в разных потоках? Например:

252
C++: проверка строки

C++: проверка строки

Функция check() почему-то не работает, при вводе "Start" она все равно выводит сообщение о том, что "Команда введена не верно!" Не могу понять, где...

187
Почему атрибут не добавляется в модель?

Почему атрибут не добавляется в модель?

Не судите строго, ошибка в какой-то мелочи наверноеЕсть view

171