The gmp_int back-end is
used via the typedef boost::multiprecision::mpz_int.
It acts as a thin wrapper around the GMPmpz_t to provide an integer
type that is a drop-in replacement for the native C++ integer types, but
with unlimited precision.

As well as the usual conversions from arithmetic and string types, type
mpz_int is copy constructible
and assignable from:

Formatted IO for this type does not support octal or hexadecimal notation
for negative values, as a result performing formatted output on this
type when the argument is negative and either of the flags std::ios_base::oct or std::ios_base::hex
are set, will result in a std::runtime_error
will be thrown.

Conversion from a string results in a std::runtime_error
being thrown if the string can not be interpreted as a valid integer.

Division by zero results in a std::overflow_error
being thrown.

Although this type is a wrapper around GMP
it will work equally well with MPIR.
Indeed use of MPIR is recommended
on Win32.

This backend supports rvalue-references and is move-aware, making instantiations
of number on this backend
move aware.