Все операции non-member integer перегружены для встроенных в целые типы в <boost/multiprecision/integer.hpp>
. Если эти операции требуют временного повышения точности (например, для Powm), то, если нет встроенного типа, будет использоваться cpp_int соответствующей точности.
Некоторые из этих функций являются тривиальными, другие используют внутренние компоненты компилятора (если таковые имеются) для обеспечения оптимальной оценки.
Перегруженными функциями являются:
template <class Integer, class I2>
Integer& multiply(Integer& result, const I2& a, const I2& b);
Умножает два значения I2
, чтобы получить более широкий результат Integer
.
Возвращает результат = a * b
без перелива или потери точности в умножении.
template <class Integer, class I2>
Integer& add(Integer& result, const I2& a, const I2& b);
Добавляет два значения I2
, чтобы получить более широкий результат Integer
.
Возвращает результат = a + b
без перелива или потери точности в дополнении.
template <class Integer, class I2>
Integer& subtract(Integer& result, const I2& a, const I2& b);
Вычитает два значения I2
, чтобы получить более широкий результат Integer
.
Возвращает результат = a - b
без перелива или потери точности в вычитании.
template <class Integer>
Integer powm(const Integer& b, const Integer& p, const Integer& m);
Возвращает bp % m.
template <class Integer>
void divide_qr(const Integer& x, const Integer& y, Integer& q, Integer& r);
Наборы q = x / y
и r =%y
.
template <class Integer1, class Integer2>
Integer2 integer_modulus(const Integer1& x, Integer2 val);
Возврат x % val;
template <class Integer>
unsigned lsb(const Integer& x);
Возвращает (нулевой) индекс наименее значимого бита x
.
Выбрасывает std::domain_error
, если x <= 0
.
template <class Integer>
unsigned msb(const Integer& x);
Возвращает (нулевой) индекс наименее значимого бита x
.
Выбрасывает std::domain_error
, если x <= 0
.
template <class Integer>
bool bit_test(const Integer& val, unsigned index);
Возвращает истинное
, если бит индекс
установлен в вал
.
template <class Integer>
Integer& bit_set(Integer& val, unsigned index);
Устанавливает бит index
в val
.
template <class Integer>
Integer& bit_unset(Integer& val, unsigned index);
Отключает бит index
в val
.
template <class Integer>
Integer& bit_flip(Integer& val, unsigned index);
Переверните бит index
в val
.
template <class Integer>
Integer sqrt(const Integer& x);
template <class Integer>
Integer sqrt(const Integer& x, Integer& r);
Возвращает целочисленный квадратный корень s
x и устанавливает r
на остаток x - s2.
template <class Engine>
bool miller_rabin_test(const number-or-expression-template-type& n, unsigned trials, Engine& gen);
bool miller_rabin_test(const number-or-expression-template-type& n, unsigned trials);
Обычные функции Миллера-Рабина в <boost/multiprecision/miller_rabin.hpp>
определены с точки зрения вышеупомянутых общих операций, и поэтому одинаково хорошо функционируют для встроенных и многоточных типов.