на какой-то непонятный, который потом несовместим с cpp_int? В доке и в гугле об этом ничего нет, по крайней мере я не нашел. Бьюсь с этим уже кучу времени
Полный код:
https://pastebin.com/0KtZUi8t
https://www.boost.org/doc/libs/1_69_0/boost/multiprecision/integer.hpp там тип это первый
Функция ничего не меняет, она возвращает какой-то типа данных, значение его
Я имел в виду, что логично, если у меня каждый из трех аргументов cpp_int, то значение степени по модулю тоже будет cpp_int
Степень растет быстро, поэтому логично возвращать тип, который может содержать большие значения, не ограниченные вообще, желательно
template <class I1, class I2, class I3> typename enable_if_c<is_integral<I1>::value && is_unsigned<I2>::value && is_integral<I3>::value, I1>::type powm(const I1& a, I2 b, I3 c) { typedef typename detail::double_integer<I1>::type double_type; I1 x(1), y(a); double_type result; while(b > 0) { if(b & 1) { multiply(result, x, y); x = integer_modulus(result, c); } multiply(result, y, y); y = integer_modulus(result, c); b >>= 1; } return x % c; } template <class I1, class I2, class I3> inline typename enable_if_c<is_integral<I1>::value && is_signed<I2>::value && is_integral<I3>::value, I1>::type powm(const I1& a, I2 b, I3 c) { if(b < 0) { BOOST_THROW_EXCEPTION(std::runtime_error("powm requires a positive exponent.")); } return powm(a, static_cast<typename make_unsigned<I2>::type>(b), c); }
cpp_int не ограничено вообще и степень тут не растет быстро, потому что тут возведение по модулю
а там expression templates
Насколько я понимаю, эта реализация для беззнаковых, но я не указывал, что у меня cpp_int может быть беззнаковым (хотя это так)
А что за тип OpenKey ?
struct OpenKey { cpp_int p; cpp_int q; cpp_int g; cpp_int y; };
Да блин чё с тобой, парень? как так может быть?
Делай репро-пример, и присылай. Иначе не разобраться будет
В исходном сообщении ссылка на полный код https://t.me/supapro/757592
Или я не так понял вопрос?
нет, так , я просто пропустил это...
https://godbolt.org/z/Gn6qbr
Обсуждают сегодня