Portable multiple-precision library in C++
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Kanooth Numbers

A portable multiple-precision library in C++. The data types natural_number and integer are available and represent non-negative integers and integers, respectively.

No operator overloading is implemented (other than assignment). To this end, the types boost_natnum and boost_integer make natural_number and integer available as backends for the Boost Multiprecision library.


The library is header-only, so no actual installation is needed. Just make sure the kanooth directory is in your include path.



The type natural_number represents a multiple-precision non-negative integer. It is made available by

#include <kanooth/numbers/natural_number.hpp>
using kanooth::numbers::natural_number;

A natural number can be constructed in a couple of ways:

natural_number a = 12u;
natural_number b(123456789lu);
natural_number c = "1856066132809047973900594119949";
natural_number d("103435020496695927794013500393");
natural_number q, r;    // initialized to zero

Note that only unsigned integer literals are compatible with natural_number.

Arithmetic operations are executed by statements such as

r.add(a, b);

meaning that the sum of a and b will be put in r. An unsigned integer can also be used as the second parameter,

r.subtract(r, 12u);

Note that for subtract the result is undefined if the first parameter is smaller than the first.

Any natural_number can be output using the str() method, which will return a std::string:

std::cout << "r = " << r << std::endl;

Other basic arithmetic operations available are examplified here:

r.multiply(r, r);
std::cout << "r^2 = " << r.str() << std::endl;

u.divide(b, a);
v.modulus(b, a);
std::cout << b.str() << " = " << u.str() << " * " << a.str() << " + " << v.str() << std::endl;

The static method natnum::quotrem can combine the divide and modulus operations:

natural_number::quotrem(q, r, b, a);
std::cout << b.str() << " = " << q.str() << " * " << a.str() << " + " << r.str() << std::endl;

This is more efficient than the two seperate calls.

A natural number can be checked for zero-ness using is_zero:

u.subtract(u, u);
std::cout << "u = " << u.str() << " is " << (u.is_zero() ? "zero" : "nonzero") << std::endl;

and compared to another natural number using compare:

std::cout << "q = " << q.str() << " " << (q.compare(r) > 0 ? ">" : "<=")
          << " r = " << r.str() << std::endl;

See examples of natural_number uses in examples/demo_natnum.cpp.