Как обрабатывать очень большие числа в с++?

я пишу декстопный Qt шифровальщик с алгоритмом RSA, и на каком то из этапов мне приходится одно число возвести в степень второго, после чего происходит переполнение (лонг инт не спасает, значение растёт до неадекватных размером), после чего вылетает арифметик error. Как быть?


Ответы (1 шт):

Автор решения: Harry

Думаю, вы работаете реально с не очень большими числами, раз проблема только в одном месте. А раз вам нужен результат по модулю — ну, взгляните на такой код, может, поможет?

//// Быстрое возведение в степень по модулю p (x^e mod p)
template<typename T, typename U, typename P,
         typename = std::enable_if_t<std::is_integral<T>::value &&
                                     std::is_unsigned<P>::value &&
                                     std::is_unsigned<U>::value>
        >
T iqpow(T x, U e, P p)
{
    T res = static_cast<T>(1);
    x %= p;
    for(;e;e>>=1)
    {
        if (e&1) res = (res*x)%p;
        x = (x*x)%p;
    }
    return res;
}

или с концептами

//// Быстрое возведение в степень по модулю p (x^e mod p)
template<integral T, unsigned_integral U, unsigned_integral P>
T iqpow(T x, U e, P p)
{
    T res = static_cast<T>(1);
    x %= p;
    for(;e;e>>=1)
    {
        if (e&1) res = (res*x)%p;
        x = (x*x)%p;
    }
    return res;
}
→ Ссылка