BigNum template class with long arithmetic operations and algorithms. Only positive numbers are supported.
file
description
bignum.h
template class, uses c++11 standard
bignum_tests.cpp
tests and usage examples, compile it by mkdir build; make
typedef
description
len_type
type of bignumber length (count of digits)
digit_type
type of digit < BASE
operation_type
type of BASE and for intermediate operations with carry, (BASE)^2-1 must fit in it
dec_len_type
type of count of decimal digits in decimal representation of bignumber
dec_digit_type
type of decimal digit (0-9)
pow_exp_type
type which can store log(BASE)/log(10)
define
description
LEN_TYPE_MAX
maximum value of variable of type len_type
DIGIT_TYPE_MAX
maximum value of variable of type digit_type
DEC_LEN_TYPE_MAX
maximum value of variable of type dec_len_type
LEN_TYPE_MAX_MASK
most significant bit mask for len_type
parameter
description
optional
BASE
long arithmetic base
MAX_LEN
maximal bignumber length (count of digits)
IS_BASE_DECIMAL
whether BASE is power of 10
optional, will be calculated at compile-time if omitted
MAX_DECIMAL_LEN
maximal count of decimal digits in decimal representation of bignumber
optional, will be calculated at compile-time if omitted
BASE_DECIMAL_LEN
if BASE is power of 10 then BASE_DECIMAL_LEN is the exponent of this power i.e. length of decimal representation of BASE, else it must be 0
optional, will be calculated at compile-time if omitted
Operations, operators and other methods
name
description
limitations
BigNum, =
constructors and assign operators from basic integer or other bignum
value
get basic integer value
bignum value must fit in basic integer type
fprintd, printd
print decimal representation
<, <=, >, >=, ==, !=
comparison with basic integer or other bignum
+, +=
addition with basic integer or other bignum
sum must fit in bignum
-, -=
subtraction of basic integer or other bignum
minuend >= subtrahend
*, *=
multiplication with basic integer or other bignum
product must fit in bignum
div, /, /=, %, %=
division with remainder by basic integer or other bignum (long division)
divisor is not zero
div2, div2_assign, is_even, is_odd
division by 2 and parity
pow, pow_assign
fast exponentiation by squaring
power must fit in bignum
min, min, swap
min, max and swap utility methods
name
description
limitations
square_root
finds floor(sqrt(n))
bignumber length <= MAX_LEN-1
extended_binary_euclidean
extended euclidean algorithm implemented by binary GCD algorithm
for now works only for not both even numbers
linear_diophantine
solves diophantine equation a*x - b*y = c
for now works only for not both even a and b