Basic Arithmetic Operators for Large Integers ("bigz")
Addition, substraction, multiplication, (integer) division, remainder of division, multiplicative inverse, power and logarithm functions.
add.bigz(e1, e2) sub.bigz(e1, e2 = NULL) mul.bigz(e1, e2) div.bigz(e1, e2) divq.bigz(e1,e2) ## == e1 %/% e2 mod.bigz(e1, e2) ## == e1 %% e2 ## S3 method for class 'bigz' abs(x) inv.bigz(a, b,...)## == (1 / a) (modulo b) pow.bigz(e1, e2,...)## == e1 ^ e2 ## S3 method for class 'bigz' log(x, base=exp(1)) ## S3 method for class 'bigz' log2(x) ## S3 method for class 'bigz' log10(x)
x |
bigz, integer or string from an integer |
e1, e2, a,b |
bigz, integer or string from an integer |
base |
base of the logarithm; base e as default |
... |
Additional parameters |
Operators can be used directly when objects are of class bigz: a + b, log(a), etc.
For details about the internal modulus state, and the rules
applied for arithmetic operations on big integers with a modulus,
see the bigz
help page.
a / b
= div(a,b)
returns a rational number
unless the operands have a (matching) modulus where
a * b^-1
results.
a %/% b
(or, equivalently, divq(a,b)
) returns the
quotient of simple integer division (with truncation towards zero),
possibly re-adding a modulus at the end (but not using a
modulus like in a / b
).
r <- inv.bigz(a, m)
, the multiplicative inverse of
a
modulo m, corresponds to 1/a
or a ^-1
from above when a
has modulus m
. Note that
a not always has an inverse modulo m, in which case
r
will be NA
with a warning that can be turned
off via
options("gmp:warnNoInv" = FALSE)
.
Apart from /
(or div
), where rational numbers
(bigq
) may result, these functions return an object of
class "bigz"
, representing the result of the arithmetic
operation.
Immanuel Scholz and Antoine Lucas
The GNU MP Library, see https://gmplib.org
# 1+1=2 as.bigz(1) + 1 as.bigz(2)^10 as.bigz(2)^200 # if my.large.num.string is set to a number, this returns the least byte (my.large.num.string <- paste(sample(0:9, 200, replace=TRUE), collapse="")) mod.bigz(as.bigz(my.large.num.string), "0xff") # power exponents can be up to MAX_INT in size, or unlimited if a # bigz's modulus is set. pow.bigz(10,10000) ## Modulo 11, 7 and 8 are inverses : as.bigz(7, mod = 11) * 8 ## ==> 1 (mod 11) inv.bigz(7, 11)## hence, 8 a <- 1:10 (i.a <- inv.bigz(a, 11)) d <- as.bigz(7) a %/% d # = divq(a, d) a %% d # = mod.bigz (a, d) (ii <- inv.bigz(1:10, 16)) ## with 5 warnings (one for each NA) op <- options("gmp:warnNoInv" = FALSE) i2 <- inv.bigz(1:10, 16) # no warnings (i3 <- 1 / as.bigz(1:10, 16)) i4 <- as.bigz(1:10, 16) ^ -1 stopifnot(identical(ii, i2), identical(as.bigz(i2, 16), i3), identical(i3, i4)) options(op)# revert previous options' settings stopifnot(inv.bigz(7, 11) == 8, all(as.bigz(i.a, 11) * a == 1), identical(a %/% d, divq.bigz(1:10, 7)), identical(a %% d, mod.bigz (a, d)) )
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.