Division is undefined if the divisor is zero. Passing a zero divisor to the
division or modulo functions (including the modular powering functions
mpz_powm_ui), will cause an intentional division by
zero. This lets a program handle arithmetic exceptions in these functions the
same way as for normal C
Divide n by d, forming a quotient q and/or remainder
r. For the
2exp functions, d=2^b.
The rounding is in three styles, each suiting different applications.
cdivrounds q up towards +infinity, and r will have the opposite sign to d. The
cstands for “ceil”.
fdivrounds q down towards -infinity, and r will have the same sign as d. The
fstands for “floor”.
tdivrounds q towards zero, and r will have the same sign as n. The
tstands for “truncate”.
In all cases q and r will satisfy n=q*d+r, and r will satisfy 0<=abs(r)<abs(d).
q functions calculate only the quotient, the
only the remainder, and the
qr functions calculate both. Note that for
qr the same variable cannot be passed for both q and r, or
results will be unpredictable.
ui variants the return value is the remainder, and in fact
returning the remainder is all the
div_ui functions do. For
cdiv the remainder can be negative, so for those the
return value is the absolute value of the remainder.
2exp variants the divisor is 2^b. These
functions are implemented as right shifts and bit masks, but of course they
round the same as the other functions.
For positive n both
are simple bitwise right shifts. For negative n,
is effectively an arithmetic right shift treating n as twos complement
the same as the bitwise logical functions do, whereas
effectively treats n as sign and magnitude.
Set r to n
mod d. The sign of the divisor is
ignored; the result is always non-negative.
mpz_mod_ui is identical to
mpz_fdiv_r_ui above, returning the
remainder as well as setting r. See
mpz_fdiv_ui above if only
the return value is wanted.
Set q to n/d. These functions produce correct results only when it is known in advance that d divides n.
These routines are much faster than the other division functions, and are the best choice when exact division is known to occur, for example reducing a rational to lowest terms.
Return non-zero if n is exactly divisible by d, or in the case of
mpz_divisible_2exp_p by 2^b.
n is divisible by d if there exists an integer q satisfying n = q*d. Unlike the other division functions, d=0 is accepted and following the rule it can be seen that only 0 is considered divisible by 0.
Return non-zero if n is congruent to c modulo d, or in the
mpz_congruent_2exp_p modulo 2^b.
n is congruent to c mod d if there exists an integer q satisfying n = c + q*d. Unlike the other division functions, d=0 is accepted and following the rule it can be seen that n and c are considered congruent mod 0 only when exactly equal.