88 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
90 if constexpr (std::is_signed_v<T>) { mpz_init_set_si(
m_val, i); }
91 else { mpz_init_set_ui(
m_val, i); }
97 integer(
const std::string& s)
noexcept { mpz_init_set_str(
m_val, s.c_str(), 10); }
109 i.m_val->_mp_alloc = 0;
110 i.m_val->_mp_size = 0;
111 i.m_val->_mp_d =
nullptr;
112 i.m_initialized =
false;
129 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
132 if constexpr (std::is_signed_v<T>) { mpz_set_si(
m_val, i); }
133 else { mpz_set_ui(
m_val, i); }
143 mpz_set(
m_val, i.m_val);
152 mpz_set_str(
m_val, s.c_str(), 10);
165 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
191 i.m_val->_mp_alloc = 0;
192 i.m_val->_mp_size = 0;
193 i.m_val->_mp_d =
nullptr;
194 i.m_initialized =
false;
206 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
209 (std::is_signed_v<T> ? mpz_cmp_si(
m_val,i) : mpz_cmp_ui(
m_val,i)) == 0;
217 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
226 {
return mpz_cmp(
m_val, i.m_val) == 0; }
234 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
236 {
return not (*
this == i); }
243 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
252 {
return not (*
this == i); }
260 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
263 (std::is_signed_v<T> ? mpz_cmp_si(
m_val, i) : mpz_cmp_ui(
m_val, i)) < 0;
271 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
280 {
return mpz_cmp(
m_val, i.m_val) < 0; }
288 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
291 (std::is_signed_v<T> ? mpz_cmp_si(
m_val, i) : mpz_cmp_ui(
m_val, i)) <= 0;
299 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
308 {
return mpz_cmp(
m_val, i.m_val) <= 0; }
316 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
319 (std::is_signed_v<T> ? mpz_cmp_si(
m_val, i) : mpz_cmp_ui(
m_val, i)) > 0;
327 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
336 {
return mpz_cmp(
m_val, i.m_val) > 0; }
344 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
347 (std::is_signed_v<T> ? mpz_cmp_si(
m_val, i) : mpz_cmp_ui(
m_val, i)) >= 0;
355 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
364 {
return mpz_cmp(
m_val, i.m_val) >= 0; }
374 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
376 {
integer a(*
this); a += i;
return a; }
383 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
392 {
integer a(*
this); a += i;
return a; }
397 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
399 if constexpr (not std::is_signed_v<T>) { mpz_add_ui(
m_val,
m_val, i); }
401 if (i > 0) {mpz_add_ui(
m_val,
m_val,
static_cast<uint64_t
>(i)); }
402 else { mpz_sub_ui(
m_val,
m_val,
static_cast<uint64_t
>(-i));}
411 { mpz_add(
m_val,
m_val, i.m_val);
return *
this; }
422 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
424 {
integer a(*
this); a -= i;
return a; }
431 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
440 {
integer a(*
this); a -= i;
return a; }
445 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
447 if constexpr (not std::is_signed_v<T>) { mpz_sub_ui(
m_val,
m_val, i); }
449 if (i > 0) {mpz_sub_ui(
m_val,
m_val,
static_cast<uint64_t
>(i)); }
450 else { mpz_add_ui(
m_val,
m_val,
static_cast<uint64_t
>(-i));}
459 { mpz_sub(
m_val,
m_val, i.m_val);
return *
this; }
467 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
469 {
integer a(*
this); a *= i;
return a; }
476 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
486 {
integer a(*
this); a *= i;
return a; }
491 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
493 if constexpr (std::is_signed_v<T>) { mpz_mul_si(
m_val,
m_val, i); }
502 { mpz_mul(
m_val,
m_val, i.m_val);
return *
this; }
510 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
512 {
integer a(*
this); a /= i;
return a; }
519 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
521 {
return i/ii.to_int(); }
528 {
integer a(*
this); a /= i;
return a; }
533 template <
typename T,std::enable_if_t<std::is_
integral_v<T>,
bool> = true>
535 if constexpr (not std::is_signed_v<T>) {
539 mpz_fdiv_q_ui(
m_val,
m_val,
static_cast<uint64_t
>(i<0 ? -i : i));
549 { mpz_div(
m_val,
m_val, i.m_val);
return *
this; }
573 { mpz_pow_ui(
m_val,
m_val, i);
return *
this; }
591 const uint64_t m = mpz_mod_ui(r,
m_val, i);
638 buf = mpz_get_str(buf, 10,
m_val);
639 s = std::string(buf);
Arbitrary precision integer.
Definition: integer.hpp:60
int64_t to_int() const noexcept
Converts this integer to a signed 64-bit integer.
Definition: integer.hpp:620
void swap(integer &i) noexcept
Swaps the value of this integer with integer i's value.
Definition: integer.hpp:656
integer(T i) noexcept
Constructor with unsigned integer value.
Definition: integer.hpp:89
int64_t get_sign() const noexcept
Returns the sign of this integer.
Definition: integer.hpp:610
integer & operator=(T i) noexcept
Assignment operator.
Definition: integer.hpp:166
void set_number(T i) noexcept
Overwrites the value of this integer with i.
Definition: integer.hpp:130
integer & operator*=(T i) noexcept
Product operator.
Definition: integer.hpp:492
void as_string(std::string &s) const noexcept
Converts this integer to a string.
Definition: integer.hpp:636
friend bool operator!=(T i, const integer &ii) noexcept
Non-equality operator.
Definition: integer.hpp:244
integer & operator-=(T i) noexcept
Substraction operator.
Definition: integer.hpp:446
friend bool operator<=(T i, const integer &ii) noexcept
Less than or equal to operator.
Definition: integer.hpp:300
integer operator-() const noexcept
Minus unary operator. Returns a new object of type 'integer'.
Definition: integer.hpp:416
friend integer operator+(T i, const integer &ii) noexcept
Addition operator.
Definition: integer.hpp:384
integer() noexcept
Empty constructor.
Definition: integer.hpp:67
integer(const std::string &s) noexcept
Constructor with string.
Definition: integer.hpp:97
integer & powt(const integer &i) noexcept
Exponentiation operator.
integer(const integer &i) noexcept
Copy constructor.
Definition: integer.hpp:119
friend int64_t operator/(T i, const integer &ii) noexcept
Division operator.
Definition: integer.hpp:520
friend void swap(integer &i, integer &j) noexcept
Swaps two integers.
Definition: integer.hpp:664
friend bool operator>=(T i, const integer &ii) noexcept
Greater than or equal to operator.
Definition: integer.hpp:356
void set_str(const std::string &s) noexcept
Overwrites the value of this integer with s.
Definition: integer.hpp:150
uint64_t operator%(uint64_t i) const noexcept
Modulus operator.
Definition: integer.hpp:588
mpz_t m_val
Structure from GMP storing the integer's value.
Definition: integer.hpp:671
uint64_t to_uint() const noexcept
Converts this integer to an unsigned 64-bit integer.
Definition: integer.hpp:622
friend bool operator>(T i, const integer &ii) noexcept
Greater than operator.
Definition: integer.hpp:328
integer(mpz_t &&raw) noexcept
Constructor with mpz_t.
Definition: integer.hpp:73
bool m_initialized
Is this integer initialised?
Definition: integer.hpp:673
std::string to_string() const noexcept
Converts this integer to a string.
Definition: integer.hpp:627
integer power(uint64_t i) const noexcept
Exponentiation operator.
Definition: integer.hpp:557
friend bool operator<(T i, const integer &ii) noexcept
Less operator.
Definition: integer.hpp:272
integer(integer &&i) noexcept
Move constructor.
Definition: integer.hpp:104
integer & powt(uint64_t i) noexcept
Exponentiation operator.
Definition: integer.hpp:572
integer power(const integer &i) const noexcept
Exponentiation operator.
Definition: integer.hpp:563
std::size_t bytes() const noexcept
Returns the amount of bytes this integer occupies.
void set_integer(const integer &i) noexcept
Overwrites the value of this integer with i.
Definition: integer.hpp:141
integer & operator/=(T i) noexcept
Division operator.
Definition: integer.hpp:534
~integer() noexcept
Destructor.
Definition: integer.hpp:121
friend integer operator*(T i, const integer &ii) noexcept
Product operator.
Definition: integer.hpp:477
double to_double() const noexcept
Converts this integer to a double-precision floating-point value.
Definition: integer.hpp:624
const mpz_t & get_raw_value() const noexcept
Returns the underlying gmp data structure.
Definition: integer.hpp:615
friend bool operator==(T i, const integer &ii) noexcept
Equality operator.
Definition: integer.hpp:218
integer & operator+=(T i) noexcept
Addition operator.
Definition: integer.hpp:398
constexpr bool is_initialized() const noexcept
Returns whether this object is initialised or not.
Definition: integer.hpp:608
Exact rational number.
Definition: rational.hpp:63
Main namespace of the library.
Definition: basic_types.hpp:50