Как обрабатывать очень большие числа в с++?
я пишу декстопный 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;
}